|
|
@@ -53,3 +53,44 @@ for manifest_list in "${manifest_lists[@]}"; do
|
|
|
# Push the manifest list.
|
|
|
docker manifest push --purge ${manifest_list}
|
|
|
done
|
|
|
+
|
|
|
+# Avoid logging credentials and tokens.
|
|
|
+set +ex
|
|
|
+
|
|
|
+# Delete the arch-specific tags, if credentials for doing so are available.
|
|
|
+# Note that `DOCKER_PASSWORD` must be the actual user password. Passing a JWT
|
|
|
+# obtained using a personal access token results in a 403 error with
|
|
|
+# {"detail": "access to the resource is forbidden with personal access token"}
|
|
|
+if [[ -z "${DOCKER_USERNAME}" || -z "${DOCKER_PASSWORD}" ]]; then
|
|
|
+ exit 0
|
|
|
+fi
|
|
|
+
|
|
|
+# Given a JSON input on stdin, extract the string value associated with the
|
|
|
+# specified key. This avoids an extra dependency on a tool like `jq`.
|
|
|
+extract() {
|
|
|
+ local key="$1"
|
|
|
+ # Extract "<key>":"<val>" (assumes key/val won't contain double quotes).
|
|
|
+ # The colon may have whitespace on either side.
|
|
|
+ grep -o "\"${key}\"[[:space:]]*:[[:space:]]*\"[^\"]\+\"" |
|
|
|
+ # Extract just <val> by deleting the last '"', and then greedily deleting
|
|
|
+ # everything up to '"'.
|
|
|
+ sed -e 's/"$//' -e 's/.*"//'
|
|
|
+}
|
|
|
+
|
|
|
+echo ">>> Getting API token..."
|
|
|
+jwt=$(curl -sS -X POST \
|
|
|
+ -H "Content-Type: application/json" \
|
|
|
+ -d "{\"username\":\"${DOCKER_USERNAME}\",\"password\": \"${DOCKER_PASSWORD}\"}" \
|
|
|
+ "https://hub.docker.com/v2/users/login" |
|
|
|
+ extract 'token')
|
|
|
+
|
|
|
+# Strip the registry portion from `index.docker.io/user/repo`.
|
|
|
+repo="${DOCKER_REPO#*/}"
|
|
|
+
|
|
|
+for arch in ${arches[@]}; do
|
|
|
+ tag="${DOCKER_TAG}-${arch}"
|
|
|
+ echo ">>> Deleting '${repo}:${tag}'..."
|
|
|
+ curl -sS -X DELETE \
|
|
|
+ -H "Authorization: Bearer ${jwt}" \
|
|
|
+ "https://hub.docker.com/v2/repositories/${repo}/tags/${tag}/"
|
|
|
+done
|