a58467468f7c20773f623bddf3738c3e684e90c4
[ci-management.git] / jjb / global-templates-docker.yaml
1 ---
2 ###########
3 # ANCHORS #
4 ###########
5 - _docker_job_boiler_plate: &docker_job_boiler_plate
6     name: docker_job_boiler_plate
7
8     project-type: freestyle
9     node: "{build-node}"
10
11     ######################
12     # Default parameters #
13     ######################
14
15     branch: master
16     submodule-recursive: true
17
18     # default params for docker jobs
19     pre_build_script: ""
20     post_build_script: ""
21     docker_root: "$WORKSPACE"
22     docker_build_args: ""
23     docker_name: "unnamed"
24     # Default to LF standard 'snapshots' docker registry
25     docker_registry: "$DOCKER_REGISTRY:10003"
26     docker_tag: "latest"
27     submodule-disable: false
28     submodule-timeout: 10
29
30     #####################
31     # Job Configuration #
32     #####################
33
34     properties:
35       - lf-infra-properties:
36           build-days-to-keep: "{build-days-to-keep}"
37
38     parameters:
39       - lf-infra-parameters:
40           branch: "{branch}"
41           project: "{project}"
42           stream: "{stream}"
43           lftools-version: "{lftools-version}"
44
45     wrappers:
46       - lf-infra-wrappers:
47           build-timeout: "{build-timeout}"
48           jenkins-ssh-credential: "{jenkins-ssh-credential}"
49
50     publishers:
51       - lf-infra-publish
52
53 - _docker_verify_boiler_plate: &docker_verify_boiler_plate
54     name: docker_verify_boiler_plate
55
56     concurrent: true
57
58     scm:
59       - gerrit-trigger-scm:
60           refspec: "$GERRIT_REFSPEC"
61           choosing-strategy: "default"
62           submodule-recursive: "{submodule-recursive}"
63
64     triggers:
65       - gerrit-trigger-patch-submitted:
66           status-context: "{project}-Docker-Verify"
67           server: "{server-name}"
68           project: "{project}"
69           branch: "{branch}"
70           files: "{files}"
71
72 - _docker_merge_boiler_plate: &docker_merge_boiler_plate
73     name: docker_merge_boiler_plate
74
75     scm:
76       - gerrit-trigger-scm:
77           refspec: "$GERRIT_REFSPEC"
78           choosing-strategy: "default"
79           submodule-recursive: "{submodule-recursive}"
80
81     triggers:
82       - gerrit-trigger-patch-merged:
83           server: "{server-name}"
84           project: "{project}"
85           branch: "{branch}"
86           files: "{files}"
87       - pollscm:
88           cron: ""
89
90 #################
91 # JOB TEMPLATES #
92 #################
93 - job-template:
94     name: "{project-name}-{stream}-merge-docker"
95     # Job template for Docker merge jobs
96     #
97     # The purpose of this job template is to run a docker build, and potentially
98     # test validation of the docker image
99
100     <<: *docker_job_boiler_plate
101     # yamllint disable-line rule:key-duplicates
102     <<: *docker_merge_boiler_plate
103
104     builders:
105       - lf-infra-pre-build
106       - lf-infra-docker-login:
107           global-settings-file: "global-settings"
108           settings-file: "{mvn-settings}"
109       - shell: "{pre_build_script}"
110       - inject:
111           # Docker registry is purposely not using an '_' so as to not conflict
112           # with the Jenkins global env var
113           properties-content: |
114             DOCKER_ARGS={docker_build_args}
115             DOCKER_NAME={docker_name}
116             DOCKER_ROOT={docker_root}
117             DOCKER_TAG={docker_tag}
118             BUILD_MODE=SNAPSHOT
119             DOCKERREGISTRY={docker_registry}
120       # Do the docker build
121       - shell: !include-raw: ../shell/docker-build.sh
122       - inject:
123           # Import the docker image information from the build step
124           properties-file: "env_inject.txt"
125       # Execute any post build clean-up or testing
126       - shell: "{post_build_script}"
127       # Provided all steps have already passed, push the docker image
128       - shell: !include-raw: ../shell/docker-push.sh
129
130 - job-template:
131     name: "{project-name}-{stream}-verify-docker"
132     # Job template for Docker verify jobs
133     #
134     # The purpose of this job template is to run a docker build, and potentially
135     # test validation of the docker image
136
137     ######################
138     # Default parameters #
139     ######################
140
141     <<: *docker_job_boiler_plate
142     # yamllint disable-line rule:key-duplicates
143     <<: *docker_verify_boiler_plate
144
145     builders:
146       - lf-infra-pre-build
147       - lf-infra-docker-login:
148           global-settings-file: "global-settings"
149           settings-file: "{mvn-settings}"
150       - shell: "{pre_build_script}"
151       - inject:
152           # Docker registry is purposely not using an '_' so as to not conflict
153           # with the Jenkins global env var
154           properties-content: |
155             DOCKER_ARGS={docker_build_args}
156             DOCKER_NAME={docker_name}
157             DOCKER_ROOT={docker_root}
158             DOCKER_TAG={docker_tag}
159             BUILD_MODE=SNAPSHOT
160             DOCKERREGISTRY={docker_registry}
161       # Do the docker build
162       - shell: !include-raw: ../shell/docker-build.sh
163       - inject:
164           # Import the docker image information from the build step
165           properties-file: "env_inject.txt"
166       # Execute any post build clean-up or testing
167       - shell: "{post_build_script}"
168
169 - job-template:
170     # Job template for creating a docker manifest list
171     #
172     # The purpose of this job template is to run:
173     # 1. docker_push_manifest.sh script (which needs to exist in the
174     #    project implementation repo)
175
176     name: "{project-name}-docker-manifest-{stream}"
177     <<: *docker_job_boiler_plate
178     node: "{build-node}"
179     build-timeout: 15
180
181     parameters:
182       - lf-infra-parameters:
183           project: "{project}"
184           stream: "{stream}"
185           branch: "{branch}"
186       - string:
187           name: PARENT_JOB_NAME
188           default: "none"
189
190     disabled: "{obj:disabled}"
191
192     scm:
193       - lf-infra-gerrit-scm:
194           jenkins-ssh-credential: "{jenkins-ssh-credential}"
195           git-url: "$GIT_URL/$PROJECT"
196           refspec: "$GERRIT_REFSPEC"
197           branch: "$GERRIT_BRANCH"
198           submodule-recursive: true
199           submodule-disable: "{submodule-disable}"
200           submodule-timeout: "{submodule-timeout}"
201           choosing-strategy: default
202
203     builders:
204       - lf-infra-docker-login:
205           global-settings-file: "global-settings"
206           settings-file: "{mvn-settings}"
207       - shell: |
208           #!/bin/bash -ex
209           export PARENT_JOB_NAME
210           ./docker_push_manifest.sh
211
212 - job-template:
213     # Job template for staging jobs on multiple architectures
214     #
215     # The purpose of this job template is to:
216     # 1. Run parallel maven-docker-stage jobs for each supported architecure
217     # 2. Build and push a docker manifest list for the images created by
218     #    the previous jobs
219
220     name: "{project-name}-multiarch-docker-stage-{stream}"
221     node: "{build-node}"
222     project-type: multijob
223     disabled: "{obj:disabled}"
224     build-timeout: 15
225     pattern: "**"
226
227     parameters:
228       - lf-infra-parameters:
229           project: "{project}"
230           stream: "{stream}"
231           branch: "{branch}"
232       - string:
233           name: DOCKER_REGISTRY
234           default: "none"
235       - string:
236           name: DOCKERHUB_REGISTRY
237           default: "registry-1.docker.io"
238
239     properties:
240       - throttle:
241           max-per-node: 1
242           option: "project"
243       - build-blocker:
244           use-build-blocker: true
245           blocking-jobs:
246             - "{project-name}-.*-docker-.*"
247           blocking-level: "NODE"
248
249     scm:
250       - lf-infra-gerrit-scm:
251           jenkins-ssh-credential: "{jenkins-ssh-credential}"
252           git-url: "$GIT_URL/$PROJECT"
253           refspec: "$GERRIT_REFSPEC"
254           branch: "$GERRIT_BRANCH"
255           submodule-recursive: true
256           submodule-timeout: 10
257           submodule-disable: false
258           choosing-strategy: default
259
260     triggers:
261       - timed: "@daily"
262       - gerrit:
263           server-name: "{gerrit-server-name}"
264           trigger-on:
265             - comment-added-contains-event:
266               comment-contains-value: '^Patch Set\s+\d+:\s+stage-(docker-)?release\s*$'
267
268           projects:
269             - project-compare-type: ANT
270               project-pattern: "{project}"
271               branches:
272                 - branch-compare-type: ANT
273                   branch-pattern: "**/{branch}"
274               file-paths:
275                 - compare-type: ANT
276                   pattern: "**"
277
278     builders:
279       - multijob:
280           name: "build docker images"
281           condition: ALWAYS
282           execution-type: PARALLEL
283           projects:
284             - name: "{project-name}-amd64-maven-docker-stage-{stream}"
285               kill-phase-on: FAILURE
286               current-parameters: true
287             - name: "{project-name}-arm64-maven-docker-stage-{stream}"
288               kill-phase-on: NEVER
289               current-parameters: true
290       - multijob:
291           name: "publish docker manifest"
292           condition: SUCCESSFUL
293           execution-type: PARALLEL
294           projects:
295             - name: "{project-name}-docker-manifest-{stream}"
296               current-parameters: true
297               predefined-parameters: |
298                 PARENT_JOB_NAME=$JOB_NAME
299                 DOCKERHUB_REGISTRY=docker.io
300
301     publishers:
302       - lf-infra-publish