From 824d0556c2dfd473c781aee287e3a63741d4302b Mon Sep 17 00:00:00 2001 From: x5iu Date: Sun, 14 Dec 2025 17:37:20 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Auto-release=20on=20version.go=20ch?= =?UTF-8?q?ange=20instead=20of=20tag=20push?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Trigger workflow on main branch push when runtime/version.go changes - Compare version in source file with latest git tag - Automatically create and push new tag if version differs - Skip all steps if version matches latest tag 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .github/workflows/release.yml | 52 +++++++++++++++++++++++++++-------- runtime/version.go | 2 +- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 702e513..551917c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,8 +2,10 @@ name: Auto Release on: push: - tags: - - "v*" + branches: + - main + paths: + - "runtime/version.go" jobs: release: @@ -15,34 +17,60 @@ jobs: with: fetch-depth: 0 + - name: Check version and create tag if needed + id: check_version + run: | + # Extract version from runtime/version.go + VERSION=$(grep -oP 'const Version = "\K[^"]+' runtime/version.go) + echo "version=$VERSION" >> $GITHUB_OUTPUT + + # Get latest tag + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") + echo "latest_tag=$LATEST_TAG" >> $GITHUB_OUTPUT + + # Check if version differs from latest tag + if [ "$VERSION" != "$LATEST_TAG" ]; then + echo "should_release=true" >> $GITHUB_OUTPUT + echo "Version $VERSION differs from latest tag $LATEST_TAG, will create new release" + else + echo "should_release=false" >> $GITHUB_OUTPUT + echo "Version $VERSION matches latest tag, skipping release" + fi + + - name: Create new tag + if: steps.check_version.outputs.should_release == 'true' + run: | + VERSION="${{ steps.check_version.outputs.version }}" + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git tag -a "$VERSION" -m "Release $VERSION" + git push origin "$VERSION" + - name: Setup Node.js + if: steps.check_version.outputs.should_release == 'true' uses: actions/setup-node@v4 with: node-version: "20" - name: Install Claude Code + if: steps.check_version.outputs.should_release == 'true' run: npm install -g @anthropic-ai/claude-code - - name: Get previous tag - id: prev_tag - run: | - CURRENT_TAG=${GITHUB_REF#refs/tags/} - PREV_TAG=$(git describe --tags --abbrev=0 "${CURRENT_TAG}^" 2>/dev/null || echo "") - echo "current=$CURRENT_TAG" >> $GITHUB_OUTPUT - echo "previous=$PREV_TAG" >> $GITHUB_OUTPUT - - name: Generate release notes with Claude + if: steps.check_version.outputs.should_release == 'true' env: ANTHROPIC_BASE_URL: ${{ secrets.ANTHROPIC_BASE_URL }} ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} run: | - CURRENT_TAG="${{ steps.prev_tag.outputs.current }}" - PREV_TAG="${{ steps.prev_tag.outputs.previous }}" + CURRENT_TAG="${{ steps.check_version.outputs.version }}" + PREV_TAG="${{ steps.check_version.outputs.latest_tag }}" claude -p "Write release notes for this project (defc, a Go code generation tool). Current tag: ${CURRENT_TAG}, previous tag: ${PREV_TAG}. Read git commits between these two tags and write professional release notes in Markdown. Include: summary, new features, bug fixes, breaking changes (if any). Be concise." --output-format text > release_notes.md - name: Create Release + if: steps.check_version.outputs.should_release == 'true' uses: softprops/action-gh-release@v2 with: + tag_name: ${{ steps.check_version.outputs.version }} body_path: release_notes.md generate_release_notes: false env: diff --git a/runtime/version.go b/runtime/version.go index 115e0da..dd687ff 100644 --- a/runtime/version.go +++ b/runtime/version.go @@ -1,3 +1,3 @@ package defc -const Version = "v1.44.0" +const Version = "v1.44.1"