33DRY_RUN=false
44DELETE_PR=false
55DELETE_CI=false
6+ DELETE_UNTAGGED=false
67
78while [[ $# -gt 0 ]]; do
89 case " $1 " in
@@ -18,13 +19,17 @@ while [[ $# -gt 0 ]]; do
1819 DELETE_CI=true
1920 shift
2021 ;;
22+ --delete-untagged)
23+ DELETE_UNTAGGED=true
24+ shift
25+ ;;
2126 --help|-h)
22- echo " Usage: $0 [--dry-run] [--delete-pr] [--delete-ci]"
27+ echo " Usage: $0 [--dry-run] [--delete-pr] [--delete-ci] [--delete-untagged] "
2328 exit 0
2429 ;;
2530 * )
2631 echo " Unknown option: $1 " >&2
27- echo " Usage: $0 [--dry-run] [--delete-pr] [--delete-ci]" >&2
32+ echo " Usage: $0 [--dry-run] [--delete-pr] [--delete-ci] [--delete-untagged] " >&2
2833 exit 1
2934 ;;
3035 esac
@@ -166,7 +171,37 @@ delete_ci_images() {
166171 done <<< " ${tags}"
167172}
168173
174+ delete_untagged_images () {
175+ local container_name=$1
176+ local package_name
177+ local versions_json
169178
179+ if [[ -z " ${container_name} " ]]; then
180+ echo " Container name is required" >&2
181+ return 1
182+ fi
183+
184+ package_name=$( get_container_package_name " ${container_name} " )
185+ versions_json=$( get_container_versions_json " ${container_name} " )
186+
187+ jq -r ' .[] | select(((.metadata.container.tags // []) | length) == 0) | .id' \
188+ <<< " ${versions_json}" \
189+ | while IFS= read -r version_id; do
190+ if [[ -n " ${version_id} " ]]; then
191+ if [[ " ${DRY_RUN} " == " true" ]]; then
192+ echo " [DRY RUN] Would delete untagged image version ID ${version_id} from container ${container_name} ."
193+ else
194+ echo " Deleting untagged image version ID ${version_id} from container ${container_name} ..."
195+ gh api \
196+ -H " Accept: application/vnd.github+json" \
197+ -X DELETE \
198+ " /orgs/nhsdigital/packages/container/${package_name} /versions/${version_id} "
199+ fi
200+ fi
201+ done
202+ }
203+
204+ base_node_folders=$( find src/base_node -mindepth 1 -maxdepth 1 -type d -printf ' %f\n' | jq -R -s -c ' split("\n")[:-1]' )
170205language_folders=$( find src/languages -mindepth 1 -maxdepth 1 -type d -printf ' %f\n' | jq -R -s -c ' split("\n")[:-1]' )
171206project_folders=$( find src/projects -mindepth 1 -maxdepth 1 -type d -printf ' %f\n' | jq -R -s -c ' split("\n")[:-1]' )
172207
@@ -177,6 +212,21 @@ for container_name in $(jq -r '.[]' <<<"${project_folders}"); do
177212 if [[ " ${DELETE_CI} " == " true" ]]; then
178213 delete_ci_images " ${container_name} "
179214 fi
215+ if [[ " ${DELETE_UNTAGGED} " == " true" ]]; then
216+ delete_untagged_images " ${container_name} "
217+ fi
218+ done
219+
220+ for container_name in $( jq -r ' .[]' <<< " ${base_node_folders}" ) ; do
221+ if [[ " ${DELETE_PR} " == " true" ]]; then
222+ delete_pr_images " ${container_name} "
223+ fi
224+ if [[ " ${DELETE_CI} " == " true" ]]; then
225+ delete_ci_images " ${container_name} "
226+ fi
227+ if [[ " ${DELETE_UNTAGGED} " == " true" ]]; then
228+ delete_untagged_images " ${container_name} "
229+ fi
180230done
181231
182232for container_name in $( jq -r ' .[]' <<< " ${language_folders}" ) ; do
@@ -186,6 +236,9 @@ for container_name in $(jq -r '.[]' <<<"${language_folders}"); do
186236 if [[ " ${DELETE_CI} " == " true" ]]; then
187237 delete_ci_images " ${container_name} "
188238 fi
239+ if [[ " ${DELETE_UNTAGGED} " == " true" ]]; then
240+ delete_untagged_images " ${container_name} "
241+ fi
189242done
190243
191244if [[ " ${DELETE_PR} " == " true" ]]; then
194247if [[ " ${DELETE_CI} " == " true" ]]; then
195248 delete_ci_images " base"
196249fi
250+ if [[ " ${DELETE_UNTAGGED} " == " true" ]]; then
251+ delete_untagged_images " base"
252+ fi
0 commit comments