Skip to content

Commit c318439

Browse files
committed
ci: improve tests to pass with workflow_dispatch event
Signed-off-by: Emilien Escalle <[email protected]>
1 parent 0cbf7fe commit c318439

File tree

3 files changed

+114
-45
lines changed

3 files changed

+114
-45
lines changed

.github/workflows/__test-action-docker-build-image.yml

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -109,35 +109,43 @@ jobs:
109109
`"annotations.org.opencontainers.image.url" output is not valid`
110110
);
111111
112+
const expectedTags = [];
113+
let expectedImageVersion;
112114
if (`${{ github.event_name }}` === "pull_request") {
113115
const shortSha = `${{ github.sha }}`.substring(0, 7);
114116
const prShaTag = `pr-${{ github.event.pull_request.number }}-${shortSha}`;
115117
const prTag = `pr-${{ github.event.pull_request.number }}`;
116118
117-
assert.equal(builtImage.tags.length, 2, `"tags" output is not valid`);
118-
119-
assert.equal(builtImage.tags[0], prShaTag, `"tags" output is not valid`);
120-
assert.equal(builtImage.tags[1], prTag, `"tags" output is not valid`);
121-
122-
assert.equal(
123-
builtImage.annotations["org.opencontainers.image.version"],
124-
prTag,
125-
`"annotations.org.opencontainers.image.version" output is not valid`
126-
);
119+
expectedTags.push(prShaTag, prTag);
120+
expectedImageVersion = prShaTag;
127121
} else {
128122
const refTag = `${{ github.ref_name }}`;
123+
expectedTags.push(refTag);
124+
expectedImageVersion = refTag;
129125
130-
assert.equal(builtImage.tags.length, 2, `"tags" output is not valid`);
131-
assert.equal(builtImage.tags[0], refTag, `"tags" output is not valid`);
132-
assert.equal(builtImage.tags[1], "latest", `"tags" output is not valid`);
126+
if (`${{ github.event_name }}` !== "workflow_dispatch") {
127+
expectedTags.push("latest");
128+
}
129+
}
133130
134-
assert.equal(
135-
builtImage.annotations["org.opencontainers.image.version"],
136-
refTag,
137-
`"annotations.org.opencontainers.image.version" output is not valid`
138-
);
131+
assert.equal(
132+
builtImage.tags.length,
133+
expectedTags.length,
134+
`"tags" output is not valid, expected ${expectedTags.length} tags but got ${builtImage.tags.length}`
135+
);
136+
137+
for (const expectedTag of expectedTags) {
138+
if (!builtImage.tags.includes(expectedTag)) {
139+
assert.fail(`Expected tag "${expectedTag}" not found in "tags" output`);
140+
}
139141
}
140142
143+
assert.equal(
144+
builtImage.annotations["org.opencontainers.image.version"],
145+
expectedImageVersion,
146+
`"annotations.org.opencontainers.image.version" output is not valid`
147+
);
148+
141149
- uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
142150
with:
143151
registry: ghcr.io

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

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ jobs:
3131
fi
3232
3333
- id: generate-tag
34+
name: Generate random PR tag
3435
run: |
36+
# Generate a random tag to be deleted that cannot collide with an open PR tag
3537
TAG="pr-$(( 1 + RANDOM % 210))"
3638
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
3739
@@ -55,10 +57,55 @@ jobs:
5557
}
5658
]
5759
60+
arrange-verify:
61+
name: Arrange - Verify built images
62+
runs-on: ubuntu-latest
63+
needs: arrange
64+
permissions:
65+
contents: read
66+
packages: read
67+
outputs:
68+
base-image: ${{ steps.assert-built-images.outputs.base-image }}
69+
steps:
70+
- name: Assert - Ensure images have been built
71+
id: assert-built-images
72+
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
73+
env:
74+
IMAGE_NAME: ${{ env.IMAGE_NAME }}
75+
BUILT_IMAGES: ${{ needs.arrange.outputs.built-images }}
76+
with:
77+
script: |
78+
const packages = process.env.PACKAGES.split("\n").map(packageName => packageName.trim()).filter(Boolean);
79+
80+
for(const packageName of packages) {
81+
const packagePayload = {
82+
package_type: 'container',
83+
package_name: packageName,
84+
org: process.env.GITHUB_REPOSITORY_OWNER,
85+
};
86+
87+
// Ensure that package exists
88+
const packageExists = await github.rest.packages.getPackageForOrganization(packagePayload);
89+
if (!packageExists) {
90+
return core.setFailed(`Package "${packageName}" does not exist`);
91+
}
92+
}
93+
94+
// Ensure base image has been built
95+
const builtImagesOutput = process.env.BUILT_IMAGES;
96+
const builtImages = JSON.parse(builtImagesOutput);
97+
if (!builtImages[process.env.IMAGE_NAME] || !builtImages[process.env.IMAGE_NAME].images.length) {
98+
return core.setFailed(`No built images found for image name "${process.env.IMAGE_NAME}"`);
99+
}
100+
const baseImage = builtImages[process.env.IMAGE_NAME].images[0];
101+
await exec.exec("docker", ["pull", baseImage]);
102+
103+
core.setOutput("base-image", baseImage);
104+
58105
act:
59106
name: Act - Prune pull requests image tags
60107
runs-on: ubuntu-latest
61-
needs: [setup, arrange]
108+
needs: [setup, arrange, arrange-verify]
62109
permissions:
63110
packages: write
64111
steps:
@@ -71,9 +118,13 @@ jobs:
71118
password: ${{ secrets.GITHUB_TOKEN }}
72119

