Automate your DC app performance testing with CI/CD

Hi,

Yesterday I shared how we created a CLI for running the DC app performance tests. This is a follow-up article on how to incorporate this into CI/CD to streamline the process and get a ZIP file with all required deliverables at the push of a button :heart_eyes:

This article will feature CircleCI, as this is the CI/CD of our choice, but the process should be similar to other tools like GitHub Actions, Bitbucket Pipelines or GitLab.

The DCAPT orb

The heavily lifting is done in what CircleCI calls an Orb. This is basically a re-usable configuration, similar to GitHub composite actions and bitbucket definitions.

The ORB is open source and published to the CircleCI Orb registry. You can find the source code here:

The Orb is a wrapper around the DCDX App Performance Testing CLI and provides the reindex, performace, scalability, report, dependencies and sca commands. In addition, it also provides the pack command which creates a single ZIP file with all the required deliverables.

The code is pretty straightforward as these are all shell scripts and for those interested make sure to check it out!

Creating CircleCI pipeline config files

To facilitate testing, we have created a single Github repository in which we store all test configurations for all our apps:

I will share sample configurations for all Atlassian host products:

Jira
version: 2.1

orbs:
  dcapt: collabsoft-net/apt@1.0.0

jobs:

  run-1:
    executor: dcapt/default
    steps:
      - performance:
          run: "1"

  run-2:
    executor: dcapt/default
    steps:
      - performance:
          run: "2"

  run-3:
    executor: dcapt/default
    steps:
      - scalability:
          run: "3"

  run-4:
    executor: dcapt/default
    steps:
      - scalability:
          run: "4"

  run-5:
    executor: dcapt/default
    steps:
      - scalability:
          run: "5"

  reports:
    executor: dcapt/default
    steps:
      - report

  lucene-index-timing:
    executor: dcapt/default
    steps:
      - reindex

  dependencies:
    executor: dcapt/default
    steps:
      - dependency-tree

  vulnerabilities:
    executor: dcapt/default
    steps:
      - sca

  pack:
    executor: dcapt/default
    steps:
      - collect

commands:

  performance:
    parameters:
      run:
        type: enum
        enum: ["1", "2"]

    steps:
      - checkout

      - dcapt/performance:
          run: << parameters.run >>
          product: "jira"
          environment: "ffj"
          license: ./licenses/jira
          appKey: "app.figma.jira"

  reindex:
    steps:
      - checkout

      - dcapt/reindex:
          environment: "ffj"
          license: ./licenses/jira
          appKey: "app.figma.jira"

  scalability:
    parameters:
      run:
        type: enum
        enum: ["3", "4", "5"]

    steps:
      - checkout

      - dcapt/scalability:
          run: << parameters.run >>
          product: "jira"
          environment: "ffj"
          license: ./licenses/jira
          appKey: "app.figma.jira"
          extension_file: "./apps/app.figma.jira/extension_ui.py"
  
  report:
    steps:
      - checkout

      - dcapt/report:
          product: "jira"

  dependency-tree:
    steps:
      - checkout

      - dcapt/dependencies:
          appKey: "app.figma.jira"
          groupId: "app.figma"
          artifactId: "jira"
          activeProfiles: "jira"

  sca:
    steps:
      - checkout

      - dcapt/sca:
          appKey: "app.figma.jira"

  collect:
    steps:
      - checkout

      - dcapt/pack:
          product: "jira"


workflows:

  figma-for-jira:
    max_auto_reruns: 5
    jobs:
      - run-1:
          name: Figma for Jira - Run 1
      - run-2:
          name: Figma for Jira - Run 2
      - run-3:
          name: Figma for Jira - Run 3
      - run-4:
          name: Figma for Jira - Run 4
      - run-5:
          name: Figma for Jira - Run 5
      - lucene-index-timing:
          name: Figma for Jira - Lucene Index Timing
      - dependencies:
          name: Figma for Jira - Dependency Graph
      - vulnerabilities:
          name: Figma for Jira - Vulnerability scanner
          context: NVD
      - reports:
          name: Figma for Jira - Reports
          requires:
            - Figma for Jira - Run 1
            - Figma for Jira - Run 2
            - Figma for Jira - Run 3
            - Figma for Jira - Run 4
            - Figma for Jira - Run 5
      - pack:
          name: Figma for Jira - Archive
          requires:      
            - Figma for Jira - Reports
            - Figma for Jira - Dependency Graph
            - Figma for Jira - Vulnerability scanner
            - Figma for Jira - Lucene Index Timing

Confluence
version: 2.1

orbs:
  dcapt: collabsoft-net/apt@1.0.0

jobs:

  run-1:
    executor: dcapt/default
    steps:
      - performance:
          run: "1"

  run-2:
    executor: dcapt/default
    steps:
      - performance:
          run: "2"

  run-3:
    executor: dcapt/default
    steps:
      - scalability:
          run: "3"

  run-4:
    executor: dcapt/default
    steps:
      - scalability:
          run: "4"

  run-5:
    executor: dcapt/default
    steps:
      - scalability:
          run: "5"

  reports:
    executor: dcapt/default
    steps:
      - report

  dependencies:
    executor: dcapt/default
    steps:
      - dependency-tree

  vulnerabilities:
    executor: dcapt/default
    steps:
      - sca

  pack:
    executor: dcapt/default
    steps:
      - collect

