Configuring CI Using GitLab and Nx
Below is an example of a GitLab pipeline setup for an Nx workspace only building and testing what is affected.
1image: node:16
2
3stages:
4 - test
5 - build
6
7.distributed:
8 interruptible: true
9 only:
10 - main
11 - merge_requests
12 cache:
13 key:
14 files:
15 - package-lock.json
16 paths:
17 - .npm/
18 before_script:
19 - npm ci --cache .npm --prefer-offline
20 - NX_HEAD=$CI_COMMIT_SHA
21 - NX_BASE=${CI_MERGE_REQUEST_DIFF_BASE_SHA:-$CI_COMMIT_BEFORE_SHA}
22 artifacts:
23 paths:
24 - node_modules/.cache/nx
25
26workspace-lint:
27 stage: test
28 extends: .distributed
29 script:
30 - npx nx workspace-lint --base=$NX_BASE --head=$NX_HEAD
31
32format-check:
33 stage: test
34 extends: .distributed
35 script:
36 - npx nx format:check --base=$NX_BASE --head=$NX_HEAD
37
38lint:
39 stage: test
40 extends: .distributed
41 script:
42 - npx nx affected --base=$NX_BASE --head=$NX_HEAD --target=lint --parallel=3
43
44test:
45 stage: test
46 extends: .distributed
47 script:
48 - npx nx affected --base=$NX_BASE --head=$NX_HEAD --target=test --parallel=3 --ci --code-coverage
49
50build:
51 stage: build
52 extends: .distributed
53 script:
54 - npx nx affected --base=$NX_BASE --head=$NX_HEAD --target=build --parallel=3
55
The build
and test
jobs implement the CI workflow using .distributed
as template to keep CI configuration file more readable.
Distributed CI with Nx Cloud
In order to use distributed task execution, we need to start agents and set the NX_CLOUD_DISTRIBUTED_EXECUTION
flag to true
.
Read more about the Distributed CI setup with Nx Cloud.
1image: node:18
2variables:
3 CI: 'true'
4
5# Creating template for DTE agents
6.dte-agent:
7 interruptible: true
8 cache:
9 key:
10 files:
11 - yarn.lock
12 paths:
13 - '.yarn-cache/'
14 script:
15 - yarn install --cache-folder .yarn-cache --prefer-offline --frozen-lockfile
16 - yarn nx-cloud start-agent
17 artifacts:
18 expire_in: 5 days
19 paths:
20 - dist
21
22# Creating template for a job running DTE (orchestrator)
23.base-pipeline:
24 interruptible: true
25 only:
26 - main
27 - merge_requests
28 cache:
29 key:
30 files:
31 - yarn.lock
32 paths:
33 - '.yarn-cache/'
34 before_script:
35 - yarn install --cache-folder .yarn-cache --prefer-offline --frozen-lockfile
36 - NX_HEAD=$CI_COMMIT_SHA
37 - NX_BASE=${CI_MERGE_REQUEST_DIFF_BASE_SHA:-$CI_COMMIT_BEFORE_SHA}
38 artifacts:
39 expire_in: 5 days
40 paths:
41 - node_modules/.cache/nx
42
43# Main job running DTE
44nx-dte:
45 stage: affected
46 extends: .base-pipeline
47 script:
48 - yarn nx-cloud start-ci-run --stop-agents-after="build"
49 - yarn nx-cloud record -- yarn nx workspace-lint --base=$NX_BASE --head=$NX_HEAD
50 - yarn nx-cloud record -- yarn nx format:check --base=$NX_BASE --head=$NX_HEAD
51 - yarn nx affected --base=$NX_BASE --head=$NX_HEAD --target=lint --parallel=3
52 - yarn nx affected --base=$NX_BASE --head=$NX_HEAD --target=test --parallel=3 --ci --code-coverage
53 - yarn nx affected --base=$NX_BASE --head=$NX_HEAD --target=e2e --parallel=3 --ci --code-coverage
54 - yarn nx affected --base=$NX_BASE --head=$NX_HEAD --target=build --parallel=3
55
56# Create as many agents as you want
57nx-dte-agent1:
58 extends: .dte-agent
59 stage: affected
60nx-dte-agent2:
61 extends: .dte-agent
62 stage: affected
63nx-dte-agent3:
64 extends: .dte-agent
65 stage: affected
66