Versions Compared

Key

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

...

  • JS7 JOC Cockpit can be configured to interface with Git repositories to store and to rollout its configuration objects such as workflows and jobs.
    • JS7 supports use of Git compliant servers to manage remote repositories such as GitLabGitHub.
    • JS7 makes use of a Git CLI Client that has to be provided by the user.
  • Configuration objects can be versioned (tagged) with Git and can be rolled out to different JS7 environments via Git. This allows to create and to test workflows in a development environment and to perform rollouts to a production environment by use of a Git repository.
  • A connection to a Git repository is considered an additional option to manage versions and rollouts of JS7 configuration objects.
  • The Git Repository Interface is made available in two steps:
    • Display feature availability
      StartingFromRelease2.3.0
       
    • Release 2.3.0: Make JS7 objects available from the file system to allow use of external Git tools.
      • Jira
        serverSOS JIRA
        columnskey,summary,type,created,updated,due,assignee,reporter,priority,status,resolution
        serverId6dc67751-9d67-34cd-985b-194a8cdc9602
        keyJOC-1144
    • Release 2.4.0: Offer the GUI functionality from JOC Cockpit to manage JS7 objects with Git.
      • Jira
        serverSOS JIRA
        columnskey,summary,type,created,updated,due,assignee,reporter,priority,status,resolution
        serverId6dc67751-9d67-34cd-985b-194a8cdc9602
        keyJOC-1213
      • Jira
        serverSOS JIRA
        columnskey,summary,type,created,updated,due,assignee,reporter,priority,status,resolution
        serverId6dc67751-9d67-34cd-985b-194a8cdc9602
        keyJOC-1214
      • Jira
        serverSOS JIRA
        columnskey,summary,type,created,updated,due,assignee,reporter,priority,status,resolution
        serverId6dc67751-9d67-34cd-985b-194a8cdc9602
        keyJOC-1215

...

Flowchart
USER1 [label="User: 1",fillcolor="lightskyblue",fontname="Arial",fontsize="10pt"]
USER2 [label="User: 2",fillcolor="lightskyblue",fontname="Arial",fontsize="10pt"]
USER3 [label="User: 3",fillcolor="lightskyblue",fontname="Arial",fontsize="10pt"]

FOLDER1 [label="Folder: 1",fillcolor="white",fontname="Arial",fontsize="10pt"]
FOLDER1a [label="Sub-folder: 1.1",fillcolor="white",fontname="Arial",fontsize="10pt"]
FOLDER1b [label="Sub-folder: 1.2",fillcolor="white"]
FOLDER2 [label,fontname="Folder: 2Arial",fillcolorfontsize="white10pt"]
FOLDER3FOLDER2 [label="Folder: 32",fillcolor="white",fontname="Arial",fontsize="10pt"]
FOLDER3 [label="Folder: 3",fillcolor="white",fontname="Arial",fontsize="10pt"]

REPOSITORY1L [shape="ellipse",label="Repository: 1-local\njob resources etc.",fillcolor="darkolivegreen1",fontname="Arial",fontsize="10pt"]
REPOSITORY1R [shape="ellipse",label="Repository: 1-rollout\nworkflows etc.",fillcolor="darkolivegreen1",fontname="Arial",fontsize="10pt"]
REPOSITORY2L [shape="ellipse",label="Repository: 2-local\njob resources etc.",fillcolor="darkolivegreen1",fontname="Arial",fontsize="10pt"]
REPOSITORY2R [shape="ellipse",label="Repository: 2-rollout\nworkflows etc.",fillcolor="darkolivegreen1",fontname="Arial",fontsize="10pt"]
REPOSITORY3L [shape="ellipse",label="Repository: 3-local\njob resources etc.",fillcolor="darkolivegreen1",fontname="Arial",fontsize="10pt"]
REPOSITORY3R [shape="ellipse",label="Repository: 3-rollout\nworkflows etc.",fillcolor="darkolivegreen1 etc.",fillcolor="darkolivegreen1",fontname="Arial",fontsize="10pt"]

USER1 -> FOLDER1 [label="  can access  ",fontname="Arial",fontsize="10pt"]
USER2 -> FOLDER1 [label="  can access  ",fontname="Arial",fontsize="10pt"]
USER2 -> FOLDER2 [label="  can access  ",fontname="Arial",fontsize="10pt"]
USER3 -> FOLDER3 [label="  can access  ",fontname="Arial",fontsize="10pt"]

