better-argo-tunnels/ship.sh

122 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# Reliable release: commit → local binaries → multi-arch images → GHCR → git push.
# Only input: commit message. Edit CONSTANTS to change registry/platforms.
#
# Usage: ./ship.sh "your message"
set -euo pipefail
if [[ $# -lt 1 ]] || [[ -z "${1// }" ]]; then
echo "usage: $0 <commit message>" >&2
exit 1
fi
COMMIT_MSG="$*"
ROOT="$(cd "$(dirname "$0")" && pwd)"
cd "$ROOT"
# --- CONSTANTS ---
GITHUB_OWNER="Leopere"
GITHUB_REPO="better-argo-tunnels"
REGISTRY_BASE="ghcr.io/leopere/better-argo-tunnels"
TAG_SERVER="production"
TAG_CLIENT="client-production"
PLATFORMS="linux/amd64,linux/arm64,linux/arm/v7"
GIT_REMOTE="github"
# --- end ---
for cmd in gh docker git go; do
command -v "$cmd" >/dev/null 2>&1 || {
echo "error: need $cmd in PATH" >&2
exit 1
}
done
BRANCH="$(git branch --show-current)"
if [[ -z "$BRANCH" ]]; then
echo "error: detached HEAD" >&2
exit 1
fi
echo "==> git add -A"
git add -A
if git diff --cached --quiet; then
echo "error: nothing to commit" >&2
exit 1
fi
echo "==> git commit"
git commit -m "$COMMIT_MSG"
GIT_COMMIT="$(git rev-parse HEAD)"
BA=(--build-arg "GIT_COMMIT=$GIT_COMMIT")
LDFLAGS="-s -w -X github.com/nixc/reverse-ssh-traefik/internal/buildinfo.Commit=${GIT_COMMIT}"
echo "==> go build → dist/"
mkdir -p dist
CGO_ENABLED=0 go build -ldflags="$LDFLAGS" -o dist/tunnel-server ./cmd/server/
CGO_ENABLED=0 go build -ldflags="$LDFLAGS" -o dist/tunnel-client ./cmd/client/
pick_builder() {
if docker buildx inspect orbstack >/dev/null 2>&1; then
echo "orbstack"
else
echo "default"
fi
}
platform_slug() {
local p="${1// /}"
p="${p#linux/}"
echo "${p//\//-}"
}
push_multi() {
local target="$1"
local final_tag="$2"
local builder="$3"
local base="${final_tag%:*}"
local name="${final_tag##*:}"
local arch_refs=()
IFS=',' read -ra plats <<< "$PLATFORMS"
for p in "${plats[@]}"; do
p="${p// /}"
[[ -z "$p" ]] && continue
local slug
slug="$(platform_slug "$p")"
local arch_tag="${base}:${name}-${slug}"
echo "==> docker buildx $target $p$arch_tag"
docker buildx build \
"${BA[@]}" \
--builder "$builder" \
--platform "$p" \
--target "$target" \
-t "$arch_tag" \
--push \
"$ROOT"
arch_refs+=("$arch_tag")
done
docker buildx imagetools create -t "$final_tag" "${arch_refs[@]}"
}
BUILDER="$(pick_builder)"
SERVER_TAG="${REGISTRY_BASE}:${TAG_SERVER}"
CLIENT_TAG="${REGISTRY_BASE}:${TAG_CLIENT}"
echo "==> ghcr.io login (needs gh token with write:packages)"
echo "$(gh auth token)" | docker login ghcr.io -u "$GITHUB_OWNER" --password-stdin
push_multi server "$SERVER_TAG" "$BUILDER"
push_multi client "$CLIENT_TAG" "$BUILDER"
if ! git remote get-url "$GIT_REMOTE" >/dev/null 2>&1; then
echo "error: git remote '$GIT_REMOTE' missing" >&2
exit 1
fi
echo "==> git push $GIT_REMOTE $BRANCH"
git push "$GIT_REMOTE" "$BRANCH"
echo "==> ok commit=$GIT_COMMIT"
echo " $SERVER_TAG $CLIENT_TAG"