diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml new file mode 100644 index 0000000..dae9914 --- /dev/null +++ b/.github/workflows/build-test.yml @@ -0,0 +1,217 @@ +name: Build Test + +# This workflow builds the application for testing purposes. +# It is triggered when a pull request is opened, synchronized, or reopened against the main branch. + +on: + pull_request: + branches: + - main + types: + - opened + - synchronize + - reopened + # Allow manual trigger for testing + workflow_dispatch: + +# +# Build Windows +# + +jobs: + build-windows: + runs-on: windows-latest + steps: + - name: Checkout code + uses: actions/checkout@v6 + with: + ref: ${{ github.ref }} + + - name: Get version info + id: get_version + run: | + $version = "pr-test" + $tagName = "pr-test" + + Write-Host "✓ Mode: Pull Request Test Build" + Write-Host "✓ Tag: $tagName" + Write-Host "✓ Version: $version" + + "VERSION=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + "TAG_NAME=$tagName" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + shell: pwsh + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: '3.13' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirement.txt + + - name: Solve ddddocr compatibility and copy model files + run: | + $ddddocrPath = python -c "import ddddocr, os; print(os.path.dirname(ddddocr.__file__))" + Write-Host "ddddocr package location: $ddddocrPath" + + $initFile = Join-Path $ddddocrPath "__init__.py" + if (Test-Path $initFile) { + Write-Host "Fixing ddddocr compatibility in: $initFile" + (Get-Content $initFile) -replace 'Image\.ANTIALIAS', 'Image.Resampling.LANCZOS' | Set-Content $initFile + Write-Host "✓ Fixed: Image.ANTIALIAS -> Image.Resampling.LANCZOS" + } else { + Write-Error "✗ ddddocr __init__.py not found" + exit 1 + } + + if (-not (Test-Path "models")) { + New-Item -ItemType Directory -Path "models" | Out-Null + Write-Host "✓ Created models directory" + } + + $onnxSource = Join-Path $ddddocrPath "common.onnx" + $onnxDest = "models/common.onnx" + if (Test-Path $onnxSource) { + Copy-Item $onnxSource $onnxDest -Force + Write-Host "✓ Copied ONNX model from: $onnxSource" + Write-Host "✓ ONNX model copied to: $onnxDest" + } else { + Write-Error "✗ ONNX model not found in ddddocr package: $onnxSource" + exit 1 + } + + if (Test-Path $onnxDest) { + $fileSize = (Get-Item $onnxDest).Length / 1MB + Write-Host "✓ Model file verified: $onnxDest (Size: $([math]::Round($fileSize, 2)) MB)" + } else { + Write-Error "✗ Failed to copy model file" + exit 1 + } + shell: pwsh + + - name: Compile Qt Resource files + run: | + cd batchs + ./compile_rc.bat + shell: cmd + + - name: Compile Qt UI files + run: | + cd batchs + ./compile_ui.bat + shell: cmd + + - name: Generate 'Main.spec' + run: | + $version = "${{ steps.get_version.outputs.VERSION }}" + $exeName = "AutoLibrary-$version" + + Write-Host "Generating Main.spec for version: $version" + Write-Host "Executable name: $exeName" + + $specLines = @( + "# -*- mode: python ; coding: utf-8 -*-" + "" + "" + "a = Analysis(" + " ['src\\Main.py']," + " pathex=[]," + " binaries=[]," + " datas=[" + " ('models\\common.onnx', 'ddddocr')," + " ('src\\gui\\resources\\icons\\AutoLibrary_32x32.ico', 'gui\\resources\\icons')," + " ]," + " hiddenimports=[]," + " hookspath=[]," + " hooksconfig={}," + " runtime_hooks=[]," + " excludes=[]," + " noarchive=False," + " optimize=0," + ")" + "pyz = PYZ(a.pure)" + "" + "exe = EXE(" + " pyz," + " a.scripts," + " name='AutoLibrary'," + " debug=False," + " bootloader_ignore_signals=False," + " strip=False," + " upx=True," + " upx_exclude=[]," + " runtime_tmpdir=None," + " console=False," + " disable_windowed_traceback=False," + " argv_emulation=False," + " target_arch=None," + " codesign_identity=None," + " entitlements_file=None," + " icon=['src\\gui\\resources\\icons\\AutoLibrary_32x32.ico']," + ")" + "" + "coll = COLLECT(" + " exe," + " a.binaries," + " a.datas," + " strip=False," + " upx=True," + " upx_exclude=[]," + " name='$exeName'" + ")" + ) + $specLines | Out-File -FilePath "Main.spec" -Encoding UTF8 + + Write-Host "✓ Main.spec (non-single file) generated successfully" + Write-Host "`nGenerated Main.spec ============" + Get-Content "Main.spec" | Write-Host + Write-Host "==================================`n" + shell: pwsh + + - name: Build with PyInstaller + run: | + pyinstaller Main.spec + + - name: Zip windows release + id: zip_release + run: | + $tagName = "${{ steps.get_version.outputs.TAG_NAME }}" + $version = "${{ steps.get_version.outputs.VERSION }}" + $distDir = "dist/AutoLibrary-$version" + $zipName = "AutoLibrary.$tagName-windows-x86_64.zip" + + echo "ZIP_NAME=$zipName" >> $env:GITHUB_OUTPUT + + Write-Host "Looking for distribution directory: $distDir" + if (Test-Path $distDir) { + Compress-Archive -Path "$distDir/*" -DestinationPath $zipName + Write-Host "✓ Created release archive (directory mode): $zipName" + } else { + Write-Error "✗ Distribution directory not found: $distDir" + Write-Host "Files in dist directory:" + Get-ChildItem "dist" | ForEach-Object { Write-Host " - $($_.Name)" } + exit 1 + } + shell: pwsh + + - name: Archive artifacts + uses: actions/upload-artifact@v6 + with: + name: AutoLibrary.${{ steps.get_version.outputs.TAG_NAME }}-windows-x86_64 + path: | + ${{ steps.zip_release.outputs.ZIP_NAME }} + retention-days: 7 + + - name: Upload build summary + run: | + Write-Host "## Build Test Summary" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 + Write-Host "" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + Write-Host "✓ Pull request build test completed successfully!" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + Write-Host "- Version: ${{ steps.get_version.outputs.VERSION }}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + Write-Host "- Tag: ${{ steps.get_version.outputs.TAG_NAME }}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + Write-Host "- Pull Request #${{ github.event.pull_request.number }}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + Write-Host "- Branch: ${{ github.event.pull_request.head.ref }}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + Write-Host "- Event: ${{ github.event_name }}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + shell: pwsh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1d43416..cea2c05 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,21 +8,19 @@ name: Build on: workflow_call: inputs: - version: - description: 'Version number' - required: true - type: string tag_name: description: 'Tag name' - required: true + required: false type: string - outputs: version: - description: 'The version number' - value: ${{ jobs.build-windows.outputs.version }} - tag_name: - description: 'The tag name' - value: ${{ jobs.build-windows.outputs.tag_name }} + description: 'Version number' + required: false + type: string + is_test: + description: 'Whether this is a test build (not a release)' + required: false + type: string + default: 'true' # # Build Windows @@ -32,18 +30,18 @@ jobs: build-windows: runs-on: windows-latest outputs: - version: ${{ steps.get_version.outputs.VERSION }} tag_name: ${{ steps.get_version.outputs.TAG_NAME }} + version: ${{ steps.get_version.outputs.VERSION }} steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: - ref: main + ref: ${{ github.ref }} # here we download the build version of ALVersionInfo.py from artifacts # and replace the committed version - name: Download build version of ALVersionInfo.py - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: updated-version-info-for-build path: src/gui/ @@ -51,13 +49,27 @@ jobs: - name: Get version info id: get_version run: | - $version = "${{ inputs.version }}" - $tagName = "${{ inputs.tag_name }}" + $isTest = "${{ inputs.is_test }}" + if ($isTest -eq "true") { + $version = "test" + $tagName = "test" + Write-Host "✓ Mode: Test Build" + } else { + $version = "${{ inputs.version }}" + $tagName = "${{ inputs.tag_name }}" + + if ([string]::IsNullOrEmpty($version)) { + $version = "test" + $tagName = "test" + Write-Host "✓ Mode: Independent Build (No inputs provided)" + } + } - echo "TAG_NAME=$tagName" >> $env:GITHUB_OUTPUT - echo "VERSION=$version" >> $env:GITHUB_OUTPUT Write-Host "✓ Tag: $tagName" Write-Host "✓ Version: $version" + + "VERSION=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + "TAG_NAME=$tagName" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append shell: pwsh - name: Verify 'ALVersionInfo.py' was updated @@ -70,7 +82,7 @@ jobs: shell: pwsh - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: python-version: '3.13' @@ -210,7 +222,7 @@ jobs: $distDir = "dist/AutoLibrary-$version" $zipName = "AutoLibrary.$tagName-windows-x86_64.zip" - echo "ZIP_PATH=$zipName" >> $env:GITHUB_OUTPUT + echo "ZIP_NAME=$zipName" >> $env:GITHUB_OUTPUT Write-Host "Looking for distribution directory: $distDir" if (Test-Path $distDir) { @@ -225,8 +237,21 @@ jobs: shell: pwsh - name: Archive artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: AutoLibrary.${{ steps.get_version.outputs.TAG_NAME }}-windows-x86_64 path: | - ${{ steps.zip_release.outputs.ZIP_PATH }} + ${{ steps.zip_release.outputs.ZIP_NAME }} + retention-days: ${{ github.event_name != 'workflow_call' && 7 || 90 }} + + - name: Upload build summary + if: ${{ github.event_name != 'workflow_call' }} + run: | + Write-Host "## Build Summary" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 + Write-Host "" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + Write-Host "✓ Build test completed successfully!" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + Write-Host "- Version: ${{ steps.get_version.outputs.VERSION }}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + Write-Host "- Tag: ${{ steps.get_version.outputs.TAG_NAME }}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + Write-Host "- Event: ${{ github.event_name }}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + Write-Host "- Ref: ${{ github.ref }}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + shell: pwsh diff --git a/.github/workflows/commit-release.yml b/.github/workflows/commit-release.yml index f92ee02..00335d3 100644 --- a/.github/workflows/commit-release.yml +++ b/.github/workflows/commit-release.yml @@ -1,7 +1,7 @@ name: Commit Release # This workflow commits version changes in 'ALVersionInfo.py' (get from artifacts) and -# moves the release tag to this new release commit. +# creates/moves the release tag to this new release commit. # # It is triggered when called by the release workflow. @@ -9,7 +9,7 @@ on: workflow_call: inputs: tag_name: - description: 'Tag name to move (e.g., v1.0.0)' + description: 'Tag name to create/move (e.g., v1.0.0 or v1.0.0-rc1)' required: true type: string version: @@ -20,10 +20,33 @@ on: description: 'File path to commit' required: true type: string + create_tag: + description: 'Whether to create new tag (true) or move existing tag (false)' + required: false + type: string + default: 'false' + is_rc: + description: 'Whether this is a release candidate (pre-release)' + required: false + type: string + default: 'false' + ref: + description: 'Git ref to checkout (release branch)' + required: true + type: string outputs: + tag_name: + description: 'The tag name created/moved' + value: ${{ inputs.tag_name }} + version: + description: 'Version number for commit message' + value: ${{ inputs.version }} new_commit_sha: - description: 'The new commit SHA after moving the tag' + description: 'The new commit SHA after creating/moving the tag' value: ${{ jobs.commit-release.outputs.new_commit_sha }} + branch_name: + description: 'The branch name where the commit was made' + value: ${{ jobs.commit-release.outputs.branch_name }} jobs: commit-release: @@ -32,18 +55,19 @@ jobs: contents: write outputs: new_commit_sha: ${{ steps.commit_info.outputs.commit_sha }} + branch_name: ${{ steps.push_release.outputs.branch_name }} steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: - ref: main + ref: ${{ inputs.ref }} fetch-depth: 0 # here we download the commit version of ALVersionInfo.py from artifacts # and replace the original file with it. - name: Download commit version of ALVersionInfo.py - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: updated-version-info-for-commit path: downloaded-file/ @@ -81,18 +105,38 @@ jobs: git commit -m "chore(release): v${VERSION} [auto release commit]" echo "✓ Changes committed" - - name: Push to main branch + - name: Push to release branch + id: push_release run: | - MAIN_BRANCH=$(git remote show origin | grep 'HEAD branch' | cut -d' ' -f5) - if [ -z "$MAIN_BRANCH" ]; then - MAIN_BRANCH="main" + # Get the release branch name from the input ref + BRANCH_NAME=$(echo "${{ inputs.ref }}" | sed 's|refs/heads/||') + + if [ -z "$BRANCH_NAME" ]; then + echo "✗ Error: Could not determine branch name from ref: ${{ inputs.ref }}" + exit 1 fi - echo "Pushing to branch: ${MAIN_BRANCH}" - git push origin HEAD:${MAIN_BRANCH} - echo "✓ Changes pushed to ${MAIN_BRANCH}" + echo "Pushing to branch: ${BRANCH_NAME}" + git push origin HEAD:${BRANCH_NAME} + echo "✓ Changes pushed to ${BRANCH_NAME}" + + # Output branch name for downstream jobs + echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT + + - name: Create tag for release + if: ${{ inputs.create_tag == 'true' }} + run: | + TAG_NAME="${{ inputs.tag_name }}" + IS_RC="${{ inputs.is_rc }}" + + echo "Creating new tag ${TAG_NAME} at this commit..." + echo "Release type: $([ "$IS_RC" = "true" ] && echo "Release Candidate (Pre-release)" || echo "Stable Release")" + git tag ${TAG_NAME} + git push origin ${TAG_NAME} + echo "✓ Tag ${TAG_NAME} created at commit $(git rev-parse --short HEAD)" - name: Move tag to new release commit + if: ${{ inputs.create_tag != 'true' }} run: | TAG_NAME="${{ inputs.tag_name }}" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0772b43..a6f100e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,36 +1,48 @@ name: Release # This workflow automates the complete release process for AutoLibrary application -# It is triggered when a new version tag (vX.Y.Z) is pushed to the repository +# It is triggered when a new release branch is created (release/vX.Y.Z or release/vX.Y.Z-rc*) # # Workflow Steps: # START > -# 1. Update Version: +# 1. Extract Version: +# Extracts version number from branch name: +# - release/v1.0.0 -> v1.0.0 (stable release) +# - release/v1.0.0-rc1 -> v1.0.0 (release candidate) + +# 2. Update Version: # Updates version information in 'ALVersionInfo.py' with build metadata and archives # the updated version file as an artifact. # # for more information, please refer to the comment in the workflow 'update-version.yml' -# 2. Commit Release: -# Commits version changes and moves the release tag to this new release commit. +# 3. Commit Release: +# Commits version changes to release branch and creates the release tag. -# 3. Build: +# 4. Build: # Compiles the application for Windows platform using PyInstaller, and # archives the built artifacts as 'AutoLibrary.-windows-x86_64.zip'. -# 4. Release: +# 5. Release: # Creates GitHub release with generated artifacts and release notes # < END # +# 6. Merge back: +# Merges release branch back to main branch, and clean/delete the release branch +# # The workflow ensures version consistency between source code, built artifacts, and GitHub releases # while maintaining proper commit history and tag management. +# +# IMPORTANT: This workflow only triggers on branch CREATION, not on pushes to release branches. +# If you need to fix issues on a release branch, delete the tag, merge fixes to main, +# and create a new release branch. on: - push: - tags: - - 'v[0-9]+.[0-9]+.[0-9]+' + create: + branches: + - 'release/**' jobs: # @@ -44,6 +56,62 @@ jobs: - name: Start release run: | echo "✓ Starting release" + echo "Branch: ${{ github.ref_name }}" + echo "Ref: ${{ github.ref }}" + + # + # Extract version : + # this job extracts version from branch name + # + + extract-version: + needs: + - start + runs-on: ubuntu-latest + outputs: + tag_name: ${{ steps.extract.outputs.tag_name }} + version: ${{ steps.extract.outputs.version }} + is_rc: ${{ steps.extract.outputs.is_rc }} + steps: + - name: Extract version from branch name + id: extract + run: | + BRANCH_NAME="${{ github.ref_name }}" + + # Validate branch name starts with 'release/v' + if ! echo "$BRANCH_NAME" | grep -qE '^release/v'; then + echo "X Error: Branch '$BRANCH_NAME' does not start with 'release/v'" + echo "X This workflow should only be triggered by release branches" + exit 1 + fi + + # Extract version from branch name: + # - release/v1.0.0 -> v1.0.0 (stable) + # - release/v1.0.0-rc1 -> v1.0.0 (release candidate) + # - release/v1.0.0-alpha.1 -> v1.0.0-alpha.1 (pre-release) + if echo "$BRANCH_NAME" | grep -qE '^release/v[0-9]+\.[0-9]+\.[0-9]+$'; then + # Stable release: release/v1.0.0 -> v1.0.0 + TAG_NAME=$(echo "$BRANCH_NAME" | sed -E 's|^release/(v[0-9]+\.[0-9]+\.[0-9]+)$|\1|') + IS_RC=false + elif echo "$BRANCH_NAME" | grep -qE '^release/v[0-9]+\.[0-9]+\.[0-9]+-'; then + # Pre-release: release/v1.0.0-rc1 -> v1.0.0-rc1 + TAG_NAME=$(echo "$BRANCH_NAME" | sed -E 's|^release/(v[0-9]+\.[0-9]+\.[0-9]+-.*)$|\1|') + IS_RC=true + else + echo "X Error: Branch '$BRANCH_NAME' does not match expected format" + echo "X Expected format: release/vX.Y.Z or release/vX.Y.Z-rcX" + exit 1 + fi + VERSION="${TAG_NAME#v}" + + echo "TAG_NAME=$TAG_NAME" >> $GITHUB_OUTPUT + echo "VERSION=$VERSION" >> $GITHUB_OUTPUT + echo "IS_RC=$IS_RC" >> $GITHUB_OUTPUT + + echo "✓ Branch: $BRANCH_NAME" + echo "✓ Tag: $TAG_NAME" + echo "✓ Version: $VERSION" + echo "✓ Is RC: $IS_RC" # # Update version : @@ -52,31 +120,35 @@ jobs: update-version: needs: - - start + - extract-version uses: ./.github/workflows/update-version.yml permissions: contents: write with: - tag_name: ${{ github.ref_name }} + tag_name: ${{ needs.extract-version.outputs.tag_name }} ref: ${{ github.ref }} # # Commit release : - # this job commits the updated version file and move the release - # tag to this new commit + # this job commits the updated version file to main and creates + # the release tag (not moving an existing tag) # commit-release: needs: + - extract-version - update-version if: ${{ needs.update-version.outputs.has_changes == 'true' }} uses: ./.github/workflows/commit-release.yml permissions: contents: write with: - tag_name: ${{ needs.update-version.outputs.tag_name }} - version: ${{ needs.update-version.outputs.version }} + tag_name: ${{ needs.extract-version.outputs.tag_name }} + version: ${{ needs.extract-version.outputs.version }} file_path: src/gui/ALVersionInfo.py + create_tag: 'true' + is_rc: ${{ needs.extract-version.outputs.is_rc }} + ref: ${{ github.ref }} # # Build : @@ -91,8 +163,9 @@ jobs: permissions: contents: write with: - version: ${{ needs.update-version.outputs.version }} tag_name: ${{ needs.update-version.outputs.tag_name }} + version: ${{ needs.update-version.outputs.version }} + is_test: 'false' # # Release : @@ -102,27 +175,28 @@ jobs: runs-on: ubuntu-latest needs: - build + - extract-version if: always() && needs.build.result == 'success' permissions: contents: write steps: - name: Download artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: - name: AutoLibrary.${{ needs.build.outputs.tag_name }}-windows-x86_64 + name: AutoLibrary.${{ needs.extract-version.outputs.tag_name }}-windows-x86_64 path: artifacts/ - name: Create release id: create_release uses: softprops/action-gh-release@v2 with: - tag_name: ${{ needs.build.outputs.tag_name }} - name: AutoLibrary ${{ needs.build.outputs.tag_name }} + tag_name: ${{ needs.extract-version.outputs.tag_name }} + name: AutoLibrary ${{ needs.extract-version.outputs.tag_name }} files: | - artifacts/AutoLibrary.${{ needs.build.outputs.tag_name }}-windows-x86_64.zip + artifacts/AutoLibrary.${{ needs.extract-version.outputs.tag_name }}-windows-x86_64.zip draft: false - prerelease: false + prerelease: ${{ needs.extract-version.outputs.is_rc == 'true' }} generate_release_notes: true body: | --- @@ -142,3 +216,107 @@ jobs: - name: End release run: | echo "✓ Ending release" + + # + # Merge Back : + # this job merges the release branch to main after successful release + # + + merge-back: + needs: + - release + - extract-version + - commit-release + if: ${{ needs.release.result == 'success' && needs.commit-release.result == 'success' }} + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout code + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Merge release branch to main + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + # Use the release branch name from the original trigger + BRANCH_NAME="${{ needs.extract-version.outputs.tag_name }}" + # Extract branch name: v1.0.0 -> release/v1.0.0 + if [[ ! "$BRANCH_NAME" =~ ^release/ ]]; then + BRANCH_NAME="release/${BRANCH_NAME}" + fi + + MAIN_BRANCH=$(git remote show origin | grep 'HEAD branch' | cut -d' ' -f5) + + if [ -z "$MAIN_BRANCH" ]; then + MAIN_BRANCH="main" + fi + + echo "Merging ${BRANCH_NAME} to ${MAIN_BRANCH}..." + echo "Current commit info:" + git log --oneline -3 + + # Fetch all branches including the release branch + git fetch origin ${BRANCH_NAME} + git fetch origin ${MAIN_BRANCH} + + # Checkout main branch + git checkout ${MAIN_BRANCH} + + # Show branch status before merge + echo "=== Branch status before merge ===" + git log --oneline --graph --all -5 + echo "=== Diff between ${MAIN_BRANCH} and origin/${BRANCH_NAME} ===" + git diff ${MAIN_BRANCH} origin/${BRANCH_NAME} --stat || echo "No differences found" + + # Force create a merge commit even if there are no changes + # This ensures the release history is properly recorded + git merge origin/${BRANCH_NAME} \ + --no-ff \ + -m "chore(release): merge ${BRANCH_NAME} to ${MAIN_BRANCH} [auto release commit]" + + # Show merge result + echo "=== Merge result ===" + git log --oneline --graph -3 + + # Push to main + git push origin ${MAIN_BRANCH} + + echo "✓ Successfully merged ${BRANCH_NAME} to ${MAIN_BRANCH}" + + - name: Delete release branch + run: | + BRANCH_NAME="${{ needs.extract-version.outputs.tag_name }}" + # Extract branch name: v1.0.0 -> release/v1.0.0 + if [[ ! "$BRANCH_NAME" =~ ^release/ ]]; then + BRANCH_NAME="release/${BRANCH_NAME}" + fi + + echo "Deleting release branch: ${BRANCH_NAME}" + git push origin --delete ${BRANCH_NAME} + echo "✓ Deleted branch ${BRANCH_NAME}" + + - name: Release cleanup summary + run: | + BRANCH_NAME="${{ github.ref_name }}" + TAG_NAME="${{ needs.extract-version.outputs.tag_name }}" + MAIN_BRANCH=$(git remote show origin | grep 'HEAD branch' | cut -d' ' -f5) + if [ -z "$MAIN_BRANCH" ]; then + MAIN_BRANCH="main" + fi + + echo "## Release Cleanup Summary" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "✓ Release completed successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### Actions Performed:" >> $GITHUB_STEP_SUMMARY + echo "- Merged \`${BRANCH_NAME}\` to \`${MAIN_BRANCH}\`" >> $GITHUB_STEP_SUMMARY + echo "- Deleted release branch \`${BRANCH_NAME}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- Tag: \`${TAG_NAME}\`" >> $GITHUB_STEP_SUMMARY + echo "- Version: \`${{ needs.extract-version.outputs.version }}\`" >> $GITHUB_STEP_SUMMARY + echo "- Release Type: $([ "${{ needs.extract-version.outputs.is_rc }}" = "true" ] && echo "Release Candidate" || echo "Stable Release")" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/update-version.yml b/.github/workflows/update-version.yml index d6c717d..112329f 100644 --- a/.github/workflows/update-version.yml +++ b/.github/workflows/update-version.yml @@ -42,7 +42,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: ${{ inputs.ref }} fetch-depth: 0 @@ -148,7 +148,7 @@ jobs: - name: Upload modified ALVersionInfo.py ready for build if: steps.check_changes.outputs.has_changes == 'true' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: updated-version-info-for-build path: src/gui/temp/ALVersionInfo.py @@ -156,7 +156,7 @@ jobs: - name: Upload modified ALVersionInfo.py ready for commit if: steps.check_changes.outputs.has_changes == 'true' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: updated-version-info-for-commit path: src/gui/ALVersionInfo.py