Configuring CI Using Jenkins and Nx
Below is an example of a Jenkins setup for an Nx workspace - building and testing only what is affected.
Unlike GitHub Actions
and CircleCI
, you don't have the metadata to help you track the last successful run on main
. In the example below, the base is set to HEAD~1
(for push) or branching point (for pull requests), but a more robust solution would be to tag an SHA in the main job once it succeeds and then use this tag as a base. See the nx-tag-successful-ci-run and nx-set-shas (version 1 implements tagging mechanism) repositories for more information.
We also have to set NX_BRANCH
explicitly.
1pipeline {
2 agent none
3 environment {
4 NX_BRANCH = env.BRANCH_NAME.replace('PR-', '')
5 }
6 stages {
7 stage('Pipeline') {
8 parallel {
9 stage('Main') {
10 when {
11 branch 'main'
12 }
13 agent any
14 steps {
15 sh "npm ci"
16 sh "npx nx format:check"
17 sh "npx nx affected --base=HEAD~1 -t lint --parallel=3"
18 sh "npx nx affected --base=HEAD~1 -t test --parallel=3"
19 sh "npx nx affected --base=HEAD~1 -t build --parallel=3"
20 }
21 }
22 stage('PR') {
23 when {
24 not { branch 'main' }
25 }
26 agent any
27 steps {
28 sh "npm ci"
29 sh "npx nx format:check"
30 sh "npx nx affected --base origin/${env.CHANGE_TARGET} -t lint --parallel=3"
31 sh "npx nx affected --base origin/${env.CHANGE_TARGET} -t test --parallel=3 --configuration=ci"
32 sh "npx nx affected --base origin/${env.CHANGE_TARGET} -t build --parallel=3"
33 }
34 }
35 }
36 }
37 }
38}
39
The pr
and main
jobs implement the CI workflow.
Distributed CI with Nx Cloud
Read more about Distributed Task Execution (DTE).
1pipeline {
2 agent none
3 environment {
4 NX_BRANCH = env.BRANCH_NAME.replace('PR-', '')
5 }
6 stages {
7 stage('Pipeline') {
8 parallel {
9 stage('Main') {
10 when {
11 branch 'main'
12 }
13 agent any
14 steps {
15 sh "npm ci"
16 sh "npx nx-cloud start-ci-run --stop-agents-after='build'"
17 sh "npx nx format:check"
18 sh "npx nx affected --base=HEAD~1 -t lint --parallel=3 & npx nx affected --base=HEAD~1 -t test --parallel=3 --configuration=ci & npx nx affected --base=HEAD~1 -t build --parallel=3"
19 }
20 }
21 stage('PR') {
22 when {
23 not { branch 'main' }
24 }
25 agent any
26 steps {
27 sh "npm ci"
28 sh "npx nx-cloud start-ci-run --stop-agents-after='build'"
29 sh "npx nx format:check"
30 sh "npx nx affected --base origin/${env.CHANGE_TARGET} -t lint --parallel=3 & npx nx affected --base origin/${env.CHANGE_TARGET} -t test --parallel=3 --configuration=ci & npx nx affected --base origin/${env.CHANGE_TARGET} -t build --parallel=3"
31 }
32 }
33
34 # Add as many agent you want
35 stage('Agent1') {
36 agent any
37 steps {
38 sh "npm ci"
39 sh "npx nx-cloud start-agent"
40 }
41 }
42 stage('Agent2') {
43 agent any
44 steps {
45 sh "npm ci"
46 sh "npx nx-cloud start-agent"
47 }
48 }
49 stage('Agent3') {
50 agent any
51 steps {
52 sh "npm ci"
53 sh "npx nx-cloud start-agent"
54 }
55 }
56 }
57 }
58 }
59}
60