name: Release on: push: tags: - "v*" permissions: contents: read packages: write jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6 with: go-version: "1.26" cache: true - run: go vet ./... - run: go test ./... docker: needs: [test] runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Resolve tag metadata id: meta uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5 with: images: ghcr.io/${{ github.repository }} tags: | type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} type=raw,value=latest - uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} binaries: needs: [test] runs-on: ubuntu-latest permissions: contents: write strategy: matrix: include: - goos: linux goarch: amd64 - goos: linux goarch: arm64 - goos: darwin goarch: amd64 - goos: darwin goarch: arm64 - goos: windows goarch: amd64 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6 with: go-version: "1.26" cache: true - name: Build env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} CGO_ENABLED: "0" run: | bin=ghstats [ "$GOOS" = windows ] && bin=ghstats.exe mkdir -p dist go build -trimpath -ldflags="-s -w" -o "dist/$bin" . cd dist if [ "$GOOS" = windows ]; then zip "ghstats_${GOOS}_${GOARCH}.zip" "$bin" else tar -czf "ghstats_${GOOS}_${GOARCH}.tar.gz" "$bin" fi - uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2 with: files: dist/ghstats_*.* # Move the floating major-version tag (e.g. v1) to this release's commit so # consumers using `uses: tiennm99/ghstats@v1` automatically pick up each new # minor/patch release. Force-push is expected here — that's the point of a # floating tag. update-major-tag: needs: [test, docker, binaries] runs-on: ubuntu-latest permissions: contents: write steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 - name: Retag major version env: TAG: ${{ github.ref_name }} run: | major="${TAG%%.*}" git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git tag -f "$major" "$TAG" git push -f origin "$major"