From 5da0c87d194654a6a5f40982df35d17d573eea5e Mon Sep 17 00:00:00 2001 From: muava12 Date: Wed, 25 Feb 2026 09:07:25 +0800 Subject: [PATCH] ci(build): add amd64 build workflow and fix release conflicts Add build-amd64.yml workflow mirroring build-arm64.yml for x86_64 Debian builds. Both workflows now use create-or-upload pattern (gh release create || gh release upload --clobber) to prevent tag conflicts when running concurrently. Fix install_picoclaw.sh detect_arch() to return "x86_64" instead of "amd64" to match GoReleaser archive naming convention. --- .github/workflows/build-amd64.yml | 111 ++++++++++++++++++++++++++++++ .github/workflows/build-arm64.yml | 6 +- install_picoclaw.sh | 54 ++++++++++----- 3 files changed, 153 insertions(+), 18 deletions(-) create mode 100644 .github/workflows/build-amd64.yml diff --git a/.github/workflows/build-amd64.yml b/.github/workflows/build-amd64.yml new file mode 100644 index 000000000..0b2cfcc94 --- /dev/null +++ b/.github/workflows/build-amd64.yml @@ -0,0 +1,111 @@ +name: Build Linux AMD64 (GoReleaser) + +on: + workflow_dispatch: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build-amd64: + name: Build Linux AMD64 + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: 📢 Notify Start + run: | + curl \ + -H "Title: Deploy picoclaw Linux AMD64 Started 🚀" \ + -H "Tags: rocket,construction_worker" \ + -H "Priority: default" \ + -d "Branch: ${{ github.ref_name }} | Commit: ${{ github.sha }}" \ + https://ntfy.sh/deploy-on-github-xasr6KBz47PjswPf53A78Fib + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Go + id: setup-go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + + - name: Determine Fork Version + id: version + run: | + # Dapatkan tag terbaru dari history (mungkin sudah ada akhiran -fork) + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0") + + # Hilangkan akhiran -fork-* agar kita mendapatkan base version aslinya (misal: v0.1.2) + BASE_TAG=$(echo "$LATEST_TAG" | sed -E 's/-fork-[0-9]+//g') + + # Format increment number menggunakan run number (misal: 01, 02) + RUN_NUM=$(printf "%02d" ${{ github.run_number }}) + + # Gabungkan menjadi versi custom untuk fork + FORK_VERSION="${BASE_TAG}-fork-${RUN_NUM}" + + echo "Ditemukan tag asli: $BASE_TAG" + echo "Versi fork yang digunakan: $FORK_VERSION" + echo "FORK_VERSION=$FORK_VERSION" >> $GITHUB_ENV + + - name: Restrict GoReleaser to linux/amd64 + run: | + yq -i '.project_name = "picoclaw"' .goreleaser.yaml + yq -i '.builds[0].goos = ["linux"]' .goreleaser.yaml + yq -i '.builds[0].goarch = ["amd64"]' .goreleaser.yaml + yq -i 'del(.builds[0].ignore)' .goreleaser.yaml + yq -i 'del(.dockers_v2)' .goreleaser.yaml + yq -i '.snapshot.version_template = "{{ .Env.GORELEASER_CURRENT_TAG }}"' .goreleaser.yaml + + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 + with: + distribution: goreleaser + version: ~> v2 + args: release --clean --snapshot + env: + GOVERSION: ${{ steps.setup-go.outputs.go-version }} + # Override GORELEASER_CURRENT_TAG agar binary terkompilasi dengan versi yang benar + GORELEASER_CURRENT_TAG: ${{ env.FORK_VERSION }} + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: picoclaw-linux-amd64-${{ env.FORK_VERSION }} + path: dist/*.tar.gz + if-no-files-found: warn + + - name: Create or Update GitHub Release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Coba buat release baru, jika sudah ada maka upload asset saja + gh release create "${{ env.FORK_VERSION }}" dist/*.tar.gz \ + --title "Fork Build ${{ env.FORK_VERSION }}" \ + --notes "Automated release from branch ${{ github.ref_name }}." \ + || gh release upload "${{ env.FORK_VERSION }}" dist/*.tar.gz --clobber + + - name: 📢 Notify Success + if: success() + run: | + curl \ + -H "Title: Deploy picoclaw Linux AMD64 Success ✅" \ + -H "Tags: white_check_mark,partying_face" \ + -H "Priority: high" \ + -d "Build artifact picoclaw-linux-amd64-${{ env.FORK_VERSION }} has been successfully uploaded." \ + https://ntfy.sh/deploy-on-github-xasr6KBz47PjswPf53A78Fib + + - name: 📢 Notify Failure + if: failure() + run: | + curl \ + -H "Title: Deploy picoclaw Linux AMD64 Failed ❌" \ + -H "Tags: x,skull" \ + -H "Priority: urgent" \ + -d "Build failed on branch ${{ github.ref_name }}. Please check the GitHub Actions logs." \ + https://ntfy.sh/deploy-on-github-xasr6KBz47PjswPf53A78Fib diff --git a/.github/workflows/build-arm64.yml b/.github/workflows/build-arm64.yml index d87716c79..37fb9921f 100644 --- a/.github/workflows/build-arm64.yml +++ b/.github/workflows/build-arm64.yml @@ -80,13 +80,15 @@ jobs: path: dist/*.tar.gz if-no-files-found: warn - - name: Create GitHub Release + - name: Create or Update GitHub Release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | + # Coba buat release baru, jika sudah ada maka upload asset saja gh release create "${{ env.FORK_VERSION }}" dist/*.tar.gz \ --title "Fork Build ${{ env.FORK_VERSION }}" \ - --notes "Automated release from branch ${{ github.ref_name }}." + --notes "Automated release from branch ${{ github.ref_name }}." \ + || gh release upload "${{ env.FORK_VERSION }}" dist/*.tar.gz --clobber - name: 📢 Notify Success if: success() diff --git a/install_picoclaw.sh b/install_picoclaw.sh index 2dc7c7f54..90e1f0ced 100644 --- a/install_picoclaw.sh +++ b/install_picoclaw.sh @@ -3,11 +3,11 @@ set -e INSTALL_DIR="$HOME/.local/bin" BINARY_NAME="picoclaw" -URL="https://github.com/sipeed/picoclaw/releases/latest/download/picoclaw_Linux_arm64.tar.gz" GREEN='\033[0;32m' BLUE='\033[0;34m' RED='\033[0;31m' +YELLOW='\033[0;33m' BOLD='\033[1m' RESET='\033[0m' @@ -23,18 +23,42 @@ print_error() { echo -e "${RED}✗${RESET} $1" } +print_warn() { + echo -e "${YELLOW}!${RESET} $1" +} + get_latest_version() { local repo="$1" curl -sI "https://github.com/${repo}/releases/latest" 2>/dev/null | \ grep -i "location:" | sed 's|.*/tag/||' | tr -d '\r\n' } +# Detect system architecture +detect_arch() { + local arch + arch=$(uname -m) + case "$arch" in + x86_64|amd64) echo "x86_64" ;; + aarch64|arm64) echo "arm64" ;; + armv7*|armhf) echo "armv7" ;; + *) + print_error "Unsupported architecture: $arch" + exit 1 + ;; + esac +} + echo "" echo -e "${BOLD} PicoClaw Installer${RESET}" echo " ─────────────────────" echo "" +# Detect architecture +ARCH=$(detect_arch) +print_success "Detected architecture: $ARCH" + # Ask user which version to install +echo "" echo -e "${BOLD}Select version to install:${RESET}" echo " 1) Original (sipeed/picoclaw)" echo " 2) Fork (muava12/picoclaw-fork)" @@ -42,17 +66,17 @@ echo "" read -p "Choose [1-2] (default: 2): " version_choice < /dev/tty if [[ "$version_choice" == "1" ]]; then - URL="https://github.com/sipeed/picoclaw/releases/latest/download/picoclaw_Linux_arm64.tar.gz" REPO="sipeed/picoclaw" echo "" print_step "Selected: ${BOLD}Original version${RESET}" else - URL="https://github.com/muava12/picoclaw-fork/releases/latest/download/picoclaw_Linux_arm64.tar.gz" REPO="muava12/picoclaw-fork" echo "" print_step "Selected: ${BOLD}Fork version${RESET}" fi +URL="https://github.com/${REPO}/releases/latest/download/picoclaw_Linux_${ARCH}.tar.gz" + print_step "Checking for latest version..." VERSION=$(get_latest_version "$REPO") if [ -n "$VERSION" ]; then @@ -102,7 +126,7 @@ fi mkdir -p "$INSTALL_DIR" print_success "Install directory: $INSTALL_DIR" -print_step "Downloading $BINARY_NAME (arm64)..." +print_step "Downloading $BINARY_NAME ($ARCH)..." cd /tmp if command -v pv &> /dev/null; then curl -L "$URL" | pv -b -p -e -r > picoclaw.tar.gz @@ -122,12 +146,14 @@ print_success "Installed to $INSTALL_DIR/$BINARY_NAME" print_success "Version: $VERSION" echo "" +PATH_CHANGED=false if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then print_step "Fixing PATH..." if ! grep -q "$INSTALL_DIR" ~/.bashrc 2>/dev/null; then echo '' >> ~/.bashrc echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc print_success "Added to ~/.bashrc" + PATH_CHANGED=true else print_success "Already configured in ~/.bashrc" fi @@ -136,6 +162,7 @@ if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then echo '' >> ~/.zshrc echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc print_success "Added to ~/.zshrc" + PATH_CHANGED=true fi export PATH="$INSTALL_DIR:$PATH" print_success "PATH updated for current session" @@ -143,17 +170,12 @@ else print_success "Already in PATH" fi -# Reload shell config so picoclaw is immediately available -print_step "Reloading shell config..." -if [ -n "$BASH_VERSION" ] && [ -f "$HOME/.bashrc" ]; then - source "$HOME/.bashrc" -elif [ -n "$ZSH_VERSION" ] && [ -f "$HOME/.zshrc" ]; then - source "$HOME/.zshrc" -elif [ -f "$HOME/.bashrc" ]; then - source "$HOME/.bashrc" +echo "" +if [ "$PATH_CHANGED" = true ]; then + print_warn "Run this first to activate PATH:" + echo "" + echo -e " ${BOLD}source ~/.bashrc${RESET}" + echo "" fi -print_success "Done" - -echo "" -echo -e "Run: ${BOLD}picoclaw onboard${RESET} to get started" +echo -e "Then run: ${BOLD}picoclaw onboard${RESET} to get started" echo ""