|
5 | 5 | types: [published] |
6 | 6 |
|
7 | 7 | workflow_dispatch: |
| 8 | + inputs: |
| 9 | + test_version: |
| 10 | + description: 'Test version (e.g. 0.0.99-test) - skips gem pushes if provided' |
| 11 | + required: false |
| 12 | + type: string |
| 13 | + default: '' |
8 | 14 |
|
9 | 15 | jobs: |
10 | 16 | build: |
11 | 17 | name: Build + Publish |
12 | 18 | runs-on: ubuntu-latest |
| 19 | + permissions: |
| 20 | + contents: write # for commit, push, branch ops |
| 21 | + pull-requests: write # for creating/editing PR + adding labels |
| 22 | + |
13 | 23 | steps: |
14 | 24 | - uses: actions/checkout@v6 |
| 25 | + with: |
| 26 | + fetch-depth: 0 |
| 27 | + |
15 | 28 | - uses: ruby/setup-ruby@v1 |
16 | 29 | with: |
17 | | - bundler-cache: true |
| 30 | + bundler-cache: true |
18 | 31 |
|
19 | | - - name: Get Current Version |
20 | | - id: version |
| 32 | + - name: Extract Versions and Package Name |
21 | 33 | run: | |
22 | | - echo "OLD=$(grep spec.version *.gemspec | cut -d\" -f2)" >> $GITHUB_OUTPUT |
23 | | - echo "NEW=$(echo ${GITHUB_REF_NAME:1})" >> $GITHUB_OUTPUT |
| 34 | + OLD_VERSION=$(grep 'spec.version' *.gemspec | cut -d'"' -f2 | tr -d ' ') |
| 35 | + PACKAGE_NAME=$(grep 'spec.name' *.gemspec | cut -d'"' -f2 | tr -d ' ') |
24 | 36 |
|
25 | | - - name: Get Package Name |
26 | | - id: name |
27 | | - run: echo "NAME=$(grep spec.name *.gemspec | cut -d\" -f2)" >> $GITHUB_OUTPUT |
| 37 | + if [ -n "${{ inputs.test_version }}" ]; then |
| 38 | + NEW_VERSION="${{ inputs.test_version }}" |
| 39 | + IS_TEST_MODE="true" |
| 40 | + echo "TEST MODE: Using provided test version ${{ inputs.test_version }} (gem pushes will be skipped)" |
| 41 | + else |
| 42 | + NEW_VERSION=${GITHUB_REF_NAME#v} |
| 43 | + IS_TEST_MODE="false" |
| 44 | + echo "REAL MODE: Using tag-derived version $NEW_VERSION" |
| 45 | + fi |
28 | 46 |
|
29 | | - - name: Update Version |
30 | | - run: | |
31 | | - sed -i -e '/spec.version/c\ spec.version = "${{ steps.version.outputs.NEW }}"' \ |
32 | | - ${{ steps.name.outputs.NAME }}.gemspec |
| 47 | + echo "OLD_VERSION=$OLD_VERSION" >> $GITHUB_ENV |
| 48 | + echo "VERSION=$NEW_VERSION" >> $GITHUB_ENV |
| 49 | + echo "PACKAGE_NAME=$PACKAGE_NAME" >> $GITHUB_ENV |
| 50 | + echo "IS_TEST_MODE=$IS_TEST_MODE" >> $GITHUB_ENV |
33 | 51 |
|
34 | | - - name: Remove non-theme related assets |
35 | | - run: rm -rf assets/audio |
| 52 | + RELEASE_BRANCH="release/v${NEW_VERSION}" |
| 53 | + echo "RELEASE_BRANCH=$RELEASE_BRANCH" >> $GITHUB_ENV |
36 | 54 |
|
37 | | - - name: Build |
38 | | - run: gem build ${{ steps.name.outputs.NAME }}.gemspec |
| 55 | + echo "Old version: $OLD_VERSION" |
| 56 | + echo "New version: $VERSION" |
| 57 | + echo "Package: $PACKAGE_NAME" |
| 58 | + echo "Branch: $RELEASE_BRANCH" |
| 59 | + echo "Test mode: $IS_TEST_MODE" |
39 | 60 |
|
40 | | - - name: Credentials & Push |
| 61 | + - name: Update Version in gemspec |
| 62 | + run: | |
| 63 | + sed -i -e "s/spec.version\s*=.*/spec.version = \"${{ env.VERSION }}\"/" \ |
| 64 | + ${{ env.PACKAGE_NAME }}.gemspec |
| 65 | +
|
| 66 | + - name: Build Gem |
| 67 | + run: gem build ${{ env.PACKAGE_NAME }}.gemspec |
| 68 | + |
| 69 | + - name: Credentials & Push to RubyGems |
| 70 | + if: env.IS_TEST_MODE != 'true' |
41 | 71 | run: | |
42 | 72 | mkdir -p $HOME/.gem |
43 | 73 | touch $HOME/.gem/credentials |
44 | 74 | chmod 0600 $HOME/.gem/credentials |
45 | 75 | printf -- "---\n:rubygems: ${{ secrets.RUBYGEMS_TOKEN }}\n" > $HOME/.gem/credentials |
46 | 76 | printf -- ":github: Bearer ${{ secrets.GITHUB_TOKEN }}\n" >> $HOME/.gem/credentials |
| 77 | +
|
| 78 | + # Push to GitHub Packages |
47 | 79 | gem push \ |
48 | 80 | --key=github \ |
49 | 81 | --host=https://rubygems.pkg.github.com/${{ github.repository_owner }} \ |
50 | | - ${{ steps.name.outputs.NAME }}-*.gem |
51 | | - gem push --key=rubygems ${{ steps.name.outputs.NAME }}-*.gem |
| 82 | + ${{ env.PACKAGE_NAME }}-*.gem |
52 | 83 |
|
53 | | - - name: Version PR |
54 | | - uses: peter-evans/create-pull-request@v8 |
55 | | - with: |
56 | | - commit-message: Update to ${{ steps.version.outputs.NEW }} |
57 | | - title: Update ${{ steps.name.outputs.NAME }} (${{ steps.version.outputs.NEW }}) |
58 | | - body: ${{ steps.old_version.outputs.OLD }} |
59 | | - branch: update-version |
60 | | - base: main |
| 84 | + # Push to rubygems.org |
| 85 | + gem push --key=rubygems ${{ env.PACKAGE_NAME }}-*.gem |
| 86 | +
|
| 87 | + - name: Commit version bump |
| 88 | + run: | |
| 89 | + git config user.name "GitHub Actions" |
| 90 | + git config user.email "actions@github.com" |
| 91 | +
|
| 92 | + git add ${{ env.PACKAGE_NAME }}.gemspec |
| 93 | + git commit -m "chore: bump version to ${{ env.VERSION }}" || echo "No changes to commit" |
| 94 | +
|
| 95 | + - name: Push to release branch |
| 96 | + run: git push origin HEAD:${{ env.RELEASE_BRANCH }} --force |
| 97 | + |
| 98 | + - name: Create or update PR with auto-merge label |
| 99 | + env: |
| 100 | + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| 101 | + run: | |
| 102 | + PR_TITLE="chore: update ${{ env.PACKAGE_NAME }} to ${{ env.VERSION }}" |
| 103 | + PR_BODY="Automated version bump to ${{ env.VERSION }} after release publication.\n\nOld version was ${{ env.OLD_VERSION }}." |
| 104 | +
|
| 105 | + # Check for existing open PR on this branch |
| 106 | + EXISTING_PR=$(gh pr list --head "${{ env.RELEASE_BRANCH }}" --state open --json number --jq '.[0].number // ""') |
| 107 | +
|
| 108 | + if [ -n "$EXISTING_PR" ]; then |
| 109 | + echo "Updating existing PR #$EXISTING_PR" |
| 110 | + gh pr edit "$EXISTING_PR" \ |
| 111 | + --title "$PR_TITLE" \ |
| 112 | + --body "$PR_BODY" |
| 113 | + gh pr reopen "$EXISTING_PR" || true |
| 114 | + else |
| 115 | + echo "Creating new PR" |
| 116 | + gh pr create \ |
| 117 | + --base main \ |
| 118 | + --head "${{ env.RELEASE_BRANCH }}" \ |
| 119 | + --title "$PR_TITLE" \ |
| 120 | + --body "$PR_BODY" \ |
| 121 | + --label "auto-merge" |
| 122 | + fi |
61 | 123 |
|
62 | | - - name: Trim old packages |
| 124 | + - name: Trim old package versions |
| 125 | + if: env.IS_TEST_MODE != 'true' |
63 | 126 | uses: actions/delete-package-versions@v5 |
64 | 127 | with: |
65 | | - package-name: ${{ steps.name.outputs.NAME }} |
| 128 | + package-name: ${{ env.PACKAGE_NAME }} |
66 | 129 | package-type: rubygems |
67 | 130 | min-versions-to-keep: 5 |
0 commit comments