From eaf8982fa2d2b1a9961716d5641fad20ec4afb3b Mon Sep 17 00:00:00 2001 From: Diego Aquino Date: Sun, 12 Jan 2025 09:08:39 -0300 Subject: [PATCH] chore(ci): automatically publish releases based on pull request labels --- .../zimic-get-release-settings/action.yaml | 110 ++++++++++++++++++ ...-zimic.yaml => release-zimic-package.yaml} | 2 +- ...ease.yaml => release-zimic-to-github.yaml} | 34 ++++-- 3 files changed, 136 insertions(+), 10 deletions(-) create mode 100644 .github/actions/zimic-get-release-settings/action.yaml rename .github/workflows/{release-zimic.yaml => release-zimic-package.yaml} (99%) rename .github/workflows/{create-zimic-github-release.yaml => release-zimic-to-github.yaml} (64%) diff --git a/.github/actions/zimic-get-release-settings/action.yaml b/.github/actions/zimic-get-release-settings/action.yaml new file mode 100644 index 000000000..fd1013543 --- /dev/null +++ b/.github/actions/zimic-get-release-settings/action.yaml @@ -0,0 +1,110 @@ +name: Zimic Get Release Settings +description: Zimic Get Release Settings + +inputs: + project-name: + description: Project name + required: true + input-upgrade-type: + description: Upgrade type from the workflow inputs + required: false + input-pre-release-id: + description: Pre-release id from the workflow inputs + required: false +outputs: + upgrade-type: + description: Bumped version + value: ${{ steps.release-settings.outputs.upgrade-type }} + pre-release-id: + description: Bumped version + value: ${{ steps.release-settings.outputs.pre-release-id }} + +runs: + using: composite + steps: + - name: Get release settings + id: release-settings + uses: actions/github-script@v7 + with: + script: | + function setOutputs(outputs) { + console.log('Outputs:', outputs); + + for (const [key, value] of Object.entries(outputs)) { + core.setOutput(key, value); + } + } + + const eventName = '${{ github.event_name }}'; + const wasManuallyTriggered = eventName === 'workflow_dispatch' + + if (wasManuallyTriggered) { + console.log('This workflow was triggered manually.'); + + setOutputs({ + 'upgrade-type': '${{ inputs.input-upgrade-type }}', + 'pre-release-id': '${{ inputs.input-pre-release-id }}', + }) + return + } + + const isMergedPullRequest = + eventName === 'pull_request' && + '${{ github.event.pull_request.merged }}' === 'true'; + + if (!isMergedPullRequest) { + console.warn('This is not a merged pull request.'); + + setOutputs({ + 'upgrade-type': '', + 'pre-release-id': '', + }) + return + } + + console.log('This is a merged pull request. '); + console.log(`Fetching labels for ${context.repo.owner}/${context.repo.repo}#${context.issue.number}...`); + + const { data: labels } = await github.rest.issues.listLabelsOnIssue({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + console.log('Labels found:', labels); + + const expectedProjectName = '${{ inputs.project-name }}'; + + for (const label of labels) { + const labelMatch = /^(?[^:]+):(?[^-]+)(?:-(?.+))?$/.exec(label.name); + + if (!labelMatch) { + console.warn(`Label '${label.name}' does not match the expected pattern. Skipping...`); + continue + } + + const { projectName, upgradeType, preReleaseId = 'none' } = labelMatch.groups; + + if (projectName !== expectedProjectName) { + console.warn( + `Label '${label.name}' does not match the expected project name '${expectedProjectName}'. Skipping...` + ); + continue + } + + console.log(`Matching label found: '${label.name}'.`); + + setOutputs({ + 'upgrade-type': upgradeType, + 'pre-release-id': preReleaseId, + }) + return + } + + console.warn('No matching labels found.'); + + setOutputs({ + 'upgrade-type': '', + 'pre-release-id': '', + }) + return diff --git a/.github/workflows/release-zimic.yaml b/.github/workflows/release-zimic-package.yaml similarity index 99% rename from .github/workflows/release-zimic.yaml rename to .github/workflows/release-zimic-package.yaml index 713c48aa5..a1b00f2b5 100644 --- a/.github/workflows/release-zimic.yaml +++ b/.github/workflows/release-zimic-package.yaml @@ -1,4 +1,4 @@ -name: Release Zimic +name: Release Zimic Package on: release: diff --git a/.github/workflows/create-zimic-github-release.yaml b/.github/workflows/release-zimic-to-github.yaml similarity index 64% rename from .github/workflows/create-zimic-github-release.yaml rename to .github/workflows/release-zimic-to-github.yaml index 044f13137..c0d828dc8 100644 --- a/.github/workflows/create-zimic-github-release.yaml +++ b/.github/workflows/release-zimic-to-github.yaml @@ -1,6 +1,12 @@ -name: Create Zimic GitHub Release +name: Release Zimic to GitHub on: + pull_request: + types: + - closed + branches: + - canary + - v* workflow_dispatch: inputs: upgrade-type: @@ -33,10 +39,10 @@ env: TURBO_LOG_ORDER: stream jobs: - create-zimic-github-release: - name: Create Zimic Github Release + release-to-github: + name: Release to GitHub runs-on: ubuntu-latest - timeout-minutes: 3 + timeout-minutes: 5 environment: GitHub @@ -54,27 +60,37 @@ jobs: with: turbo-token: ${{ env.TURBO_TOKEN }} turbo-team: ${{ env.TURBO_TEAM }} - install: zimic + install: zimic... + + - name: Get Zimic release settings + id: release-settings + uses: ./.github/actions/zimic-get-release-settings + with: + project-name: zimic + input-upgrade-type: ${{ inputs.upgrade-type }} + input-pre-release-id: ${{ inputs.pre-release-id }} - name: Bump Zimic version id: bump-version + if: ${{ steps.release-settings.outputs.upgrade-type != '' }} uses: ./.github/actions/zimic-bump-version with: project-name: zimic project-directory: packages/zimic - upgrade-type: ${{ inputs.upgrade-type }} - pre-release-id: ${{ inputs.pre-release-id }} + upgrade-type: ${{ steps.release-settings.outputs.upgrade-type }} + pre-release-id: ${{ steps.release-settings.outputs.pre-release-id }} commit-user-name: ${{ vars.RELEASE_COMMIT_USER_NAME }} commit-user-email: ${{ vars.RELEASE_COMMIT_USER_EMAIL }} - name: Create GitHub release + if: ${{ steps.release-settings.outputs.upgrade-type != '' }} uses: ncipollo/release-action@v1 with: name: v${{ steps.bump-version.outputs.value }} tag: v${{ steps.bump-version.outputs.value }} commit: ${{ steps.bump-version.outputs.commit-sha }} token: ${{ secrets.GITHUB_TOKEN }} - makeLatest: ${{ inputs.pre-release-id == 'none' }} - prerelease: ${{ inputs.pre-release-id != 'node' }} + makeLatest: ${{ steps.release-settings.outputs.pre-release-id == 'none' }} + prerelease: ${{ steps.release-settings.outputs.pre-release-id != 'node' }} generateReleaseNotes: true draft: true