commands:

  performance:
    parameters:
      run:
        type: enum
        enum: ["1", "2"]

    steps:
      - checkout

      - dcapt/performance:
          run: << parameters.run >>
          product: "confluence"
          environment: "ffc"
          license: ./licenses/confluence
          appKey: "app.figma.confluence"

  scalability:
    parameters:
      run:
        type: enum
        enum: ["3", "4", "5"]

    steps:
      - checkout

      - dcapt/scalability:
          run: << parameters.run >>
          product: "confluence"
          environment: "ffc"
          license: ./licenses/confluence
          appKey: "app.figma.confluence"
          extension_file: "./apps/app.figma.confluence/extension_ui.py"
          post_provision_script: "./apps/app.figma.confluence/add_macro.sh"
  
  report:
    steps:
      - checkout

      - dcapt/report:
          product: "confluence"

  dependency-tree:
    steps:
      - checkout

      - dcapt/dependencies:
          appKey: "app.figma.confluence"
          groupId: "app.figma"
          artifactId: "confluence"
          activeProfiles: "confluence"

  sca:
    steps:
      - checkout

      - dcapt/sca:
          appKey: "app.figma.confluence"

  collect:
    steps:
      - checkout

      - dcapt/pack:
          product: "confluence"

workflows:

  figma-for-confluence:
    max_auto_reruns: 5
    jobs:
      - run-1:
          name: Figma for Confluence - Run 1
      - run-2:
          name: Figma for Confluence - Run 2
      - run-3:
          name: Figma for Confluence - Run 3
      - run-4:
          name: Figma for Confluence - Run 4
      - run-5:
          name: Figma for Confluence - Run 5
      - dependencies:
          name: Figma for Confluence - Dependency Graph
      - vulnerabilities:
          name: Figma for Confluence - Vulnerability scanner
          context: NVD
      - reports:
          name: Figma for Confluence - Reports
          requires:
            - Figma for Confluence - Run 1
            - Figma for Confluence - Run 2
            - Figma for Confluence - Run 3
            - Figma for Confluence - Run 4
            - Figma for Confluence - Run 5
      - pack:
          name: Figma for Confluence - Archive
          requires:      
            - Figma for Confluence - Reports
            - Figma for Confluence - Dependency Graph
            - Figma for Confluence - Vulnerability scanner
Bitbucket
version: 2.1

orbs:
  dcapt: collabsoft-net/apt@1.0.0

jobs:

  run-1:
    executor: dcapt/default
    steps:
      - performance:
          run: "1"

  run-2:
    executor: dcapt/default
    steps:
      - performance:
          run: "2"

  run-3:
    executor: dcapt/default
    steps:
      - scalability:
          run: "3"

  run-4:
    executor: dcapt/default
    steps:
      - scalability:
          run: "4"

  run-5:
    executor: dcapt/default
    steps:
      - scalability:
          run: "5"

  reports:
    executor: dcapt/default
    steps:
      - report

  dependencies:
    executor: dcapt/default
    steps:
      - dependency-tree

  vulnerabilities:
    executor: dcapt/default
    steps:
      - sca

  pack:
    executor: dcapt/default
    steps:
      - collect
      
commands:

  performance:
    parameters:
      run:
        type: enum
        enum: ["1", "2"]

    steps:
      - checkout

      - dcapt/performance:
          run: << parameters.run >>
          product: "bitbucket"
          environment: "gfc"
          license: ./licenses/bitbucket
          appKey: "net.collabsoft.plugins.stash.gfc"

  scalability:
    parameters:
      run:
        type: enum
        enum: ["3", "4", "5"]

    steps:
      - checkout

      - dcapt/scalability:
          run: << parameters.run >>
          product: "bitbucket"
          environment: "gfc"
          license: ./licenses/bitbucket
          appKey: "net.collabsoft.plugins.stash.gfc"
          extension_file: "./apps/net.collabsoft.plugins.stash.gfc/extension_ui.py"
          post_provision_script: "./apps/net.collabsoft.plugins.stash.gfc/add_macro.sh"
  
  report:
    steps:
      - checkout

      - dcapt/report:
          product: "bitbucket"

  dependency-tree:
    steps:
      - checkout

      - dcapt/dependencies:
          appKey: "net.collabsoft.plugins.stash.gfc"
          groupId: "net.collabsoft.plugins.stash"
          artifactId: "gfc"

  sca:
    steps:
      - checkout

      - dcapt/sca:
          appKey: "net.collabsoft.plugins.stash.gfc"

  collect:
    steps:
      - checkout

      - dcapt/pack:
          product: "bitbucket"

