ocgo/scripts/release.sh
2026-05-05 10:13:15 +02:00

161 lines
4.1 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
APP_NAME="${APP_NAME:-ocgo}"
CMD_PATH="${CMD_PATH:-./cmd/ocgo}"
TAG="${1:-${TAG:-}}"
if [[ -z "$TAG" ]]; then
echo "Usage: $0 v0.1.0"
echo " or: TAG=v0.1.0 make release"
exit 1
fi
VERSION="${TAG#v}"
REPO="${GITHUB_REPOSITORY:-emanuelcasco/ocgo}"
if [[ -z "$REPO" ]]; then
origin_url="$(git config --get remote.origin.url || true)"
if [[ "$origin_url" =~ github.com[:/]([^/]+)/([^/.]+)(\.git)?$ ]]; then
REPO="${BASH_REMATCH[1]}/${BASH_REMATCH[2]}"
else
echo "Set GITHUB_REPOSITORY=owner/repo, or configure a GitHub origin remote."
exit 1
fi
fi
HOMEBREW_TAP_REPO="${HOMEBREW_TAP_REPO:-emanuelcasco/homebrew-tap}"
if ! command -v gh >/dev/null 2>&1; then
echo "GitHub CLI is required: brew install gh && gh auth login"
exit 1
fi
if ! gh auth status >/dev/null 2>&1; then
echo "GitHub CLI is not authenticated. Run: gh auth login"
exit 1
fi
if ! command -v go >/dev/null 2>&1; then
echo "Go is required."
exit 1
fi
if ! git diff --quiet || ! git diff --cached --quiet; then
echo "Working tree has uncommitted changes. Commit or stash them first."
exit 1
fi
# Verify the project builds/tests before tagging.
go test ./...
if ! git rev-parse "$TAG" >/dev/null 2>&1; then
git tag -a "$TAG" -m "$TAG"
fi
git push origin "$TAG"
DIST_DIR="dist"
rm -rf "$DIST_DIR"
mkdir -p "$DIST_DIR"
build_one() {
local goos="$1"
local goarch="$2"
local arch_name="$goarch"
if [[ "$goarch" == "amd64" ]]; then
arch_name="x86_64"
fi
local dir="$DIST_DIR/${APP_NAME}_${VERSION}_${goos}_${arch_name}"
mkdir -p "$dir"
local bin="$APP_NAME"
if [[ "$goos" == "windows" ]]; then
bin="$APP_NAME.exe"
fi
echo "Building $goos/$goarch..."
CGO_ENABLED=0 GOOS="$goos" GOARCH="$goarch" \
go build -trimpath -ldflags "-s -w -X main.version=$VERSION" -o "$dir/$bin" "$CMD_PATH"
cp README.md "$dir/" 2>/dev/null || true
cp LICENSE "$dir/" 2>/dev/null || true
tar -C "$DIST_DIR" -czf "$dir.tar.gz" "$(basename "$dir")"
rm -rf "$dir"
}
build_one darwin amd64
build_one darwin arm64
build_one linux amd64
build_one linux arm64
(
cd "$DIST_DIR"
shasum -a 256 *.tar.gz > checksums.txt
)
if gh release view "$TAG" --repo "$REPO" >/dev/null 2>&1; then
echo "GitHub release $TAG already exists; uploading artifacts with --clobber."
gh release upload "$TAG" "$DIST_DIR"/*.tar.gz "$DIST_DIR/checksums.txt" --repo "$REPO" --clobber
else
gh release create "$TAG" "$DIST_DIR"/*.tar.gz "$DIST_DIR/checksums.txt" \
--repo "$REPO" \
--title "$TAG" \
--generate-notes
fi
# Update Homebrew tap formula to install the macOS artifacts.
TAP_TMP="$(mktemp -d)"
trap 'rm -rf "$TAP_TMP"' EXIT
gh repo clone "$HOMEBREW_TAP_REPO" "$TAP_TMP" -- --quiet
mkdir -p "$TAP_TMP/Formula"
DARWIN_ARM_SHA="$(shasum -a 256 "$DIST_DIR/${APP_NAME}_${VERSION}_darwin_arm64.tar.gz" | awk '{print $1}')"
DARWIN_AMD_SHA="$(shasum -a 256 "$DIST_DIR/${APP_NAME}_${VERSION}_darwin_x86_64.tar.gz" | awk '{print $1}')"
cat > "$TAP_TMP/Formula/${APP_NAME}.rb" <<EOF_FORMULA
class Ocgo < Formula
desc "Run Claude Code through an OpenCode Go-compatible Anthropic proxy"
homepage "https://github.com/${REPO}"
version "${VERSION}"
license "MIT"
on_macos do
if Hardware::CPU.arm?
url "https://github.com/${REPO}/releases/download/${TAG}/${APP_NAME}_${VERSION}_darwin_arm64.tar.gz"
sha256 "${DARWIN_ARM_SHA}"
else
url "https://github.com/${REPO}/releases/download/${TAG}/${APP_NAME}_${VERSION}_darwin_x86_64.tar.gz"
sha256 "${DARWIN_AMD_SHA}"
end
end
def install
bin.install "${APP_NAME}"
end
test do
system "#{bin}/${APP_NAME}", "--help"
end
end
EOF_FORMULA
(
cd "$TAP_TMP"
git add "Formula/${APP_NAME}.rb"
if git diff --cached --quiet; then
echo "Homebrew formula is already up to date."
else
git commit -m "Update ${APP_NAME} to ${TAG}"
git push
fi
)
TAP_OWNER="${HOMEBREW_TAP_REPO%%/*}"
TAP_REPO_NAME="${HOMEBREW_TAP_REPO#*/}"
TAP_NAME="${TAP_REPO_NAME#homebrew-}"
echo "Release complete: https://github.com/${REPO}/releases/tag/${TAG}"
echo "Install with: brew install ${TAP_OWNER}/${TAP_NAME}/${APP_NAME}"