#!/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 " >&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"