73120
- name: Generate a image tag that should be deleted
121+
env:
122+
BASE_IMAGE: ${{ needs.arrange-verify.outputs.base-image }}
123+
IMAGE_NAME: ${{ env.IMAGE_NAME }}
124+
TAG_TO_DELETE: ${{ needs.setup.outputs.tag }}
125+
BUILT_IMAGES: ${{ needs.arrange.outputs.built-images }}
74126
run: |
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 }}
127+
NEW_IMAGE="ghcr.io/hoverkraft-tech/ci-github-container/$IMAGE_NAME:$TAG_TO_DELETE"
77128
78129
docker pull "$BASE_IMAGE"
79130
docker tag "$BASE_IMAGE" "$NEW_IMAGE"
@@ -91,6 +142,8 @@ jobs:
91142
steps:
92143
- name: Assert - Ensure expected packages versions have been deleted
93144
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
145+
env:
146+
TAG_TO_DELETE: ${{ needs.setup.outputs.tag }}
94147
with:
95148
github-token: ${{ secrets.GITHUB_TOKEN }}
96149
script: |
@@ -105,16 +158,20 @@ jobs:
105158
org: process.env.GITHUB_REPOSITORY_OWNER,
106159
};
107160
161+
// Ensure that package still exists
162+
const packageExists = await github.rest.packages.getPackageForOrganization(packagePayload);
163+
assert(packageExists, `Package "${packageName}" does not exist`);
164+
108165
const packageVersions = await github.paginate(
109166
github.rest.packages.getAllPackageVersionsForPackageOwnedByOrg.endpoint.merge(packagePayload)
110167
);
111168
112169
const packageVersionExists = packageVersions.some(
113170
(packageVersion) => packageVersion.metadata.container.tags.some(
114-
(tag) => tag === "${{ needs.setup.outputs.tag }}"
171+
(tag) => tag === process.env.TAG_TO_DELETE
115172
)
116173
);
117-
assert.equal(packageVersionExists, false, `Package version "${{ needs.setup.outputs.tag }}" has not been deleted`);
174+
assert.equal(packageVersionExists, false, `Package version "${process.env.TAG_TO_DELETE}" has not been deleted`);
118175
}
119176
120177
- uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
@@ -126,6 +183,8 @@ jobs:
126183

