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.
115 lines
4.9 KiB
Bash
115 lines
4.9 KiB
Bash
#!/usr/bin/env bash
|
|
# Create/update the Gitea Release after all platform package workflows succeed.
|
|
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; }
|
|
|
|
version="${tag#v}"
|
|
gitea_base="${GITEA_BASE:-http://192.168.2.162:3100}"
|
|
gitea_base="${gitea_base%/}"
|
|
gitea_host="${gitea_base#https://}"
|
|
gitea_host="${gitea_host#http://}"
|
|
gitea_host="${gitea_host%%/*}"
|
|
gitea_host="${gitea_host%%:*}"
|
|
api="$gitea_base/api/v1/repos/justme/MoShiro"
|
|
tmp="$(mktemp -d)"
|
|
netrc="$tmp/netrc"
|
|
release_json="$tmp/release.json"
|
|
assets_json="$tmp/assets.json"
|
|
chmod 700 "$tmp"
|
|
printf 'machine %s login justme password %s\n' "$gitea_host" "$GITEA_TOKEN" > "$netrc"
|
|
chmod 600 "$netrc"
|
|
trap 'rm -rf "$tmp"' EXIT
|
|
|
|
release_body="Agent and Probe builds: Linux glibc and musl (x64, arm64), macOS (x64, arm64), and Windows (x64, arm64). Linux glibc Agent and Probe OCI images: registry.oeo.one/moshiro/moshiro-agent:$version and registry.oeo.one/moshiro/moshiro-probe:$version (linux/amd64 and linux/arm64). Backend OCI image: registry.oeo.one/moshiro/moshiro-backend:$version (linux/amd64 and linux/arm64). macOS binaries are not Developer ID signed or notarized."
|
|
payload="$(printf '{"tag_name":"%s","target_commitish":"%s","name":"MoShiro %s","body":"%s","draft":false,"prerelease":false}' \
|
|
"$tag" "${CI_COMMIT_SHA:-}" "$tag" "$release_body")"
|
|
release_status="$(curl --silent --show-error --retry 3 --netrc-file "$netrc" \
|
|
--output "$release_json" --write-out '%{http_code}' "$api/releases/tags/$tag")"
|
|
release_created=false
|
|
if [[ "$release_status" == 404 ]]; then
|
|
release_status="$(curl --silent --show-error --retry 3 --netrc-file "$netrc" \
|
|
--header 'Content-Type: application/json' --data "$payload" \
|
|
--output "$release_json" --write-out '%{http_code}' "$api/releases")"
|
|
release_created=true
|
|
fi
|
|
[[ "$release_status" =~ ^2 ]] || {
|
|
echo "Gitea Release lookup/create failed (HTTP $release_status)" >&2
|
|
cat "$release_json" >&2
|
|
exit 1
|
|
}
|
|
release_id="$(grep -o '"id":[[:space:]]*[0-9][0-9]*' "$release_json" | head -1 | tr -cd '0-9')"
|
|
[[ -n "$release_id" ]] || { echo "Could not read Gitea Release ID" >&2; exit 1; }
|
|
if [[ "$release_created" == false ]]; then
|
|
update_response="$tmp/release-update.json"
|
|
update_status="$(curl --silent --show-error --retry 3 --netrc-file "$netrc" \
|
|
--request PATCH --header 'Content-Type: application/json' --data "$payload" \
|
|
--output "$update_response" --write-out '%{http_code}' "$api/releases/$release_id")"
|
|
[[ "$update_status" =~ ^2 ]] || {
|
|
echo "Gitea Release update failed (HTTP $update_status)" >&2
|
|
cat "$update_response" >&2
|
|
exit 1
|
|
}
|
|
fi
|
|
curl --fail-with-body --silent --show-error --retry 3 --netrc-file "$netrc" \
|
|
"$api/releases/$release_id/assets" -o "$assets_json"
|
|
|
|
assets=(
|
|
"moshiro-agent-v$version-linux-amd64.tar.gz"
|
|
"moshiro-agent-v$version-linux-arm64.tar.gz"
|
|
"moshiro-probe-v$version-linux-amd64.tar.gz"
|
|
"moshiro-probe-v$version-linux-arm64.tar.gz"
|
|
"moshiro-agent-v$version-linux-musl-amd64.tar.gz"
|
|
"moshiro-probe-v$version-linux-musl-amd64.tar.gz"
|
|
"moshiro-agent-v$version-linux-musl-arm64.tar.gz"
|
|
"moshiro-probe-v$version-linux-musl-arm64.tar.gz"
|
|
"moshiro-agent-v$version-macos-x64.tar.gz"
|
|
"moshiro-probe-v$version-macos-x64.tar.gz"
|
|
"moshiro-agent-v$version-macos-arm64.tar.gz"
|
|
"moshiro-probe-v$version-macos-arm64.tar.gz"
|
|
"moshiro-agent-v$version-windows-amd64.zip"
|
|
"moshiro-agent-v$version-windows-arm64.zip"
|
|
"moshiro-probe-v$version-windows-amd64.zip"
|
|
"moshiro-probe-v$version-windows-arm64.zip"
|
|
)
|
|
|
|
upload_release_asset() {
|
|
local name="$1" file="$tmp/$1" upload_response="$tmp/$1.upload.json" status
|
|
curl --fail-with-body --silent --show-error --retry 3 --netrc-file "$netrc" \
|
|
"$gitea_base/api/packages/justme/generic/moshiro-node/$version/$name" -o "$file"
|
|
status="$(curl --silent --show-error --retry 3 --netrc-file "$netrc" \
|
|
--request POST --header 'Content-Type: application/octet-stream' --data-binary "@$file" \
|
|
--output "$upload_response" --write-out '%{http_code}' \
|
|
"$api/releases/$release_id/assets?name=$name")"
|
|
case "$status" in
|
|
2*) echo "attached $name" ;;
|
|
*) echo "Gitea Release asset upload failed for $name (HTTP $status)" >&2; cat "$upload_response" >&2; return 1 ;;
|
|
esac
|
|
}
|
|
|
|
pids=()
|
|
for archive in "${assets[@]}"; do
|
|
for name in "$archive" "$archive.sha256"; do
|
|
if grep -Eq "\"name\"[[:space:]]*:[[:space:]]*\"$name\"" "$assets_json"; then
|
|
echo "release asset $name already exists; keeping the existing asset"
|
|
continue
|
|
fi
|
|
upload_release_asset "$name" &
|
|
pids+=("$!")
|
|
if ((${#pids[@]} >= 8)); then
|
|
wait "${pids[0]}"
|
|
pids=("${pids[@]:1}")
|
|
fi
|
|
done
|
|
done
|
|
for pid in "${pids[@]}"; do
|
|
wait "$pid"
|
|
done
|
|
|
|
echo "published Gitea Release $tag: https://git.oeo.one/justme/MoShiro/releases/tag/$tag"
|