diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 0c0c4ca..6fcf80a 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,10 +1,11 @@ -name: CI +name: CI/CD on: push: branches: [main] pull_request: branches: [main] + workflow_dispatch: jobs: build: @@ -31,3 +32,156 @@ jobs: run: | export PATH=/usr/local/go/bin:$PATH go vet ./... + + release: + runs-on: ubuntu-latest + needs: build + if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request' + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Go + run: | + if ! command -v go &> /dev/null; then + wget -q https://go.dev/dl/go1.24.3.linux-amd64.tar.gz + sudo tar -C /usr/local -xzf go1.24.3.linux-amd64.tar.gz + fi + export PATH=/usr/local/go/bin:$PATH + go version + + - name: Compute version + id: info + run: | + BASE_VERSION=$(grep 'Version =' internal/version/version.go | cut -d'"' -f2) + COMMIT_COUNT=$(git rev-list --count HEAD) + SHORT_SHA=$(git rev-parse --short HEAD) + FULL_VERSION="${BASE_VERSION}-build.${COMMIT_COUNT}" + echo "base_version=v${BASE_VERSION}" >> $GITHUB_OUTPUT + echo "full_version=v${FULL_VERSION}" >> $GITHUB_OUTPUT + echo "sha=${SHORT_SHA}" >> $GITHUB_OUTPUT + echo "commit_count=${COMMIT_COUNT}" >> $GITHUB_OUTPUT + + - name: Build all platforms + run: | + export PATH=/usr/local/go/bin:$PATH + mkdir -p dist + VERSION=${{ steps.info.outputs.full_version }} + LDFLAGS="-s -w -X github.com/muyue/muyue/internal/version.Version=${VERSION}" + + echo "Building linux/amd64..." + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="$LDFLAGS" -o dist/muyue-linux-amd64 ./cmd/muyue/ + + echo "Building linux/arm64..." + CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="$LDFLAGS" -o dist/muyue-linux-arm64 ./cmd/muyue/ + + echo "Building darwin/amd64..." + CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="$LDFLAGS" -o dist/muyue-darwin-amd64 ./cmd/muyue/ + + echo "Building darwin/arm64..." + CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="$LDFLAGS" -o dist/muyue-darwin-arm64 ./cmd/muyue/ + + echo "Building windows/amd64..." + CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="$LDFLAGS" -o dist/muyue-windows-amd64.exe ./cmd/muyue/ + + echo "Building windows/arm64..." + CGO_ENABLED=0 GOOS=windows GOARCH=arm64 go build -ldflags="$LDFLAGS" -o dist/muyue-windows-arm64.exe ./cmd/muyue/ + + ls -lh dist/ + + - name: Create checksums and archives + run: | + cd dist + sha256sum * > checksums.txt + cat checksums.txt + tar czf muyue-linux-amd64.tar.gz muyue-linux-amd64 + tar czf muyue-linux-arm64.tar.gz muyue-linux-arm64 + tar czf muyue-darwin-amd64.tar.gz muyue-darwin-amd64 + tar czf muyue-darwin-arm64.tar.gz muyue-darwin-arm64 + zip muyue-windows-amd64.zip muyue-windows-amd64.exe + zip muyue-windows-arm64.zip muyue-windows-arm64.exe + rm -f muyue-linux-amd64 muyue-linux-arm64 muyue-darwin-amd64 muyue-darwin-arm64 muyue-windows-amd64.exe muyue-windows-arm64.exe + ls -lh + + - name: Delete old release + env: + GITEA_TOKEN: ${{ secrets.GITEATOKEN }} + run: | + if [ -z "$GITEA_TOKEN" ]; then + echo "Warning: GITEATOKEN not set, skipping delete" + exit 0 + fi + TAG="${{ steps.info.outputs.base_version }}" + API="${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases" + RESPONSE=$(curl -s -H "Authorization: token ${GITEA_TOKEN}" "${API}" 2>/dev/null || echo "") + if [ -n "$RESPONSE" ]; then + echo "$RESPONSE" | grep -o '"id":[0-9]*' | while read line; do + ID=$(echo "$line" | grep -o '[0-9]*') + curl -s -X DELETE -H "Authorization: token ${GITEA_TOKEN}" "${API}/${ID}" > /dev/null 2>&1 || true + echo "Deleted release ${ID}" + done || true + fi + curl -s -X DELETE -H "Authorization: token ${GITEA_TOKEN}" \ + "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/tags/${TAG}" > /dev/null 2>&1 || true + + - name: Create release + env: + GITEA_TOKEN: ${{ secrets.GITEATOKEN }} + run: | + if [ -z "$GITEA_TOKEN" ]; then + echo "Error: GITEATOKEN secret is not configured." + echo "Go to Settings > Actions > Secrets and add GITEATOKEN" + exit 1 + fi + VERSION=${{ steps.info.outputs.full_version }} + BASE_TAG=${{ steps.info.outputs.base_version }} + SHA=${{ steps.info.outputs.sha }} + COMMIT_COUNT=${{ steps.info.outputs.commit_count }} + API="${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases" + + BODY="## muyue ${VERSION} + +Build \#${COMMIT_COUNT} from \`${SHA}\` + +| Platform | File | +|----------|------| +| Linux x86_64 | muyue-linux-amd64.tar.gz | +| Linux ARM64 | muyue-linux-arm64.tar.gz | +| macOS Intel | muyue-darwin-amd64.tar.gz | +| macOS Apple Silicon | muyue-darwin-arm64.tar.gz | +| Windows x86_64 | muyue-windows-amd64.zip | +| Windows ARM64 | muyue-windows-arm64.zip | + +### Install (Linux amd64) +\`\`\`bash +curl -sL ${{ github.server_url }}/${{ github.repository }}/releases/download/${BASE_TAG}/muyue-linux-amd64.tar.gz | tar xz +chmod +x muyue-linux-amd64 +sudo mv muyue-linux-amd64 /usr/local/bin/muyue +\`\`\`" + + RESPONSE=$(curl -s -X POST "${API}" \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\":\"${BASE_TAG}\",\"target_commitish\":\"main\",\"name\":\"muyue ${VERSION}\",\"body\":$(echo "$BODY" | jq -Rs .),\"draft\":false,\"prerelease\":false}") + + RELEASE_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | head -1 | grep -o '[0-9]*') + + if [ -z "$RELEASE_ID" ]; then + echo "Failed to create release:" + echo "$RESPONSE" + exit 1 + fi + + echo "Release ID: ${RELEASE_ID}" + UPLOAD_URL="${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/${RELEASE_ID}/assets" + + for file in dist/*.tar.gz dist/*.zip dist/checksums.txt; do + filename=$(basename "$file") + echo "Uploading ${filename}..." + curl -s -X POST "${UPLOAD_URL}" \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -F "attachment=@${file};filename=${filename}" > /dev/null + done + + echo "Release published!" diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml deleted file mode 100644 index 06f2d7c..0000000 --- a/.gitea/workflows/release.yml +++ /dev/null @@ -1,159 +0,0 @@ -name: Release - -on: - push: - branches: [main] - workflow_dispatch: - -jobs: - release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Go - run: | - if ! command -v go &> /dev/null; then - wget -q https://go.dev/dl/go1.24.3.linux-amd64.tar.gz - sudo tar -C /usr/local -xzf go1.24.3.linux-amd64.tar.gz - fi - export PATH=/usr/local/go/bin:$PATH - go version - - - name: Compute version - id: info - run: | - BASE_VERSION=$(grep 'Version =' internal/version/version.go | cut -d'"' -f2) - COMMIT_COUNT=$(git rev-list --count HEAD) - SHORT_SHA=$(git rev-parse --short HEAD) - FULL_VERSION="${BASE_VERSION}-build.${COMMIT_COUNT}" - echo "base_version=v${BASE_VERSION}" >> $GITHUB_OUTPUT - echo "full_version=v${FULL_VERSION}" >> $GITHUB_OUTPUT - echo "sha=${SHORT_SHA}" >> $GITHUB_OUTPUT - echo "commit_count=${COMMIT_COUNT}" >> $GITHUB_OUTPUT - - - name: Build all platforms - run: | - export PATH=/usr/local/go/bin:$PATH - mkdir -p dist - VERSION=${{ steps.info.outputs.full_version }} - SHA=${{ steps.info.outputs.sha }} - LDFLAGS="-s -w -X github.com/muyue/muyue/internal/version.Version=${VERSION}" - - echo "Building linux/amd64..." - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="$LDFLAGS" -o dist/muyue-linux-amd64 ./cmd/muyue/ - - echo "Building linux/arm64..." - CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="$LDFLAGS" -o dist/muyue-linux-arm64 ./cmd/muyue/ - - echo "Building darwin/amd64..." - CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="$LDFLAGS" -o dist/muyue-darwin-amd64 ./cmd/muyue/ - - echo "Building darwin/arm64..." - CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="$LDFLAGS" -o dist/muyue-darwin-arm64 ./cmd/muyue/ - - echo "Building windows/amd64..." - CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="$LDFLAGS" -o dist/muyue-windows-amd64.exe ./cmd/muyue/ - - echo "Building windows/arm64..." - CGO_ENABLED=0 GOOS=windows GOARCH=arm64 go build -ldflags="$LDFLAGS" -o dist/muyue-windows-arm64.exe ./cmd/muyue/ - - ls -lh dist/ - - - name: Create checksums and archives - run: | - cd dist - sha256sum * > checksums.txt - cat checksums.txt - tar czf muyue-linux-amd64.tar.gz muyue-linux-amd64 - tar czf muyue-linux-arm64.tar.gz muyue-linux-arm64 - tar czf muyue-darwin-amd64.tar.gz muyue-darwin-amd64 - tar czf muyue-darwin-arm64.tar.gz muyue-darwin-arm64 - zip muyue-windows-amd64.zip muyue-windows-amd64.exe - zip muyue-windows-arm64.zip muyue-windows-arm64.exe - rm -f muyue-linux-amd64 muyue-linux-arm64 muyue-darwin-amd64 muyue-darwin-arm64 muyue-windows-amd64.exe muyue-windows-arm64.exe - ls -lh - - - name: Delete old release for this version - env: - GITEA_TOKEN: ${{ secrets.GITEATOKEN }} - run: | - if [ -z "$GITEA_TOKEN" ]; then - echo "Warning: GITEATOKEN not set, skipping delete" - exit 0 - fi - TAG="${{ steps.info.outputs.base_version }}" - API="${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases" - RESPONSE=$(curl -s -H "Authorization: token ${GITEA_TOKEN}" "${API}" 2>/dev/null || echo "") - if [ -n "$RESPONSE" ]; then - echo "$RESPONSE" | grep -o '"id":[0-9]*' | while read line; do - ID=$(echo "$line" | grep -o '[0-9]*') - curl -s -X DELETE -H "Authorization: token ${GITEA_TOKEN}" "${API}/${ID}" > /dev/null 2>&1 || true - echo "Deleted release ${ID}" - done || true - fi - curl -s -X DELETE -H "Authorization: token ${GITEA_TOKEN}" \ - "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/tags/${TAG}" > /dev/null 2>&1 || true - - - name: Create release - env: - GITEA_TOKEN: ${{ secrets.GITEATOKEN }} - run: | - if [ -z "$GITEA_TOKEN" ]; then - echo "Error: GITEATOKEN secret is not configured." - echo "Go to Settings > Actions > Secrets and add GITEATOKEN" - exit 1 - fi - VERSION=${{ steps.info.outputs.full_version }} - BASE_TAG=${{ steps.info.outputs.base_version }} - SHA=${{ steps.info.outputs.sha }} - COMMIT_COUNT=${{ steps.info.outputs.commit_count }} - API="${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases" - - BODY="## muyue ${VERSION} - -Build \#${COMMIT_COUNT} from \`${SHA}\` - -| Platform | File | -|----------|------| -| Linux x86_64 | muyue-linux-amd64.tar.gz | -| Linux ARM64 | muyue-linux-arm64.tar.gz | -| macOS Intel | muyue-darwin-amd64.tar.gz | -| macOS Apple Silicon | muyue-darwin-arm64.tar.gz | -| Windows x86_64 | muyue-windows-amd64.zip | -| Windows ARM64 | muyue-windows-arm64.zip | - -### Install (Linux amd64) -\`\`\`bash -curl -sL ${{ github.server_url }}/${{ github.repository }}/releases/download/${BASE_TAG}/muyue-linux-amd64.tar.gz | tar xz -chmod +x muyue-linux-amd64 -sudo mv muyue-linux-amd64 /usr/local/bin/muyue -\`\`\`" - - RESPONSE=$(curl -s -X POST "${API}" \ - -H "Authorization: token ${GITEA_TOKEN}" \ - -H "Content-Type: application/json" \ - -d "{\"tag_name\":\"${BASE_TAG}\",\"target_commitish\":\"main\",\"name\":\"muyue ${VERSION}\",\"body\":$(echo "$BODY" | jq -Rs .),\"draft\":false,\"prerelease\":false}") - - RELEASE_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | head -1 | grep -o '[0-9]*') - - if [ -z "$RELEASE_ID" ]; then - echo "Failed to create release:" - echo "$RESPONSE" - exit 1 - fi - - echo "Release ID: ${RELEASE_ID}" - UPLOAD_URL="${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/${RELEASE_ID}/assets" - - for file in dist/*.tar.gz dist/*.zip dist/checksums.txt; do - filename=$(basename "$file") - echo "Uploading ${filename}..." - curl -s -X POST "${UPLOAD_URL}" \ - -H "Authorization: token ${GITEA_TOKEN}" \ - -F "attachment=@${file};filename=${filename}" > /dev/null - done - - echo "Release published!"