workflows:

  git-flow-chart:
    max_auto_reruns: 5
    jobs:
      - run-1:
          name: Git Flow Chart - Run 1
      - run-2:
          name: Git Flow Chart - Run 2
      - run-3:
          name: Git Flow Chart - Run 3
      - run-4:
          name: Git Flow Chart - Run 4
      - run-5:
          name: Git Flow Chart - Run 5
      - dependencies:
          name: Git Flow Chart - Dependency Graph
      - vulnerabilities:
          name: Git Flow Chart - Vulnerability scanner
          context: NVD
      - reports:
          name: Git Flow Chart - Reports
          requires:
            - Git Flow Chart - Run 1
            - Git Flow Chart - Run 2
            - Git Flow Chart - Run 3
            - Git Flow Chart - Run 4
            - Git Flow Chart - Run 5
      - pack:
          name: Git Flow Chart - Archive
          requires:      
            - Git Flow Chart - Reports
            - Git Flow Chart - Dependency Graph
            - Git Flow Chart - Vulnerability scanner
Bamboo

version: 2.1

orbs:
dcapt: collabsoft-net/dcapt@volatile

jobs:

run-1:
executor: dcapt/default
steps:
- performance:
run: β€œ1”

run-2:
executor: dcapt/default
steps:
- performance:
run: β€œ2”

run-3:
executor: dcapt/default
steps:
- scalability:
run: β€œ3”

reports:
executor: dcapt/default
steps:
- report

dependencies:
executor: dcapt/default
steps:
- dependency-tree

vulnerabilities:
executor: dcapt/default
steps:
- sca

pack:
executor: dcapt/default
steps:
- collect

commands:

performance:
parameters:
run:
type: enum
enum: [β€œ1”, β€œ2”]

steps:
  - checkout

  - dcapt/performance:
      run: << parameters.run >>
      product: "bamboo"
      environment: "ub"
      appKey: "net.collabsoft.plugins.bamboo.utilityBelt"
      restart_after_install: true

scalability:
parameters:
run:
type: enum
enum: [β€œ3”, β€œ4”, β€œ5”]

steps:
  - checkout

  - dcapt/scalability:
      run: << parameters.run >>
      product: "bamboo"
      environment: "ub"
      appKey: "net.collabsoft.plugins.bamboo.utilityBelt"
      restart_after_install: true
      extension_file: "./apps/net.collabsoft.plugins.bamboo.utilityBelt/extension_ui.py"

report:
steps:
- checkout

  - dcapt/report:
      product: "bamboo"

dependency-tree:
steps:
- checkout

  - dcapt/dependencies:
      appKey: "net.collabsoft.plugins.bamboo.utilityBelt"
      groupId: "net.collabsoft.plugins.bamboo"
      artifactId: "utility-belt"

sca:
steps:
- checkout

  - dcapt/sca:
      appKey: "net.collabsoft.plugins.bamboo.utilityBelt"

collect:
steps:
- checkout

  - dcapt/pack:
      product: "bamboo"

workflows:

utility-belt:
max_auto_reruns: 5
jobs:
- run-1:
name: Utility Belt for Bamboo - Run 1
- run-2:
name: Utility Belt for Bamboo - Run 2
- run-3:
name: Utility Belt for Bamboo - Run 3
- dependencies:
name: Utility Belt for Bamboo - Dependency Graph
- vulnerabilities:
name: Utility Belt for Bamboo - Vulnerability scanner
context: NVD
- reports:
name: Utility Belt for Bamboo - Reports
requires:
- Utility Belt for Bamboo - Run 1
- Utility Belt for Bamboo - Run 2
- Utility Belt for Bamboo - Run 3
- pack:
name: Utility Belt for Bamboo - Archive
requires:
- Utility Belt for Bamboo - Reports
- Utility Belt for Bamboo - Dependency Graph
- Utility Belt for Bamboo - Vulnerability scanner

Managing triggers in CircleCI

Because we do not want all the tests to always execute whenever we push a commit to the repository, we have added a default configuration on the top level of the project:

version: 2.1

jobs:

  default:
    docker:
      - image: cimg/node:20.12

    steps:
      - run:
          command: echo This is a placeholder, please refer to the app specific pipelines

workflows:

  dcapt:
    jobs:
      - default

This allows us to add the project to our CircleCI organisation and configure the triggers per app:

We create a pipeline for each app, using the Github repository as the config source and checkout source, and using the path to the app specific CircleCI configuration (app/<key>/.circleci/config.yml) as the config file path.

After the pipeline is added, we can now run the tests by clicking on β€œTrigger pipeline” and selecting the app from the dropdown:


We can also add a β€œSchedule” trigger which allows us to run the tests once a month automatically to make sure that we are still compliant. This also allows us to have the test results ready whenever we need to do our annual DC approval.

Submitting your test results

Once all the test completed successfully, we will be able to download a ZIP file with all the results and generated reports:

The ZIP file includes all the artifacts that Atlassian requests for the DC approval process :tada:

Still not feeling it?

Although the above steps should allow you to automate your annual DC approval process using CircleCI, there is also the option of letting us do it for you! If you want to offload the burden, you can create a support request here and we can help run the tests for you!

3 Likes