-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdelete_unused_images.sh
More file actions
executable file
·95 lines (76 loc) · 2.66 KB
/
delete_unused_images.sh
File metadata and controls
executable file
·95 lines (76 loc) · 2.66 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
#!/usr/bin/env bash
set -e
get_container_package_name() {
local container_name=$1
if [[ -z "${container_name}" ]]; then
echo "Container name is required" >&2
return 1
fi
# URL-encode the package path (eps-devcontainers/${container_name}) for the GH API
printf 'eps-devcontainers/%s' "${container_name}" | jq -sRr @uri
}
get_container_versions_json() {
local container_name=$1
local package_name
package_name=$(get_container_package_name "${container_name}")
gh api \
-H "Accept: application/vnd.github+json" \
"/orgs/nhsdigital/packages/container/${package_name}/versions" \
--paginate
}
delete_pr_images() {
local container_name=$1
local package_name
local versions_json
local tags
if [[ -z "${container_name}" ]]; then
echo "Container name is required" >&2
return 1
fi
package_name=$(get_container_package_name "${container_name}")
versions_json=$(get_container_versions_json "${container_name}")
tags=$(jq -r '[.[].metadata.container.tags[]?] | unique | .[]' <<<"${versions_json}")
if [[ -z "${tags}" ]]; then
return 0
fi
while IFS= read -r tag; do
if [[ "${tag}" =~ ^pr-[0-9]+- ]]; then
local pull_request
local pr_json
local pr_state
pull_request=${tag#pr-}
pull_request=${pull_request%%-*}
if ! pr_json=$(gh api \
-H "Accept: application/vnd.github+json" \
"/repos/NHSDigital/eps-devcontainers/pulls/${pull_request}"); then
continue
fi
echo "Checking PR #${pull_request} for tag ${tag} in container ${container_name}..."
pr_state=$(jq -r '.state // empty' <<<"${pr_json}")
if [[ "${pr_state}" != "closed" ]]; then
echo "State is not closed - not deleting images"
continue
fi
jq -r --arg tag "${tag}" '.[] | select(.metadata.container.tags[]? == $tag) | .id' \
<<<"${versions_json}" \
| while IFS= read -r version_id; do
if [[ -n "${version_id}" ]]; then
echo "Deleting image with tag ${tag} (version ID: ${version_id}) from container ${container_name}..."
gh api \
-H "Accept: application/vnd.github+json" \
-X DELETE \
"/orgs/nhsdigital/packages/container/${package_name}/versions/${version_id}"
fi
done
fi
done <<<"${tags}"
}
language_folders=$(find src/languages -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | jq -R -s -c 'split("\n")[:-1]')
project_folders=$(find src/projects -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | jq -R -s -c 'split("\n")[:-1]')
for container_name in $(jq -r '.[]' <<<"${project_folders}"); do
delete_pr_images "${container_name}"
done
for container_name in $(jq -r '.[]' <<<"${language_folders}"); do
delete_pr_images "${container_name}"
done
delete_pr_images "base"