-
Notifications
You must be signed in to change notification settings - Fork 1.1k
351 lines (303 loc) · 12.7 KB
/
maven.yaml
File metadata and controls
351 lines (303 loc) · 12.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
name: github-workflow
permissions:
actions: write
contents: read
on:
pull_request:
branches: [ main, 3.2.x, 3.3.x ]
# Manual trigger with optional branch override
workflow_dispatch:
inputs:
branch:
description: "Which branch should be built"
required: true
default: 'main'
type: string
jdk-version:
description: "Java version to use for build"
required: false
default: '17'
type: string
should-deploy:
description: "Whether to run deployment after tests pass"
required: false
default: 'false'
type: string
# Allow calls from ci.yaml
workflow_call:
inputs:
branch:
description: "Which branch should be built"
required: true
type: string
jdk-version:
description: "Java version to use for build"
required: true
type: string
should-deploy:
description: "Whether to run deployment after tests pass"
required: true
type: boolean
jobs:
build:
name: Build (${{ inputs.branch || github.ref_name }} with JDK ${{ inputs.jdk-version || '17' }})
runs-on: ubuntu-latest
env:
# this might get set to true if there is an existing cache of test times
# this happens in 'matrix-bounds-on-test-times-cache-hit'
TEST_TIMES_CACHE_PRESENT: false
SEGMENT_DOWNLOAD_TIMEOUT_MINS: 30
JDK_VERSION: ${{ inputs.jdk-version || '17' }}
BRANCH: ${{ inputs.branch || github.ref_name }}
# this job ('build') outputs a value from step 'test_times_cache_present_init', that has the name of:
# 'test_times_cache_present'. This can later be used by other jobs. For example, we use this one
# to skip the job responsible for running the tests, if a previous cache that has the test times is not present.
# Same for other two variables 'number_of_matrix_instances' and 'matrix_array'.
outputs:
branch_safe: ${{ steps.sanitize_branch.outputs.branch_safe }} # this is the branch name with / removed so it can be used in cache names safely
test_times_cache_present: ${{ steps.test_times_cache_present_init.outputs.test_times_cache_present }}
number_of_matrix_instances: ${{ steps.test_times_cache_present_init.outputs.number_of_matrix_instances }}
matrix_array: ${{ steps.test_times_cache_present_init.outputs.matrix_array }}
average_time_per_instance: ${{ steps.test_times_cache_present_init.outputs.average_time_per_instance }}
steps:
- name: checkout project
uses: actions/checkout@v6
with:
ref: ${{ inputs.branch || github.ref }}
- name: Sanitize branch name for artifacts
id: sanitize_branch
shell: bash
run: |
SANITIZED_BRANCH=$(echo "${{ env.BRANCH }}" | sed 's/\//-/g')
echo "BRANCH_SAFE=${SANITIZED_BRANCH}" >> $GITHUB_ENV
echo "branch_safe=${SANITIZED_BRANCH}" >> $GITHUB_OUTPUT
- name: set env variables
uses: ./.github/workflows/composites/env-variables
- name: setup project jdk
uses: ./.github/workflows/composites/setup-jdk
with:
jdk-version: ${{ env.JDK_VERSION }}
if: env.BASE_BRANCH == 'main' || env.BASE_BRANCH == '3.0.x' || env.BASE_BRANCH == '3.1.x'
- name: cache local maven repository
uses: ./.github/workflows/composites/cache
with:
jdk-version: ${{ env.JDK_VERSION }}
- name: Show caches
uses: actions/github-script@v9
with:
script: |
const caches = await github.rest.actions.getActionsCacheList({
owner: context.repo.owner,
repo: context.repo.repo,
})
console.log(caches.data)
- name: maven build with dry-run for tests
uses: ./.github/workflows/composites/maven-build-with-dry-run-for-tests
with:
jdk-version: ${{ env.JDK_VERSION }}
branch: ${{ env.BRANCH_SAFE }}
- name: restore test times cache if it exists
id: restore_test_times_cache
uses: actions/cache/restore@v5
with:
path: /tmp/sorted.txt
key: ${{ runner.os }}-spring-cloud-k8s-jdk${{ env.JDK_VERSION }}-test-times-cache-${{ github.run_id }}
restore-keys: ${{ runner.os }}-spring-cloud-k8s-jdk${{ env.JDK_VERSION }}-test-times-cache-
- name: check test times cache exists
id: check_files
uses: andstor/file-existence-action@v3
with:
files: /tmp/sorted.txt
- name: show existing cache of test times
if: steps.check_files.outputs.files_exists == 'true'
shell: bash
run: cat /tmp/sorted.txt
- name: compute matrix related fields when cache is present
if: steps.check_files.outputs.files_exists == 'true'
uses: ./.github/workflows/composites/matrix-bounds-on-test-times-cache-hit
with:
jdk-version: ${{ env.JDK_VERSION }}
branch: ${{ env.BRANCH_SAFE }}
- name: matrix related variables when cache is present
id: test_times_cache_present_init
run: |
echo "test_times_cache_present=${{ env.TEST_TIMES_CACHE_PRESENT }}" >> $GITHUB_OUTPUT
echo "number_of_matrix_instances=${{ env.NUMBER_OF_MATRIX_INSTANCES }}" >> $GITHUB_OUTPUT
echo "matrix_array=${{ env.MATRIX_ARRAY }}" >> $GITHUB_OUTPUT
echo "average_time_per_instance=${{ env.AVERAGE_TIME_PER_INSTANCE }}" >> $GITHUB_OUTPUT
test_when_cache_present:
name: Test with cache (runner ${{ matrix.current_index }})
needs: [ build ]
runs-on: ubuntu-latest
env:
SEGMENT_DOWNLOAD_TIMEOUT_MINS: 30
JDK_VERSION: ${{ inputs.jdk-version || '17' }}
BRANCH: ${{ inputs.branch || github.ref_name }}
BRANCH_SAFE: ${{ needs.build.outputs.branch_safe }}
# only run this one if there is a previous cache of test times
if: needs.build.outputs.test_times_cache_present == 'true'
timeout-minutes: 120
strategy:
fail-fast: true
matrix:
current_index: [ "${{ fromJSON(needs.build.outputs.matrix_array) }}" ]
number_of_jobs: [ "${{ fromJSON(needs.build.outputs.number_of_matrix_instances) }}" ]
average_time_per_instance: [ "${{ fromJSON(needs.build.outputs.average_time_per_instance) }}" ]
steps:
- name: checkout project
uses: actions/checkout@v6
with:
ref: ${{ inputs.branch || github.ref }}
- name: clean space
uses: ./.github/workflows/composites/clean-space
- name: set env variables
uses: ./.github/workflows/composites/env-variables
- name: setup project jdk
uses: ./.github/workflows/composites/setup-jdk
with:
jdk-version: ${{ env.JDK_VERSION }}
if: env.BASE_BRANCH == 'main' || env.BASE_BRANCH == '3.0.x' || env.BASE_BRANCH == '3.1.x'
- name: pre-test-actions
uses: ./.github/workflows/composites/pre-test-actions
with:
jdk-version: ${{ env.JDK_VERSION }}
branch: ${{ env.BRANCH_SAFE }}
- name: testcontainers reuse support
shell: bash
run: echo "testcontainers.reuse.enable=true" > ~/.testcontainers.properties
- name: run and save test times when cache is present
uses: ./.github/workflows/composites/run-and-save-test-times-when-cache-present
with:
jdk-version: ${{ env.JDK_VERSION }}
branch: ${{ env.BRANCH_SAFE }}
env:
CURRENT_INDEX: ${{ matrix.current_index }}
NUMBER_OF_JOBS: ${{ matrix.number_of_jobs }}
AVERAGE_TIME_PER_INSTANCE: ${{ matrix.average_time_per_instance }}
test_when_cache_missing:
name: Test without cache (runner ${{ matrix.current_index }})
needs: [ build ]
runs-on: ubuntu-latest
env:
SEGMENT_DOWNLOAD_TIMEOUT_MINS: 30
JDK_VERSION: ${{ inputs.jdk-version || '17' }}
BRANCH: ${{ inputs.branch || github.ref_name }}
BRANCH_SAFE: ${{ needs.build.outputs.branch_safe }}
timeout-minutes: 120
# only run this one if there is no previous cache of test times
if: needs.build.outputs.test_times_cache_present == 'false'
strategy:
fail-fast: true
matrix:
current_index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]
number_of_jobs: [32]
steps:
- name: checkout project
uses: actions/checkout@v6
with:
ref: ${{ inputs.branch || github.ref }}
- name: clean space
uses: ./.github/workflows/composites/clean-space
- name: set env variables
uses: ./.github/workflows/composites/env-variables
- name: setup project jdk
uses: ./.github/workflows/composites/setup-jdk
with:
jdk-version: ${{ env.JDK_VERSION }}
if: env.BASE_BRANCH == 'main' || env.BASE_BRANCH == '3.0.x' || env.BASE_BRANCH == '3.1.x'
- name: pre-test-actions
uses: ./.github/workflows/composites/pre-test-actions
with:
jdk-version: ${{ env.JDK_VERSION }}
branch: ${{ env.BRANCH_SAFE }}
- name: compute single step test bounds
uses: ./.github/workflows/composites/test-bounds
env:
CURRENT_INDEX: ${{ matrix.current_index }}
NUMBER_OF_JOBS: ${{ matrix.number_of_jobs }}
- name: testcontainers reuse support
shell: bash
run: echo "testcontainers.reuse.enable=true" > ~/.testcontainers.properties
- name: run and save individual test times
uses: ./.github/workflows/composites/run-and-save-test-times-when-cache-missing
with:
jdk-version: ${{ env.JDK_VERSION }}
branch: ${{ env.BRANCH_SAFE }}
env:
CURRENT_INDEX: ${{ matrix.current_index }}
save_test_times_when_cache_missing:
name: Save test times
runs-on: ubuntu-latest
needs: [build, test_when_cache_missing ]
env:
JDK_VERSION: ${{ inputs.jdk-version || '17' }}
BRANCH: ${{ inputs.branch || github.ref_name }}
BRANCH_SAFE: ${{ needs.build.outputs.branch_safe }}
steps:
- name: checkout project
uses: actions/checkout@v6
with:
ref: ${{ inputs.branch || github.ref }}
- name: compute and save running time of tests
uses: ./.github/workflows/composites/test-times
with:
jdk-version: ${{ env.JDK_VERSION }}
branch: ${{ env.BRANCH_SAFE }}
save_test_times_when_cache_present:
name: Save test times
runs-on: ubuntu-latest
needs: [ build, test_when_cache_present ]
env:
JDK_VERSION: ${{ inputs.jdk-version || '17' }}
BRANCH: ${{ inputs.branch || github.ref_name }}
BRANCH_SAFE: ${{ needs.build.outputs.branch_safe }}
steps:
- name: checkout project
uses: actions/checkout@v6
with:
ref: ${{ inputs.branch || github.ref }}
- name: compute and save running time of tests
uses: ./.github/workflows/composites/test-times
with:
jdk-version: ${{ env.JDK_VERSION }}
branch: ${{ env.BRANCH_SAFE }}
# Gate job to handle mutually exclusive test jobs
# Either test_when_cache_present OR test_when_cache_missing runs (not both)
# This job succeeds only if the appropriate test jobs succeeded
all-tests-passed:
if: always()
needs: [test_when_cache_present, test_when_cache_missing, save_test_times_when_cache_missing, save_test_times_when_cache_present]
runs-on: ubuntu-latest
steps:
- name: Check test results
run: |
if [ "${{ needs.test_when_cache_present.result }}" == "success" ] || \
[ "${{ needs.test_when_cache_missing.result }}" == "success" ]; then
echo "Tests passed"
exit 0
else
echo "Tests failed"
exit 1
fi
# Deploy job that runs after all tests pass
# Only runs when should-deploy input is 'true'
deploy:
if: always() && inputs.should-deploy && needs.all-tests-passed.result == 'success'
needs: [all-tests-passed]
uses: spring-cloud/spring-cloud-github-actions/.github/workflows/deploy.yml@main
with:
trigger_ci_on_non_default_branches: false
branches: ${{ inputs.branch }}
custom_build_command: |
if [[ "$SHOULD_DEPLOY" == "true" ]]; then
./mvnw clean deploy -Pspring,docs -DskipTests -DskipITs -Dspring-boot.build-image.skip=true -B -U
else
echo "Will not deploy artifacts"
fi
secrets:
ARTIFACTORY_USERNAME: ${{ secrets.ARTIFACTORY_USERNAME }}
ARTIFACTORY_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }}
COMMERCIAL_ARTIFACTORY_USERNAME: ${{ secrets.COMMERCIAL_ARTIFACTORY_USERNAME }}
COMMERCIAL_ARTIFACTORY_PASSWORD: ${{ secrets.COMMERCIAL_ARTIFACTORY_PASSWORD }}
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}