127184
- name: Assert - Ensure current image tag didn't get deleted
128185
if: ${{ github.event_name == 'pull_request' }}
186+
env:
187+
IMAGE_NAME: ${{ env.IMAGE_NAME }}
129188
run: |
130189
for IMAGE_TAG in $(echo '${{ needs.arrange.outputs.built-images }}' | jq -r '."${{ env.IMAGE_NAME }}".images[]'); do
131190
docker pull "$IMAGE_TAG"
@@ -139,7 +198,7 @@ jobs:
139198
140199
# Ensure all manifests digest didn't get deleted
141200
for DIGEST in $(echo "$MANIFEST" | jq -r '.manifests[].digest'); do
142-
IMAGE_MANIFEST="ghcr.io/hoverkraft-tech/ci-github-container/${{ env.IMAGE_NAME }}@$DIGEST"
201+
IMAGE_MANIFEST="ghcr.io/hoverkraft-tech/ci-github-container/$IMAGE_NAME@$DIGEST"
143202
docker pull "$IMAGE_MANIFEST"
144203
if ! docker manifest inspect "$IMAGE_MANIFEST" > /dev/null; then
145204
echo "Failed to inspect manifest for image: ${IMAGE_MANIFEST}"

.github/workflows/__test-action-get-image-metadata.yml

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,31 +77,33 @@ jobs:
7777
const tags = tagsOutput.split("\n").filter(Boolean);
7878
assert(tags.length, `"tags" output is empty`);
7979
80-
if (`${{ github.event_name }}` === "pull_request") {
81-
assert.equal(
82-
tags.length,
83-
2,
84-
`"tags" output must contain 2 tags for pull_request event`
85-
);
80+
const expectedTags = [];
8681
87-
assert(
88-
tags[0].startsWith("ghcr.io/hoverkraft-tech/ci-github-container/application-test:pr-${{ github.event.pull_request.number }}-"),
89-
`"tags" output is not valid`
90-
);
82+
if (`${{ github.event_name }}` === "pull_request") {
83+
const shortSha = `${{ github.sha }}`.substring(0, 7);
84+
const prShaTag = `pr-${{ github.event.pull_request.number }}-${shortSha}`;
85+
const prTag = `pr-${{ github.event.pull_request.number }}`;
9186
92-
assert.equal(
93-
tags[1],
94-
"ghcr.io/hoverkraft-tech/ci-github-container/application-test:pr-${{ github.event.pull_request.number }}", `"tags" output is not valid`
95-
);
87+
expectedTags.push(prShaTag, prTag);
9688
} else {
97-
assert.equal(
98-
tags.length,
99-
2,
100-
`"tags" output must contain 2 tags for push event`
101-
);
89+
expectedTags.push("main");
90+
if (`${{ github.event_name }}` !== "workflow_dispatch") {
91+
expectedTags.push("latest");
92+
}
93+
}
94+
95+
assert.equal(
96+
tags.length,
97+
expectedTags.length,
98+
`"tags" output must contain ${expectedTags.length} tags for ${{ github.event_name }} event`
99+
);
102100
103-
assert.equal(tags[0],"ghcr.io/hoverkraft-tech/ci-github-container/application-test:main", `"tags" output is not valid`);
104-
assert.equal(tags[1],"ghcr.io/hoverkraft-tech/ci-github-container/application-test:latest", `"tags" output is not valid`);
101+
for(const expectedTag of expectedTags) {
102+
const fullTag = `ghcr.io/hoverkraft-tech/ci-github-container/application-test:${expectedTag}`;
103+
assert(
104+
tags.includes(fullTag),
105+
`Expected tag "${fullTag}" not found in "tags" output`
106+
);
105107
}
106108
107109
tests-with-given-tag:

0 commit comments

Comments
 (0)