Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • The scenarios are described with the JS7 - Git Repository Interface.
  • CI/CD includes to perform the following steps
    • in a test environment
      • to store scheduling objects of a JOC Cockpit inventory to a local Git repository,
      • to add, to commit and to push changes to the remote Git repository.
    • in a prod environment
      • to copy (cherry-pick) changes from the remote test Git repository to the local remote prod Git repository,
      • to push changes from the local remote prod Git repository to the remote local prod Git repository,
      • to update the JOC Cockpit inventory from the local Git repository,
      • to release and to deploy scheduling objects to Controllers and Agents.

Users who whish to automate the

The following examples assume that a local Git repository is set up in the test and prod environments, see JS7 - How to set up a local Git Repository.

Find the documentation for related cmdlets from PowerShell CLI 2.0 - Cmdlets - Git Repository Integration.

Steps to perform

...

in the TEST Environment

The below example assumes that 

  • a top-level folder Accounting is used in the JOC Cockpit inventory,
  • this folder is mapped to a sub-directory with the same name and spelling in the file system, for example
    • for Unix: /var/sos-berlin.com/js7/joc/jetty_base/resources/joc/repositories/rollout/Accounting
    • for Windows: C:\ProgramData\sos-berlin.com\js7˜\joc\jetty_base\resources\joc\repositories\rollout\Accounting
  • this folder is created when setting up the repository otherwise it will be created by JOC Cockpit the first time that objects should be stored to the repository.

...

Code Block
languagepowershell
titleExample how to store changes to a local Git repository
linenumberstrue
Import-Module JS7
Connect-JS7 -Url http://root:root@test-host:4446 -Id 'Controller' | Out-Null

# Cleanup local repository by removing existing objects
Remove-JS7RepositoryItem -Folder '/Accounting'

# Store scheduling objects of the given folder and exclude draft versions to be used
Set-JS7RepositoryItem -Folder '/Accounting' -Recursive -NoDraft

Explanation:

...

Code Block
languagepowershell
titleExample how to commit and push changes to a remote repository
linenumberstrue
# Find the repository sub-directory managed by JOC Cockpit
cd /var/sos-berlin.com/js7/joc/jetty_base/resources/joc/repositories/rollout/Accounting

# CommitImport-Module JS7
Connect-JS7 -Url http://root:root@test-host:4446 -Id 'Controller' | Out-Null

# Add, commit and push changes to the remote Git repository
git add .
git commit -m "changes to accounting jobs for v12.3"
git pushInvoke-JS7GitRepositoryAdd -Folder '/Accounting'
Invoke-JS7GitRepositoryCommit -Folder '/Accounting' -Message 'changes for release v1.13'
Invoke-JS7GitRepositoryPush -Folder '/Accounting'

Example of a CI/CD Pipeline Script for TEST Environment

...

Code Block
languagepowershell
titleExample CI/CD pipeline script for test environment
linenumberstrue
collapsetrue
# --- Parameterization ---

$url = 'http://root:root@localhostroot@test-host:4446'
$controllerId = 'Controller'

$folder = '/TestRepo/testMyFolder'
$directory = 'C:\ProgramData\sos-berlin.com\js7\joc\jetty_base\resources\joc\repositories\rollout\TestRepoAccounting'


# --- Connection ---

Import-Module JS7
Connect-JS7 -Url $url -Id $controllerId | Out-Null


# --- Step 1: Check status of releasable and deployable objects ---

$items = Get-JS7ReleasableItem -Folder $folder -NoReleased
if ( $items.count )
{
    Write-Warning "CI/CD pipeline stopped: unreleased objects found:"
    foreach( $item in $items )
    {
        Write-Warning "unreleased object: type=$($item.objectType), valid=$($item.valid), folder=$($item.folder), name=$($item.objectName)"
    }

    # optionally release items
    $items | Publish-JS7ReleasableItem
}

$items = Get-JS7DeployableItem -Folder $folder -NoDeployed
if ( $items.count )
{
    Write-Warning "CI/CD pipeline stopped: undeployed objects found:"
    foreach( $item in $items )
    {
        Write-Warning "undeployed object: type=$($item.objectType), valid=$($item.valid), folder=$($item.folder), name=$($item.objectName)"
    }

    # optionally deploy items
    $items | Publish-JS7DeployableItem -ControllerId $controllerId
}


