# CI/CD Pipeline for dbbackup # Main repo: Gitea (git.uuxo.net) # Mirror: GitHub (github.com/PlusOne/dbbackup) name: CI/CD on: push: branches: [main, master, develop] tags: ['v*'] pull_request: branches: [main, master] jobs: test: name: Test runs-on: ubuntu-latest container: image: golang:1.24-bookworm steps: - name: Checkout code env: TOKEN: ${{ github.token }} run: | apt-get update && apt-get install -y -qq git ca-certificates git config --global --add safe.directory "$GITHUB_WORKSPACE" git init git remote add origin "https://${TOKEN}@git.uuxo.net/${GITHUB_REPOSITORY}.git" git fetch --depth=1 origin "${GITHUB_SHA}" git checkout FETCH_HEAD - name: Download dependencies run: go mod download - name: Run tests run: go test -race -coverprofile=coverage.out ./... - name: Coverage summary run: go tool cover -func=coverage.out | tail -1 lint: name: Lint runs-on: ubuntu-latest container: image: golang:1.24-bookworm steps: - name: Checkout code env: TOKEN: ${{ github.token }} run: | apt-get update && apt-get install -y -qq git ca-certificates git config --global --add safe.directory "$GITHUB_WORKSPACE" git init git remote add origin "https://${TOKEN}@git.uuxo.net/${GITHUB_REPOSITORY}.git" git fetch --depth=1 origin "${GITHUB_SHA}" git checkout FETCH_HEAD - name: Install and run golangci-lint run: | go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.2 golangci-lint run --timeout=5m ./... build-and-release: name: Build & Release runs-on: ubuntu-latest needs: [test, lint] if: startsWith(github.ref, 'refs/tags/') container: image: golang:1.24-bookworm steps: - name: Checkout code env: TOKEN: ${{ github.token }} run: | apt-get update && apt-get install -y -qq git ca-certificates curl jq git config --global --add safe.directory "$GITHUB_WORKSPACE" git init git remote add origin "https://${TOKEN}@git.uuxo.net/${GITHUB_REPOSITORY}.git" git fetch --depth=1 origin "${GITHUB_SHA}" git checkout FETCH_HEAD - name: Build all platforms run: | mkdir -p release # Linux amd64 echo "Building linux/amd64..." CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o release/dbbackup-linux-amd64 . # Linux arm64 echo "Building linux/arm64..." CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o release/dbbackup-linux-arm64 . # Darwin amd64 echo "Building darwin/amd64..." CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o release/dbbackup-darwin-amd64 . # Darwin arm64 echo "Building darwin/arm64..." CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o release/dbbackup-darwin-arm64 . # FreeBSD amd64 echo "Building freebsd/amd64..." CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags="-s -w" -o release/dbbackup-freebsd-amd64 . echo "All builds complete:" ls -lh release/ - name: Create Gitea Release env: GITEA_TOKEN: ${{ github.token }} run: | TAG=${GITHUB_REF#refs/tags/} echo "Creating Gitea release for ${TAG}..." # Create JSON payload (avoid shell escaping issues) cat > /tmp/release.json << EOF { "tag_name": "${TAG}", "name": "${TAG}", "body": "## Download\n\nSelect the binary for your platform.\n\n### Platforms\n- Linux (amd64, arm64)\n- macOS (Intel, Apple Silicon)\n- FreeBSD (amd64)", "draft": false, "prerelease": false } EOF # Create release via API RESPONSE=$(curl -s -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d @/tmp/release.json \ "https://git.uuxo.net/api/v1/repos/${GITHUB_REPOSITORY}/releases") RELEASE_ID=$(echo "$RESPONSE" | jq -r '.id') if [ "$RELEASE_ID" = "null" ] || [ -z "$RELEASE_ID" ]; then echo "Failed to create release. Response:" echo "$RESPONSE" exit 1 fi echo "Created release ID: $RELEASE_ID" # Upload each binary for file in release/dbbackup-*; do FILENAME=$(basename "$file") echo "Uploading $FILENAME..." curl -s -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -F "attachment=@${file}" \ "https://git.uuxo.net/api/v1/repos/${GITHUB_REPOSITORY}/releases/${RELEASE_ID}/assets?name=${FILENAME}" done echo "Gitea release complete!" # Mirror to GitHub (optional - runs if GITHUB_MIRROR_TOKEN secret is set) mirror-to-github: name: Mirror to GitHub runs-on: ubuntu-latest needs: [build-and-release] if: startsWith(github.ref, 'refs/tags/') && vars.GITHUB_MIRROR_TOKEN != '' continue-on-error: true steps: - name: Mirror to GitHub env: GITHUB_MIRROR_TOKEN: ${{ vars.GITHUB_MIRROR_TOKEN }} run: | TAG=${GITHUB_REF#refs/tags/} echo "Mirroring ${TAG} to GitHub..." # Clone from Gitea git clone --bare "https://git.uuxo.net/${GITHUB_REPOSITORY}.git" repo.git cd repo.git # Push to GitHub git push --mirror "https://${GITHUB_MIRROR_TOKEN}@github.com/PlusOne/dbbackup.git" || echo "Mirror push failed (non-critical)" echo "GitHub mirror complete!"