FOLDER1 -> FOLDER1a [label="  includes  ",fontname="Arial",fontsize="10pt"]
FOLDER1 -> FOLDER1b [label="  includes    ",fontname="Arial",fontsize="10pt"]
FOLDER1a -> REPOSITORY1L [label="  maps to  ",fontname="Arial",fontsize="10pt"]
FOLDER1a -> REPOSITORY1R [label="  maps to  ",fontname="Arial",fontsize="10pt"]
FOLDER1b -> REPOSITORY1L [label="  maps to  ",fontname="Arial",fontsize="10pt"]
FOLDER1b -> REPOSITORY1R [label="  maps to  ",fontname="Arial",fontsize="10pt"]

FOLDER2 -> REPOSITORY2L [label="  maps to  ",fontname="Arial",fontsize="10pt"]
FOLDER2 -> REPOSITORY2R [label="  maps to    ",fontname="Arial",fontsize="10pt"]
FOLDER3 -> REPOSITORY3L [label="  maps to  ",fontname="Arial",fontsize="10pt"]
FOLDER3 -> REPOSITORY3R [label="  maps to  ",fontname="Arial",fontsize="10pt"]


The mapping of folder objects to repositories implies

...

Flowchart
USER1a [label="  User: 1a  ",fillcolor="lightskyblue1",fontname="Arial",fontsize="10pt"]
USER1b [label="  User: 1b  ",fillcolor="lightskyblue1",fontname="Arial",fontsize="10pt"]
USER2 [label="  User: 2  ",fillcolor="lightskyblue2",fontname="Arial",fontsize="10pt"]
USER3 [label="  User: 3  ",fillcolor="lightskyblue3  ",fillcolor="lightskyblue3",fontname="Arial",fontsize="10pt"]

JOC1 [label="  JOC Cockpit: dev  ",fillcolor="lightskyblue1",fontname="Arial",fontsize="10pt"]
JOC2 [label="  JOC Cockpit: test  ",fillcolor="lightskyblue2",fontname="Arial",fontsize="10pt"]
JOC3 [label="  JOC Cockpit: prod  ",fillcolor="lightskyblue3",fontname="Arial",fontsize="10pt"]

FOLDER1 [label="  Folder: 1 (dev)  ",fillcolor="white",fontname="Arial",fontsize="10pt"]
FOLDER2 [label="  Folder: 1 (test)  ",fillcolor="white",fontname="Arial",fontsize="10pt"]
FOLDER3 [label="  Folder: 1 (prod)   ",fillcolor="white",fontname="Arial",fillcolorfontsize="white10pt"]

DATABASE1 [shape="ellipse",label="  Database: dev  ",fillcolor="lightskyblue1",fontname="Arial",fontsize="10pt"]
DATABASE2 [shape="ellipse",label="  Database: test  ",fillcolor="lightskyblue2",fontname="Arial",fontsize="10pt"]
DATABASE3 [shape="ellipse",label="  Database: prod  ",fillcolor="lightskyblue3",fontname="Arial",fontsize="10pt"]

REPO1L [shape="ellipse",label="Repository: 1-dev-local\njob resources etc.",fillcolor="darkolivegreen1",fontname="Arial",fontsize="10pt"]
REPO1R [shape="ellipse",label="Repository: 1-dev-rollout\nworkflows etc.",fillcolor="darkolivegreen1",fontname="Arial",fontsize="10pt"]
REPO2L [shape="ellipse",label="Repository: 1-test-local\njob resources etc.",fillcolor="darkolivegreen2resources etc.",fillcolor="darkolivegreen2",fontname="Arial",fontsize="10pt"]
REPO2R [shape="ellipse",label="Repository: 1-test-rollout\nworkflows etc.",fillcolor="darkolivegreen2",fontname="Arial",fontsize="10pt"]
REPO3L [shape="ellipse",label="Repository: 1-prod-local\njob resources etc.",fillcolor="darkolivegreen3",fontname="Arial",fontsize="10pt"]
REPO3R [shape="ellipse",label="Repository: 1-prod-rollout\nworkflows etc.",fillcolor="darkolivegreen3",fontname="Arial",fontsize="10pt"]

{ rank = same; JOC1 -> DATABASE1 }
{ rank = same; JOC2 -> DATABASE2 }
{ rank = same; JOC3 -> DATABASE3; }

JOC1 -> FOLDER1 
FOLDER1 -> REPO1L [label="  commit\n  push/pull  ",fontname="Arial",fontsize="10pt"]
FOLDER1 -> REPO1R [label="  commit\n  push/pull  ",fontname="Arial",fontsize="10pt"]