# --- Step 2: Cleanup repository and store scheduling objects to repository ---

# Cleanup local repository by removing existing objects
Remove-JS7RepositoryItem -Folder $folder
 
# Store scheduling objects of the given folder and exclude draft versions to be used
Set-JS7RepositoryItem -Folder $folder -Recursive -NoDraft


# --- Step 3: add objects, commit and push to remote repository ---

cd $directory

git add .
git commit -m "Invoke-JS7GitRepositoryAdd -Folder $folder
Invoke-JS7GitRepositoryCommit -Folder $folder -Message 'changes to accounting jobs for v12.3"
git push'
Invoke-JS7GitRepositoryPush -Folder $folder


# --- Connection ---

Disconnect-JS7

Steps to perform

...

in the PROD Environment

Copy Changes from TEST to PROD Git Repository

...

Code Block
languagepowershell
titleExample how to pull changes to a local Git repository
linenumberstrue
# Find the repository sub-directory managed by JOC Cockpit
cd /var/sos-berlin.com/js7/joc/jetty_base/resources/joc/repositories/rollout/AccountingImport-Module JS7
Connect-JS7 -Url http://root:root@prod-host:4446 -Id 'Controller' | Out-Null

# Pull changes
git pull from remote Git repository
Invoke-JS7GitRepositoryPull -Folder '/Accounting'

Update JOC Cockpit Inventory from local Git Repository, Release and Deploy to Controller

...

Code Block
languagepowershell
titleExample how to store changes to a local Git repository
linenumberstrue
Import-Module JS7
Connect-JS7 -Url http://root:root@prod-host:4446 -Id 'Controller' | Out-Null

# Update the JOC Cockpit inventory from the local repository of the given folder
Update-JS7FromRepositoryItem -Folder '/Accounting'

# Release scheduling objects of the given folder
Publish-JS7ReleasableItem -Folder '/Accounting' -Recursive -NoReleased

# Deploy scheduling objects from the given folder to the Controller
Publish-JS7DeployableItem -ControllerId 'Controller' -Folder '/Accounting' -Recursive -NoDeployed

Explanation:

...

Code Block
languagepowershell
titleExample CI/CD pipeline script for prod environment
linenumberstrue
collapsetrue
# --- Parameterization ---

$url = 'http://root:root@localhostroot@prod-host:4446'
$controllerId = 'Controller'

$folder = '/TestRepo/testMyFolder'
$directory = 'C:\ProgramData\sos-berlin.com\js7\joc\jetty_base\resources\joc\repositories\rollout\TestRepoAccounting'

$repo = 'git@github.com:sos-berlin/js7-demo-inventory-rollout-test.git'
$commitHash = '04b07d8'


# --- Connection ---

Import-Module JS7
Connect-JS7 -Url $url -Id $controllerId | Out-Null


# --- Step 1: Cherry-pick changes from remote test repository to remote prod repository ---

cd $directory
# navigate to local repository folder on prod host
cd C:\ProgramData\sos-berlin.com\js7\joc\jetty_base\resources\joc\repositories\rollout\Accounting

# add the test repo as a remote repository
git remote add oldrepo $repo
 
# get the test repo commits
git remote update
 
# examine the whole tree
git log --all --oneline --graph --decorate
 
# copy/cherry-pick the commits from the test repo into your local prod repo
git cherry-pick $commitHash
 
# check local prod repo
git log
 
# push changes to remote prod repo
git push origin master
 
# remove the reference to the test repo
git remote remove oldrepo


# --- Step 2: Pull Changes to local Git Repository ---

cd $directory

# Pull changes
git pullInvoke-JS7GitRepositoryPull -Folder $folder


# --- Step 3: Cleanup repository and store scheduling objects to repository ---

# Update the JOC Cockpit inventory from the local repository of the given folder
Update-JS7FromRepositoryItem -Folder $folder
 
# Release scheduling objects of the given folder
Publish-JS7ReleasableItem -Folder $folder -Recursive -NoReleased
 
# Deploy scheduling objects from the given folder to the Controller
Publish-JS7DeployableItem -ControllerId $controllerId -Folder $folder -Recursive -NoDeployed


# --- Connection ---

Disconnect-JS7

...