1+ #
2+ # MIT License
3+ #
4+ # (C) Copyright 2025 Hewlett Packard Enterprise Development LP
5+ #
6+ # Permission is hereby granted, free of charge, to any person obtaining a
7+ # copy of this software and associated documentation files (the "Software"),
8+ # to deal in the Software without restriction, including without limitation
9+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
10+ # and/or sell copies of the Software, and to permit persons to whom the
11+ # Software is furnished to do so, subject to the following conditions:
12+ #
13+ # The above copyright notice and this permission notice shall be included
14+ # in all copies or substantial portions of the Software.
15+ #
16+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19+ # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20+ # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21+ # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22+ # OTHER DEALINGS IN THE SOFTWARE.
23+ #
24+ name : Test build-sign-scan reusable workflow
25+
26+ on :
27+ push :
28+ paths :
29+ - .github/workflows/test-build-sign-scan.yaml
30+ - build-sign-scan/**
31+ workflow_dispatch :
32+
33+ jobs :
34+ test-docker-build-local :
35+ uses : ./.github/workflows/build-sign-scan.yaml
36+ with :
37+ context_path : build-sign-scan/tests/alpine
38+ docker_tag : artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-docker-build-local-1
39+ docker_additional_tags : |
40+
41+ artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-docker-build-local-2
42+ docker_build_args : |
43+ --label='Random label 1'
44+
45+ --label="Random label 2"
46+ env : |
47+ VAR1=var1
48+
49+ VAR2='var2 var2'
50+ VAR3="var3 var3"
51+ VAR4='var4
52+ var4'
53+ VAR5="var4
54+ var4"
55+ docker_push : false
56+ snyk : false
57+ sign : false
58+
59+ test-docker-build-single-platform :
60+ uses : ./.github/workflows/build-sign-scan.yaml
61+ with :
62+ context_path : build-sign-scan/tests/alpine
63+ docker_tag : artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-docker-build-single-platform-1
64+ docker_additional_tags : |
65+ artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-docker-build-single-platform-2
66+ snyk : true
67+ sign : true
68+ secrets : inherit
69+
70+ test-docker-build-multi-platform :
71+ uses : ./.github/workflows/build-sign-scan.yaml
72+ with :
73+ context_path : build-sign-scan/tests/alpine
74+ docker_tag : artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-docker-build-multi-platform-1
75+ docker_build_platforms : linux/amd64,linux/arm64
76+ docker_additional_tags : |
77+ artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-docker-build-multi-platform-2
78+ snyk : true
79+ sign : true
80+ secrets : inherit
81+
82+ test-docker-build-secrets :
83+ uses : ./.github/workflows/build-sign-scan.yaml
84+ with :
85+ context_path : build-sign-scan/tests/sles
86+ docker_tag : artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-docker-build-secrets-1
87+ docker_build_platforms : linux/amd64,linux/arm64
88+ docker_additional_tags : |
89+ artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-docker-build-secrets-2
90+ snyk : false
91+ sign : false
92+ secrets :
93+ docker_username : ${{ secrets.ARTIFACTORY_ALGOL60_USERNAME }}
94+ docker_password : ${{ secrets.ARTIFACTORY_ALGOL60_TOKEN }}
95+ docker_secrets : |
96+ SLES_REPO_USERNAME=${{ secrets.ARTIFACTORY_ALGOL60_READONLY_USERNAME }}
97+ SLES_REPO_PASSWORD=${{ secrets.ARTIFACTORY_ALGOL60_READONLY_TOKEN }}
98+ gcp_workload_identity_provider : ${{ secrets.COSIGN_GCP_WORKLOAD_IDENTITY_PROVIDER_RSA }}
99+ gcp_service_account : ${{ secrets.COSIGN_GCP_SERVICE_ACCOUNT_RSA }}
100+ gcp_cosign_key : ${{ secrets.COSIGN_KEY_RSA }}
101+ snyk_token : ${{ secrets.SNYK_TOKEN }}
102+
103+ test-docker-build-google :
104+ uses : ./.github/workflows/build-sign-scan.yaml
105+ with :
106+ context_path : build-sign-scan/tests/alpine
107+ docker_login : false
108+ docker_oidc : true
109+ docker_tag : us-docker.pkg.dev/hpe-stage-csm-release/csm-docker/unstable/test-build-sign-scan:test-docker-build-google-1
110+ docker_build_platforms : linux/amd64,linux/arm64
111+ docker_additional_tags : |
112+ us-docker.pkg.dev/hpe-stage-csm-release/csm-docker/unstable/test-build-sign-scan:test-docker-build-google-2
113+ snyk : true
114+ sign : true
115+ secrets : inherit
116+
117+ test-makefile-local :
118+ uses : ./.github/workflows/build-sign-scan.yaml
119+ with :
120+ context_path : build-sign-scan/tests/alpine
121+ make_target : local
122+ docker_login : false
123+ docker_additional_tags : |
124+
125+ artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-makefile-local-2
126+ docker_build_args : |
127+ --label='Random label 1'
128+
129+ --label="Random label 2"
130+ env : |
131+ VERSION=test-makefile-local-1
132+ VAR1=var1
133+
134+ VAR2='var2 var2'
135+ VAR3="var3 var3"
136+ VAR4='var4
137+ var4'
138+ VAR5="var4
139+ var4"
140+ snyk : false
141+ sign : false
142+
143+ test-makefile-single-platform :
144+ uses : ./.github/workflows/build-sign-scan.yaml
145+ with :
146+ context_path : build-sign-scan/tests/alpine
147+ make_target : unstable
148+ env : |
149+ PLATFORM=linux/amd64
150+ VERSION=test-makefile-single-platform-1
151+ docker_additional_tags : |
152+ artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-makefile-single-platform-2
153+ snyk : true
154+ sign : true
155+ secrets : inherit
156+
157+ test-makefile-multi-platform :
158+ uses : ./.github/workflows/build-sign-scan.yaml
159+ with :
160+ context_path : build-sign-scan/tests/alpine
161+ make_target : unstable
162+ env : |
163+ VERSION=test-makefile-multi-platform-1
164+ docker_additional_tags : |
165+ artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-makefile-multi-platform-2
166+ snyk : true
167+ sign : true
168+ secrets : inherit
169+
170+ test-makefile-secrets :
171+ uses : ./.github/workflows/build-sign-scan.yaml
172+ with :
173+ context_path : build-sign-scan/tests/sles
174+ make_target : unstable
175+ env : |
176+ VERSION=test-makefile-secrets-1
177+ docker_additional_tags : |
178+ artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan:test-makefile-secrets-2
179+ snyk : false
180+ sign : false
181+ secrets :
182+ docker_username : ${{ secrets.ARTIFACTORY_ALGOL60_USERNAME }}
183+ docker_password : ${{ secrets.ARTIFACTORY_ALGOL60_TOKEN }}
184+ docker_secrets : |
185+ SLES_REPO_USERNAME=${{ secrets.ARTIFACTORY_ALGOL60_READONLY_USERNAME }}
186+ SLES_REPO_PASSWORD=${{ secrets.ARTIFACTORY_ALGOL60_READONLY_TOKEN }}
187+ gcp_workload_identity_provider : ${{ secrets.COSIGN_GCP_WORKLOAD_IDENTITY_PROVIDER_RSA }}
188+ gcp_service_account : ${{ secrets.COSIGN_GCP_SERVICE_ACCOUNT_RSA }}
189+ gcp_cosign_key : ${{ secrets.COSIGN_KEY_RSA }}
190+ snyk_token : ${{ secrets.SNYK_TOKEN }}
191+
192+ test-makefile-google :
193+ uses : ./.github/workflows/build-sign-scan.yaml
194+ with :
195+ context_path : build-sign-scan/tests/alpine
196+ make_target : unstable
197+ docker_login : false
198+ docker_oidc : true
199+ env : |
200+ REGISTRY=us-docker.pkg.dev/hpe-stage-csm-release/csm-docker/unstable
201+ VERSION=test-makefile-google-1
202+ docker_additional_tags : |
203+ us-docker.pkg.dev/hpe-stage-csm-release/csm-docker/unstable/test-build-sign-scan:test-makefile-google-2
204+ snyk : true
205+ sign : true
206+ secrets : inherit
207+
208+ review :
209+ runs-on : ubuntu-latest
210+
211+ permissions :
212+ contents : ' read'
213+ id-token : ' write'
214+
215+ needs :
216+ - test-docker-build-local
217+ - test-docker-build-single-platform
218+ - test-docker-build-multi-platform
219+ - test-docker-build-secrets
220+ - test-docker-build-google
221+ - test-makefile-local
222+ - test-makefile-single-platform
223+ - test-makefile-multi-platform
224+ - test-makefile-secrets
225+ - test-makefile-google
226+
227+ steps :
228+ - name : Report Test Results
229+ env :
230+ NEEDS_CONTEXT : ${{ toJSON(needs) }}
231+ run : |
232+ function assert() {
233+ if ! [[ "${2}" =~ ${3} ]]; then
234+ echo "::error::Test ${test_name}: ${1}: expected \"${3}\", got \"${2}\"."
235+ exit_code=$((exit_code+1))
236+ fi
237+ }
238+
239+ echo "$NEEDS_CONTEXT" > outputs.json
240+ exit_code=0
241+ for build_type in docker-build makefile; do
242+ for image_type in local single-platform multi-platform secrets google; do
243+ test_name="test-${build_type}-${image_type}"
244+
245+ # Test built tags
246+ image_name=artifactory.algol60.net/csm-docker-backup/unstable/test-build-sign-scan
247+ test "${image_type}" == google && image_name=us-docker.pkg.dev/hpe-stage-csm-release/csm-docker/unstable/test-build-sign-scan
248+ tags=$(jq -r ".\"${test_name}\".outputs.image_tags" outputs.json | tr ',' '\n' | sort | tr '\n' ',' | sed -e 's/,$//')
249+ assert tags "${tags}" "${image_name}:${test_name}-1,${image_name}:${test_name}-2"
250+
251+ # Test built platforms
252+ platforms=$(jq -r ".\"${test_name}\".outputs.image_platforms" outputs.json)
253+ test "${image_type}" == single && assert platforms "${platforms}" '["linux/amd64"]'
254+ test "${image_type}" != local -a "${image_type}" != single-platform && assert platforms "${platforms}" '["linux/amd64","linux/arm64"]'
255+
256+ # Test Snyk output
257+ snyk_summary=$(jq -r ".\"${test_name}\".outputs.snyk_summary" outputs.json)
258+ test "${image_type}" != local -a "${image_type}" != secrets && assert snyk_summary "${snyk_summary}" 'crtitical: [0-9]+, high: [0-9]+, medium: [0-9]+, low: [0-9]+'
259+
260+ # Test Trivy output
261+ trivy_summary=$(jq -r ".\"${test_name}\".outputs.trivy_summary" outputs.json)
262+ test "${image_type}" != local -a "${image_type}" != secrets && assert trivy_summary "${trivy_summary}" '(Tests: [0-9]+ \(SUCCESSES: [0-9]+, FAILURES: [0-9]+\)|PASS)'
263+
264+ # Test Scan output
265+ sign_summary=$(jq -r ".\"${test_name}\".outputs.sign_summary" outputs.json)
266+ test "${image_type}" != local -a "${image_type}" != secrets && assert sign_summary "${sign_summary}" 'Signed .+ with Cosign'
267+ done
268+ done
269+ exit $exit_code
270+ shell : bash
0 commit comments