122 lines
2.9 KiB
Bash
Executable File
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"
|