JOC2 -> FOLDER2
FOLDER2 -> REPO2L [label="  commit\n  push/pull    ",fontname="Arial",fontsize="10pt"]
FOLDER2 -> REPO2R [label="  commit\n  push/pull  ",fontname="Arial",fontsize="10pt"]

JOC3 -> FOLDER3 
FOLDER3 -> REPO3L  [label="  commit\n  push/pull  ",fontname="Arial",fontsize="10pt"]
FOLDER3 -> REPO3R  [label="  commit\n  push/pull  ",fontname="Arial",fontsize="10pt"]

REPO1R -> REPO2R [label="  copy  ",fontname="Arial",fontsize="10pt"]
REPO2R -> REPO3R [label="  copy  ",fontname="Arial",fontsize="10pt"]

USER1a -> JOC1;
USER1b -> JOC1;
USER2 -> JOC2;
USER3 -> JOC3;

...

Flowchart
USER1a [label="  User: 1a  ",fillcolor="lightskyblue1  ",fillcolor="lightskyblue1",fontname="Arial",fontsize="10pt"]
USER1b [label="  User: 1b  ",fillcolor="lightskyblue1",fontname="Arial",fontsize="10pt"]
USER2a [label="  User: 2a  ",fillcolor="lightskyblue2",fontname="Arial",fontsize="10pt"]
USER2b [label="  User: 2b  ",fillcolor="lightskyblue2",fontname="Arial",fontsize="10pt"]
USER3 [label="  User: 3  ",fillcolor="lightskyblue3",fontname="Arial",fontsize="10pt"]

JOC1a [label="JOC Cockpit: dev 1a",fillcolor="lightskyblue1",fontname="Arial",fontsize="10pt"]
JOC1b [label="JOC Cockpit: dev 1b dev 1b",fillcolor="lightskyblue1",fontname="Arial",fillcolorfontsize="lightskyblue110pt"]
JOC2  [label="JOC Cockpit: test",fillcolor="lightskyblue2",fontname="Arial",fontsize="10pt"]
JOC3  [label="JOC Cockpit: prod",fillcolor="lightskyblue3",fontname="Arial",fontsize="10pt"]

#DATABASE1a [shape="ellipse",label="Database: dev 1a",fillcolor="lightskyblue1",fontname="Arial",fontsize="10pt"]
#DATABASE1b [shape="ellipse",label="Database: dev 1b",fillcolor="lightskyblue1",fontname="Arial",fontsize="10pt"]
#DATABASE2  [shape="ellipse",label="Database: test",fillcolor="lightskyblue2",fontname="Arial",fontsize="10pt"]
#DATABASE3  [shape="ellipse",label="Database: prod",fillcolor="lightskyblue3",labelfontname="Database: prodArial",fillcolorfontsize="lightskyblue310pt"]

REPO1L1 [shape="ellipse",label="Repository: dev-local-1a\njob resources etc.",fillcolor="darkolivegreen1",fontname="Arial",fontsize="10pt"]
REPO1L2 [shape="ellipse",label="Repository: dev-local-1b\njob resources etc.",fillcolor="darkolivegreen1",fontname="Arial",fontsize="10pt"]
REPO1R  [shape="ellipse",label="Repository: dev-rollout\nworkflows etc.",fillcolor="darkolivegreen1",fontname="Arial",fontsize="10pt"]
REPO2L  [shape="ellipse",label="Repository: test-local\njob resources etc.",fillcolor="darkolivegreen2",fontname="Arial",fontsize="10pt"]
REPO2R  [shape="ellipse",label="Repository: test-rollout\nworkflows etc.",fillcolor="darkolivegreen2",fontname="Arial",fontsize="10pt"]
REPO3L  [shape="ellipse",label="Repository: prod-local\njob resources etc.",fillcolor="darkolivegreen3 etc.",fillcolor="darkolivegreen3",fontname="Arial",fontsize="10pt"]
REPO3R  [shape="ellipse",label="Repository: prod-rollout\nworkflows eetc.",fillcolor="darkolivegreen3",fontname="Arial",fontsize="10pt"]

#{ rank = same; JOC1a -> DATABASE1a }
#{ rank = same; JOC1b -> DATABASE1b }
#{ rank = same; JOC2 -> DATABASE2 }
#{ rank = same; JOC3 -> DATABASE3; }

