name: QGato CLI Release Build on: workflow_dispatch: {} jobs: build: runs-on: debian steps: - name: Checkout source uses: actions/checkout@v4 - name: Check Go version run: | go version - name: Extract version from version.txt id: version run: | VERSION=$(cat version.txt) VERSION="v${VERSION#v}" echo "$VERSION" > version.txt echo "✅ Detected version: $VERSION" - name: Build all targets run: | mkdir -p bundles PLATFORMS=( "linux/amd64" "linux/arm64" "linux/arm/v7" "linux/arm/v6" "linux/riscv64" "windows/amd64" "windows/arm64" ) for TARGET in "${PLATFORMS[@]}"; do OS=$(echo "$TARGET" | cut -d/ -f1) ARCH=$(echo "$TARGET" | cut -d/ -f2) VARIANT=$(echo "$TARGET" | cut -d/ -f3) OUT="qgato-${OS}-${ARCH}" [ -n "$VARIANT" ] && OUT="${OUT}${VARIANT}" BIN="$OUT" [ "$OS" = "windows" ] && BIN="${OUT}.exe" echo "🔨 Building $BIN" # Disable CGO for cross-compiled targets (everything except native linux/amd64) if [ "$TARGET" = "linux/amd64" ]; then export CGO_ENABLED=1 else export CGO_ENABLED=0 fi if [ "$ARCH" = "arm" ]; then case "$VARIANT" in v7) GOARM=7 ;; v6) GOARM=6 ;; *) GOARM=7 ;; esac GOOS=$OS GOARCH=arm GOARM=$GOARM \ go build -ldflags="-s -w" -o "$BIN" ./. else GOOS=$OS GOARCH=$ARCH \ go build -ldflags="-s -w" -o "$BIN" ./. fi echo "📦 Packaging $BIN with required files..." PKG_DIR="bundle-$OUT" mkdir "$PKG_DIR" cp "$BIN" "$PKG_DIR/" cp -r lang static templates config.ini "$PKG_DIR/" 2>/dev/null || true if [ "$OS" = "windows" ]; then zip -r "bundles/$OUT.zip" "$PKG_DIR" else tar -czf "bundles/$OUT.tar.gz" "$PKG_DIR" fi rm -rf "$PKG_DIR" "$BIN" done - name: Create Forgejo release run: | TAG_NAME=$(cat version.txt) echo "📦 Creating release for tag: $TAG_NAME" DOWNLOAD_BASE="https://weforge.xyz/spitfire/Search/releases/download/$TAG_NAME" echo "| Arch | Linux Bundle (.tar.gz) | Windows Bundle (.zip) |" > release.md echo "|---------|---------------------------------------------------|--------------------------------------------------|" >> release.md echo "| amd64 | [qgato-linux-amd64.tar.gz]($DOWNLOAD_BASE/qgato-linux-amd64.tar.gz) | [qgato-windows-amd64.zip]($DOWNLOAD_BASE/qgato-windows-amd64.zip) |" >> release.md echo "| arm64 | [qgato-linux-arm64.tar.gz]($DOWNLOAD_BASE/qgato-linux-arm64.tar.gz) | [qgato-windows-arm64.zip]($DOWNLOAD_BASE/qgato-windows-arm64.zip) |" >> release.md echo "| armv7 | [qgato-linux-armv7.tar.gz]($DOWNLOAD_BASE/qgato-linux-armv7.tar.gz) | — |" >> release.md echo "| armv6 | [qgato-linux-armv6.tar.gz]($DOWNLOAD_BASE/qgato-linux-armv6.tar.gz) | — |" >> release.md echo "| riscv64 | [qgato-linux-riscv64.tar.gz]($DOWNLOAD_BASE/qgato-linux-riscv64.tar.gz) | — |" >> release.md RELEASE_BODY=$(cat release.md | jq -Rs .) curl -sSL -X POST "$FORGEJO_API/repos/${OWNER}/${REPO}/releases" \ -H "Authorization: token $FORGEJO_TOKEN" \ -H "Content-Type: application/json" \ -d "{ \"tag_name\": \"$TAG_NAME\", \"name\": \"$TAG_NAME\", \"body\": $RELEASE_BODY, \"draft\": false, \"prerelease\": false }" env: FORGEJO_API: https://weforge.xyz/api/v1 OWNER: spitfire REPO: Search FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} - name: Upload all bundles run: | TAG_NAME=$(cat version.txt) RELEASE_ID=$(curl -s -H "Authorization: token $FORGEJO_TOKEN" \ "$FORGEJO_API/repos/${OWNER}/${REPO}/releases/tags/$TAG_NAME" | jq -r .id) for FILE in bundles/*; do NAME=$(basename "$FILE") echo "📤 Uploading $NAME" CONTENT_TYPE="application/octet-stream" [[ "$FILE" == *.zip ]] && CONTENT_TYPE="application/zip" [[ "$FILE" == *.tar.gz ]] && CONTENT_TYPE="application/gzip" curl -sSL -X POST "$FORGEJO_API/repos/${OWNER}/${REPO}/releases/${RELEASE_ID}/assets?name=$NAME" \ -H "Authorization: token $FORGEJO_TOKEN" \ -H "Content-Type: $CONTENT_TYPE" \ --data-binary "@$FILE" done env: FORGEJO_API: https://weforge.xyz/api/v1 OWNER: spitfire REPO: Search FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }}