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 ![]()
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 ![]()
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!