JOC1a -> REPO1L1 [label="  commit/push/pull  ",fontname="Arial",fontsize="10pt"]
JOC1a -> REPO1R  [label="  commit/push/pull  ",fontname="Arial",fontsize="10pt"]
JOC1b -> REPO1L2 [label="  commit/push/pull  ",fontname="Arial",fontsize="10pt"]
JOC1b -> REPO1R  [label="  commit/push/pull  ",fontname="Arial",fontsize="10pt"]
JOC2  -> REPO2L  [label="  commit/push/pull    ",fontname="Arial",fontsize="10pt"]
JOC2  -> REPO2R  [label="  commit/push/pull  ",fontname="Arial",fontsize="10pt"]
JOC3  -> REPO3L  [label="  commit/push/pull  ",fontname="Arial",fontsize="10pt"]
JOC3  -> REPO3R  [label="  commit/push/pull  ",fontname="Arial",fontsize="10pt"]

REPO1R -> REPO2R [label="  copy  ",fontname="Arial",fontsize="10pt"]
REPO2R -> REPO3R [label="  copy  ",fontname="Arial",fontsize="10pt"]

USER1b -> JOC1b
USER1a -> JOC1a
USER2a -> JOC2
USER2b -> JOC2
USER3 -> JOC3


Operations

JOC Cockpit operations and Git operations are the same as for the above Scenarioscenario: Single Client - Multiple Repositories.

...

  • Job Development in a dev environment 
    • JOC Cockpit Operations
      • A number of configuration objects, e.g. workflows, are created or changed by a job developer.
      • On completion of the change the job developer deploys the workflows to Controller and Agents to perform functional tests in the dev environment.
      • With functional tests being successful the developer
        • stores changes of workflows and related rollout objects to the local dev-rollout repository, commits changes and pushes changes to the remote dev-rollout repository.
        • optionally stores changes of local objects such as job resources to the local dev-local repository, commits changes and pushes changes to the remote dev-local repository.
  • Integration Testing in a test environment:
    • Git Operations
      • A tester with access to the job developer's remote dev-rollout repository adopts current changes. 
      • The tester copies changes from the job developer's remote dev-rollout repository (source) to the remote test-rollout repository (target) by Git operations that are performed with a Git Client outside of JOC Cockpit.
    • JOC Cockpit Operations
      • The tester pulls changes from the remote test-rollout repository to the local test-rollout repository and updates the JOC Cockpit instance from the local test-rollout repository.
      • The tester adjusts local objects such as job resources as required by the change.
      • The tester deploys changed workflows and related local objects to Controller and Agents to perform integration testing.
      • On completion of integration tests with changes being approved the tester
        • tags the latest commit in the remote test-rollout repository with a label, e.g. v2.3-approved.
          • Should the tester modify workflows then the tester commits changes to the local test-rollout repository and pushes changes to the remote test-rollout repository before tagging.
          • Some users might deny object modifications to be performed in a test environment and instead prefer to apply modifications in dev environments only.
        • optionally stores changes of local objects to the local test-local repository, commits changes and pushes changes to the remote test-local repository.
  • Production Rollout to a prod environment
    • Git Operations
      • An operator with access to the tester's test-rollout repository adopts the current changes and checks out the tag v2.3-approved.
      • The operator copies changes from the remote test-rollout repository (source) to the remote prod-rollout repository (target) by Git operations that are performed with a Git Client outside of JOC Cockpit.
      • The operator tags changes in the remote prod-rollout repository with a label, e.g. v2.3.
    • JOC Cockpit Operations
      • The operator pulls changes from the remote prod-rollout repository tag v2.3 to the local prod-rollout repository and updates the JOC Cockpit instance from the local prod-rollout repository.
      • The operator adjusts local objects such as job resources as required by the change. The operator optionally stores changes of local objects to the local prod-local repository, commits changes and pushes changes to the remote prod-local repository.
      • The operator deploys changed workflows and local objects to Controller and Agents for production use.

...

  • Job Development and Integration Testing are explained from the above Use Caseuse case: Lifecycle Support for Workflow Changes.
  • Production Rollout
    • Operations performed by a Git Client external to JOC Cockpit
      • Copy changes from the remote test-rollout repository (source) to the remote prod-rollout repository (target).
      • Tag changes with a label in the prod-rollout repository.
    • Operations performed by use of the JS7 REST Web Service API
      • Pull changes from the remote prod-rollout repository identified by the respective tag to the local prod-rollout repository.
      • Update the JOC Cockpit instance from the local prod-rollout repository.
      • Deploy changed workflows to Controller and Agents for production use.

...