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.
120 lines
4.4 KiB
Bash
120 lines
4.4 KiB
Bash
#!/usr/bin/env bash
|
|
# Publish musl OCI images for the Linux Agent and Probe on amd64 and arm64.
|
|
set -euo pipefail
|
|
|
|
tag="${CI_COMMIT_TAG:-}"
|
|
[[ "$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
|
|
}
|
|
[[ -n "${GITEA_TOKEN:-}" ]] || { echo "GITEA_TOKEN is required" >&2; exit 2; }
|
|
[[ -n "${ZOT_USERNAME:-}" && -n "${ZOT_SECRET:-}" ]] || {
|
|
echo "Zot credentials are required" >&2
|
|
exit 2
|
|
}
|
|
|
|
version="${tag#v}"
|
|
root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
project_version="$(sed -n 's#.*<Version>\(.*\)</Version>.*#\1#p' "$root/backend/Directory.Build.props" | head -1)"
|
|
if [[ "$version" != "$project_version" ]]; then
|
|
echo "tag version $version does not match project version $project_version" >&2
|
|
exit 1
|
|
fi
|
|
|
|
gitea_base="${GITEA_BASE:-http://127.0.0.1:3100}"
|
|
gitea_base="${gitea_base%/}"
|
|
gitea_host="${gitea_base#https://}"
|
|
gitea_host="${gitea_host#http://}"
|
|
gitea_host="${gitea_host%%/*}"
|
|
gitea_host="${gitea_host%%:*}"
|
|
registry="${ZOT_REGISTRY:-registry.oeo.one}"
|
|
image_root="$registry/moshiro"
|
|
work="$root/.release/node-images"
|
|
netrc="$work/netrc"
|
|
buildah_home="/home/justme/woodpecker/buildah-home/node-images"
|
|
mkdir -p "$buildah_home"
|
|
export HOME="$buildah_home"
|
|
mkdir -p "$work"
|
|
chmod 700 "$work"
|
|
printf 'machine %s login justme password %s\n' "$gitea_host" "$GITEA_TOKEN" > "$netrc"
|
|
chmod 600 "$netrc"
|
|
export REGISTRY_AUTH_FILE="$work/zot-auth.json"
|
|
trap 'rm -rf "$work"' EXIT
|
|
|
|
logged_in=false
|
|
for attempt in 1 2 3 4; do
|
|
if buildah login --tls-verify=true --username "$ZOT_USERNAME" --password-stdin "$registry" <<< "$ZOT_SECRET" >/dev/null; then
|
|
logged_in=true
|
|
break
|
|
fi
|
|
if [[ "$attempt" -lt 4 ]]; then
|
|
echo "Zot login attempt $attempt failed; retrying in 3 seconds" >&2
|
|
sleep 3
|
|
fi
|
|
done
|
|
[[ "$logged_in" == true ]] || { echo "could not authenticate to Zot after 4 attempts" >&2; exit 1; }
|
|
|
|
build_arch_image() {
|
|
local component="$1" arch="$2" suffix="$3"
|
|
local filename="moshiro-$component-v$version-linux-$suffix.tar.gz"
|
|
local context="$work/$component-$arch"
|
|
local archive="$work/$filename"
|
|
local containerfile="$root/packaging/container/${component^}.Containerfile"
|
|
local image="$image_root/moshiro-$component"
|
|
local local_image="localhost/moshiro-$component:$version-$arch"
|
|
|
|
curl --fail-with-body --silent --show-error --retry 3 --netrc-file "$netrc" \
|
|
"$gitea_base/api/packages/justme/generic/moshiro-node/$version/$filename" -o "$archive"
|
|
mkdir -p "$context/app" "$context/config"
|
|
if [[ "$component" == agent ]]; then
|
|
tar -xzf "$archive" -C "$work" moshiro-agent fleet-enroll
|
|
install -m 0755 "$work/fleet-enroll" "$context/app/fleet-enroll"
|
|
else
|
|
tar -xzf "$archive" -C "$work" "moshiro-$component"
|
|
fi
|
|
install -m 0755 "$work/moshiro-$component" "$context/app/moshiro-$component"
|
|
: > "$context/config/.keep"
|
|
|
|
buildah bud --tls-verify=true --arch "$arch" \
|
|
--build-arg "APP_VERSION=$version" \
|
|
-f "$containerfile" -t "$local_image" "$context" >/dev/null
|
|
|
|
local pushed=false
|
|
for attempt in 1 2 3; do
|
|
if buildah push --tls-verify=true "$local_image" "docker://$image:$version-$arch" >/dev/null; then
|
|
pushed=true
|
|
break
|
|
fi
|
|
if [[ "$attempt" -lt 3 ]]; then
|
|
echo "Zot push for $component/$arch attempt $attempt failed; retrying in 5 seconds" >&2
|
|
sleep 5
|
|
fi
|
|
done
|
|
[[ "$pushed" == true ]] || { echo "could not push $component/$arch image after 3 attempts" >&2; return 1; }
|
|
echo "pushed Zot image $image:$version-$arch"
|
|
}
|
|
|
|
publish_index() {
|
|
local component="$1" image="$image_root/moshiro-$component"
|
|
local manifest="localhost/moshiro-$component:$version-multiarch"
|
|
buildah manifest rm "$manifest" >/dev/null 2>&1 || true
|
|
buildah manifest create "$manifest" >/dev/null
|
|
buildah manifest add "$manifest" "docker://$image:$version-amd64" >/dev/null
|
|
buildah manifest add "$manifest" "docker://$image:$version-arm64" >/dev/null
|
|
buildah manifest push --all --format oci "$manifest" "docker://$image:$version" >/dev/null
|
|
if [[ "$version" != *-* ]]; then
|
|
buildah manifest push --all --format oci "$manifest" "docker://$image:latest" >/dev/null
|
|
fi
|
|
buildah manifest rm "$manifest" >/dev/null
|
|
echo "published multi-architecture index $image:$version"
|
|
if [[ "$version" != *-* ]]; then
|
|
echo "published multi-architecture index $image:latest"
|
|
fi
|
|
}
|
|
|
|
for component in agent probe; do
|
|
build_arch_image "$component" amd64 musl-amd64
|
|
build_arch_image "$component" arm64 musl-arm64
|
|
publish_index "$component"
|
|
done
|