mirror of
https://github.com/tiennm99/ghstats.git
synced 2026-05-20 05:27:01 +00:00
cda9172701
Adds an update-major-tag job that runs after test/docker/binaries all pass. Extracts the major component from the pushed tag (v1.2.3 → v1) and force-moves that tag to the current commit, then pushes. Consumers using `uses: tiennm99/ghstats@v1` now pick up each new minor/patch release automatically without a workflow edit on their end. The v1 tag only moves if every artifact job succeeded, so it never points at a commit whose binaries or Docker image failed to publish.
118 lines
3.5 KiB
YAML
118 lines
3.5 KiB
YAML
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"
|