@@ -13,7 +13,10 @@ permissions:
1313 id-token : write
1414
1515env :
16- IMAGE : " test-prune-${{ github.run_number }}"
16+ IMAGE_NAME : " test-prune-${{ github.run_number }}"
17+ PACKAGES : |
18+ ci-github-container/test-prune-${{ github.run_number }}
19+ ci-github-container/test-prune-${{ github.run_number }}/cache
1720
1821jobs :
1922 setup :
@@ -39,25 +42,25 @@ jobs:
3942 secrets :
4043 oci-registry-password : ${{ secrets.GITHUB_TOKEN }}
4144 with :
45+ cache-type : registry
4246 images : |
4347 [
4448 {
4549 "name": "test-prune-${{ github.run_number }}",
4650 "context": ".",
4751 "dockerfile": "./tests/application/Dockerfile",
4852 "build-args": { "BUILD_RUN_ID": "${{ github.run_id }}" },
49- "target": "base ",
53+ "target": "prod ",
5054 "platforms": ["linux/amd64","linux/arm64"]
5155 }
5256 ]
5357
5458 act :
59+ name : Act - Prune pull requests image tags
5560 runs-on : ubuntu-latest
5661 needs : [setup, arrange]
5762 permissions :
5863 packages : write
59- outputs :
60- deleted-image-tags : ${{ steps.prune-pull-requests-image-tags.outputs.deleted-image-tags }}
6164 steps :
6265 - uses : actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
6366
6972
7073 - name : Generate a image tag that should be deleted
7174 run : |
72- BASE_IMAGE=$(echo '${{ needs.arrange.outputs.built-images }}' | jq -r '."${{ env.IMAGE }}".images[0]')
73- NEW_IMAGE=ghcr.io/hoverkraft-tech/ci-github-container/${{ env.IMAGE }}:${{ needs.setup.outputs.tag }}
75+ BASE_IMAGE=$(echo '${{ needs.arrange.outputs.built-images }}' | jq -r '."${{ env.IMAGE_NAME }}".images[0]')
76+ NEW_IMAGE=ghcr.io/hoverkraft-tech/ci-github-container/${{ env.IMAGE_NAME }}:${{ needs.setup.outputs.tag }}
7477
7578 docker pull "$BASE_IMAGE"
7679 docker tag "$BASE_IMAGE" "$NEW_IMAGE"
@@ -79,73 +82,52 @@ jobs:
7982 - id : prune-pull-requests-image-tags
8083 uses : ./actions/docker/prune-pull-requests-image-tags
8184 with :
82- image : ${{ env.IMAGE }}
85+ image : ${{ env.IMAGE_NAME }}
8386
8487 assert :
88+ name : Assert - Verify deleted image tags
8589 runs-on : ubuntu-latest
8690 needs : [setup, arrange, act]
8791 steps :
88- - name : Assert - Check ouputs
92+ - name : Assert - Ensure expected packages versions have been deleted
8993 uses : actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
9094 with :
95+ github-token : ${{ secrets.GITHUB_TOKEN }}
9196 script : |
9297 const assert = require("assert");
9398
94- const deletedImageTagsOutput = `${{ needs.act.outputs.deleted-image-tags }}`;
95- assert(deletedImageTagsOutput.length, `"deleted-image-tags" output is empty`);
99+ const packages = process.env.PACKAGES.split("\n").map(packageName => packageName.trim()).filter(Boolean);
96100
97- // Check if is valid Json
98- let deletedImageTags = null;
99- try {
100- deletedImageTags = JSON.parse(deletedImageTagsOutput);
101- } catch (error) {
102- throw new Error(`"deleted-image-tags" output is not a valid JSON: ${error}`);
103- }
101+ for(const packageName of packages) {
102+ const packagePayload = {
103+ package_type: 'container',
104+ package_name: packageName,
105+ org: process.env.GITHUB_REPOSITORY_OWNER,
106+ };
104107
105- assert(Array.isArray(deletedImageTags), `"deleted-image-tags" output is not an array`);
106- assert.equal(deletedImageTags[0], `${{ needs.setup.outputs.tag }}`);
108+ const packageVersions = await github.paginate(
109+ github.rest.packages.getAllPackageVersionsForPackageOwnedByOrg.endpoint.merge(packagePayload)
110+ );
107111
108- // If is pull request ensure that deleted tags does not contain current pull request
109- const pullRequestNumber = `${{ github.event.pull_request.number }}`;
110- if (pullRequestNumber.length) {
111- const deletedImageTagsForCurrentPullRequest = deletedImageTags.filter((imageTag) => imageTag.includes(`pr-${pullRequestNumber}`));
112- assert.equal(deletedImageTagsForCurrentPullRequest.length, 0, `"deleted-image-tags" output contains current pull request image tag`);
112+ const packageVersionExists = packageVersions.some(
113+ (packageVersion) => packageVersion.metadata.container.tags.some(
114+ (tag) => tag === "${{ needs.setup.outputs.tag }}"
115+ )
116+ );
117+ assert.equal(packageVersionExists, false, `Package version "${{ needs.setup.outputs.tag }}" has not been deleted`);
113118 }
114119
115- - name : Assert - Ensure expected packages versions have been deleted
116- uses : actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
117- with :
118- github-token : ${{ github.token }}
119- script : |
120- const assert = require("assert");
121- const packagePayload = {
122- package_type: 'container',
123- package_name: 'ci-github-container/${{ env.IMAGE }}',
124- org: 'hoverkraft-tech',
125- };
126-
127- const packageVersions = await github.paginate(
128- github.rest.packages.getAllPackageVersionsForPackageOwnedByOrg.endpoint.merge(packagePayload)
129- );
130-
131- const packageVersionExists = packageVersions.some(
132- (packageVersion) => packageVersion.metadata.container.tags.some(
133- (tag) => tag === "${{ needs.setup.outputs.tag }}"
134- )
135- );
136- assert.equal(packageVersionExists, false, `Package version "${{ needs.setup.outputs.tag }}" has not been deleted`);
137-
138120 - uses : docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
139121 if : ${{ github.event_name == 'pull_request' }}
140122 with :
141123 registry : ghcr.io
142124 username : ${{ github.repository_owner }}
143- password : ${{ github.token }}
125+ password : ${{ secrets.GITHUB_TOKEN }}
144126
145127 - name : Assert - Ensure current image tag didn't get deleted
146128 if : ${{ github.event_name == 'pull_request' }}
147129 run : |
148- for IMAGE_TAG in $(echo '${{ needs.arrange.outputs.built-images }}' | jq -r '."${{ env.IMAGE }}".images[]'); do
130+ for IMAGE_TAG in $(echo '${{ needs.arrange.outputs.built-images }}' | jq -r '."${{ env.IMAGE_NAME }}".images[]'); do
149131 docker pull "$IMAGE_TAG"
150132
151133 if ! MANIFEST=$(docker manifest inspect "$IMAGE_TAG"); then
@@ -157,7 +139,7 @@ jobs:
157139
158140 # Ensure all manifests digest didn't get deleted
159141 for DIGEST in $(echo "$MANIFEST" | jq -r '.manifests[].digest'); do
160- IMAGE_MANIFEST="ghcr.io/hoverkraft-tech/ci-github-container/${{ env.IMAGE }}@$DIGEST"
142+ IMAGE_MANIFEST="ghcr.io/hoverkraft-tech/ci-github-container/${{ env.IMAGE_NAME }}@$DIGEST"
161143 docker pull "$IMAGE_MANIFEST"
162144 if ! docker manifest inspect "$IMAGE_MANIFEST" > /dev/null; then
163145 echo "Failed to inspect manifest for image: ${IMAGE_MANIFEST}"
@@ -175,32 +157,16 @@ jobs:
175157 steps :
176158 - uses : actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
177159
178- - id : get-issue-number
179- if : ${{ github.event_name == 'pull_request' }}
180- uses : hoverkraft-tech/ci-github-common/actions/get-issue-number@b7dd413209df265bef8d7eb0efb117eaabc684c4 # 0.27.0
181-
182160 - name : Delete test packages
183161 uses : actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
184162 with :
185- github-token : ${{ github.token }}
163+ github-token : ${{ secrets.GITHUB_TOKEN }}
186164 script : |
187- const packagesToDelete = ["${{ env.IMAGE }}", "${{ env.IMAGE }}/cache"];
188-
189- for (const packageName of packagesToDelete) {
190- const packagePayload = {
165+ const packages = process.env.PACKAGES.split("\n").map(packageName => packageName.trim()).filter(Boolean);
166+ await Promise.all(packages.map(packageName => {
167+ return github.rest.packages.deletePackageForOrg({
191168 package_type: 'container',
192- package_name: `ci-github-container/${packageName}`,
193- org: 'hoverkraft-tech',
194- };
195-
196- try {
197- await github.rest.packages.deletePackageForOrg(packagePayload);
198- } catch (error) {
199- if (error.status === 404) {
200- core.warning(`Package "${packagePayload.package_name}" not found.`);
201- } else {
202- throw error;
203- }
204- }
205-
206- }
169+ package_name: packageName,
170+ org: process.env.GITHUB_REPOSITORY_OWNER,
171+ });
172+ }));
0 commit comments