Namespaces, assemblies, projects and directories, the solution, binaries, images, systemd units, config paths, environment variables, protocol method names, the media type and the raw chunk magic all move to MoShiro/moshiro. Existing data and deployments are not compatible and must be recreated. Also fix the architecture tests after the solution layout change and make the update tests independent of their order.
56 lines
2.3 KiB
Bash
56 lines
2.3 KiB
Bash
#!/usr/bin/env bash
|
|
# Publish a multi-architecture OCI index for the two architecture-specific
|
|
# Backend images already pushed by release-linux.sh.
|
|
set -euo pipefail
|
|
|
|
version="${CI_COMMIT_TAG#v}"
|
|
[[ "${CI_COMMIT_TAG:-}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$ ]] || {
|
|
echo "release must run from a vMAJOR.MINOR.PATCH tag" >&2
|
|
exit 2
|
|
}
|
|
|
|
registry="${ZOT_REGISTRY:-registry.oeo.one}"
|
|
scheme="${ZOT_SCHEME:-https}"
|
|
image="moshiro/moshiro-backend"
|
|
auth_file="$(mktemp)"
|
|
chmod 600 "$auth_file"
|
|
trap 'rm -f "$auth_file"' EXIT
|
|
printf 'machine %s login %s password %s\n' "${registry%%:*}" "$ZOT_USERNAME" "$ZOT_SECRET" > "$auth_file"
|
|
|
|
accept='application/vnd.oci.image.manifest.v1+json, application/vnd.docker.distribution.manifest.v2+json, application/vnd.oci.image.index.v1+json, application/vnd.docker.distribution.manifest.list.v2+json'
|
|
|
|
manifest_head() {
|
|
local tag="$1"
|
|
curl --silent --show-error --fail --head --netrc-file "$auth_file" \
|
|
-H "Accept: $accept" "$scheme://$registry/v2/$image/manifests/$tag" \
|
|
| tr -d '\r' | awk '
|
|
tolower($1)=="docker-content-digest:" { digest=$2 }
|
|
tolower($1)=="content-length:" { size=$2 }
|
|
tolower($1)=="content-type:" { media=$2 }
|
|
END { if (digest && size && media) print digest, size, media; else exit 1 }'
|
|
}
|
|
|
|
amd="$(manifest_head "$version-amd64")"
|
|
arm="$(manifest_head "$version-arm64")"
|
|
read -r amd_digest amd_size amd_media <<< "$amd"
|
|
read -r arm_digest arm_size arm_media <<< "$arm"
|
|
index_media='application/vnd.oci.image.index.v1+json'
|
|
body="$(printf '{"schemaVersion":2,"mediaType":"%s","manifests":[{"mediaType":"%s","digest":"%s","size":%s,"platform":{"architecture":"amd64","os":"linux"}},{"mediaType":"%s","digest":"%s","size":%s,"platform":{"architecture":"arm64","os":"linux"}}]}' \
|
|
"$index_media" "$amd_media" "$amd_digest" "$amd_size" "$arm_media" "$arm_digest" "$arm_size")"
|
|
|
|
put_tag() {
|
|
local tag="$1" code
|
|
code="$(curl --silent --show-error --netrc-file "$auth_file" -o /dev/null -w '%{http_code}' \
|
|
-H "Content-Type: $index_media" -X PUT --data-binary "$body" \
|
|
"$scheme://$registry/v2/$image/manifests/$tag")"
|
|
case "$code" in
|
|
200|201) echo "published $image:$tag" ;;
|
|
*) echo "failed to publish $image:$tag (HTTP $code)" >&2; return 1 ;;
|
|
esac
|
|
}
|
|
|
|
put_tag "$version"
|
|
if [[ "$version" != *-* ]]; then
|
|
put_tag latest
|
|
fi
|