Skip to content

Commit 85d3276

Browse files
Copilotneilime
andcommitted
feat: add clean-images action wrapper
Co-authored-by: neilime <[email protected]> Signed-off-by: Emilien Escalle <[email protected]>
1 parent 82858e2 commit 85d3276

File tree

9 files changed

+380
-159
lines changed

9 files changed

+380
-159
lines changed

.github/workflows/__test-action-docker-prune-pull-requests-image-tags.yml

Lines changed: 40 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ permissions:
1313
id-token: write
1414

1515
env:
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
1821
jobs:
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

@@ -69,8 +72,8 @@ jobs:
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+
}));

.github/workflows/__test-workflow-docker-build-images-platforms-and-signing.yml

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ jobs:
122122
with:
123123
registry: ghcr.io
124124
username: ${{ github.repository_owner }}
125-
password: ${{ github.token }}
125+
password: ${{ secrets.GITHUB_TOKEN }}
126126

127127
- name: Verify image exists
128128
env:
@@ -274,16 +274,20 @@ jobs:
274274
strategy:
275275
fail-fast: false
276276
matrix: ${{ fromJson(needs.arrange.outputs.matrix) }}
277+
permissions:
278+
packages: write
277279
steps:
278-
- name: Delete ephemeral test packages
280+
- name: Delete test packages
281+
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
279282
env:
280-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
281283
IMAGE_NAME: ${{ matrix.image-name }}
282-
run: |
283-
gh api \
284-
--method DELETE \
285-
-H "Accept: application/vnd.github+json" \
286-
-H "X-GitHub-Api-Version: 2022-11-28" \
287-
/orgs/${{ github.repository_owner }}/packages/container/ci-github-container%2F"${IMAGE_NAME}" || echo "No ${IMAGE_NAME} package to delete"
284+
with:
285+
github-token: ${{ secrets.GITHUB_TOKEN }}
286+
script: |
287+
await github.rest.packages.deletePackageForOrg({
288+
package_type: 'container',
289+
package_name: `ci-github-container/${process.env.IMAGE_NAME}`,
290+
org: 'hoverkraft-tech',
291+
});
288292
289293
# jscpd:ignore-end

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ _Actions that operate on OCI images across their build, metadata, and lifecycle
2424

2525
#### - [Build image](actions/docker/build-image/README.md)
2626

27+
#### - [Clean images](actions/docker/clean-images/README.md)
28+
2729
#### - [Create images manifests](actions/docker/create-images-manifests/README.md)
2830

2931
#### - [Get image metadata](actions/docker/get-image-metadata/README.md)

0 commit comments

Comments
 (0)