Prepare release v1.25.1 #522
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Changelog Automation | |
| on: | |
| workflow_call: | |
| inputs: | |
| changelog-file: | |
| description: Path to the managed changelog file. | |
| required: false | |
| type: string | |
| default: CHANGELOG.md | |
| project: | |
| description: Optional GitHub Project V2 number for consumer repositories. When omitted, php-fast-forward repositories default to the first organization project. | |
| required: false | |
| type: string | |
| default: '' | |
| version: | |
| description: Optional version to promote during manual release preparation. | |
| required: false | |
| type: string | |
| default: '' | |
| release-branch-prefix: | |
| description: Prefix used for release-preparation branches. | |
| required: false | |
| type: string | |
| default: release/v | |
| workflow_dispatch: | |
| inputs: | |
| changelog-file: | |
| description: Path to the managed changelog file. | |
| required: false | |
| type: string | |
| default: CHANGELOG.md | |
| project: | |
| description: Optional GitHub Project V2 number for consumer repositories. Leave empty to use the configured repository variable or the php-fast-forward default. | |
| required: false | |
| type: string | |
| default: '' | |
| version: | |
| description: Optional version to promote. Leave empty to infer from Unreleased. | |
| required: false | |
| type: string | |
| default: '' | |
| release-branch-prefix: | |
| description: Prefix used for release-preparation branches. | |
| required: false | |
| type: string | |
| default: release/v | |
| pull_request: | |
| types: [opened, reopened, synchronize] | |
| pull_request_target: | |
| types: [closed] | |
| permissions: | |
| actions: write | |
| contents: write | |
| pull-requests: write | |
| repository-projects: write | |
| concurrency: | |
| group: ${{ github.event.pull_request.number && format('changelog-pr-{0}', github.event.pull_request.number) || format('changelog-{0}', github.ref) }} | |
| cancel-in-progress: ${{ github.event.pull_request.merged != true }} | |
| env: | |
| FORCE_COLOR: '1' | |
| jobs: | |
| resolve_php: | |
| name: Resolve PHP Version | |
| runs-on: ubuntu-latest | |
| outputs: | |
| php-version: ${{ steps.resolve.outputs.php-version }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Checkout dev-tools workflow action source | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: php-fast-forward/dev-tools | |
| ref: ${{ github.repository == 'php-fast-forward/dev-tools' && (github.event_name == 'pull_request_target' && github.event.pull_request.base.sha || github.sha) || 'main' }} | |
| path: .dev-tools-actions | |
| sparse-checkout: | | |
| .github/actions | |
| - name: Resolve workflow PHP version | |
| id: resolve | |
| uses: ./.dev-tools-actions/.github/actions/php/resolve-version | |
| validate_pull_request: | |
| name: Validate PR Changelog | |
| needs: resolve_php | |
| if: ${{ github.event.pull_request.number && github.event.pull_request.merged != true && !startsWith(github.event.pull_request.head.ref, inputs.release-branch-prefix || 'release/v') }} | |
| runs-on: ubuntu-latest | |
| env: | |
| CHANGELOG_FILE: ${{ inputs.changelog-file || 'CHANGELOG.md' }} | |
| CHANGELOG_ROOT_VERSION: ${{ github.event.pull_request.head.ref && format('dev-{0}', github.event.pull_request.head.ref) || 'dev-main' }} | |
| BASE_REF: ${{ github.event.pull_request.base.ref }} | |
| HEAD_REF: ${{ github.event.pull_request.head.ref }} | |
| PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} | |
| PULL_REQUEST_TITLE: ${{ github.event.pull_request.title }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - name: Checkout dev-tools workflow action source | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: php-fast-forward/dev-tools | |
| ref: ${{ github.repository == 'php-fast-forward/dev-tools' && (github.event_name == 'pull_request_target' && github.event.pull_request.base.sha || github.sha) || 'main' }} | |
| path: .dev-tools-actions | |
| - name: Setup PHP and install dependencies | |
| uses: ./.dev-tools-actions/.github/actions/php/setup-composer | |
| with: | |
| php-version: ${{ needs.resolve_php.outputs.php-version }} | |
| root-version: ${{ env.CHANGELOG_ROOT_VERSION }} | |
| install-options: --prefer-dist --no-progress --no-interaction --no-plugins --no-scripts | |
| - name: Fetch base branch reference | |
| run: git fetch --no-tags --depth=1 origin "+refs/heads/${BASE_REF}:refs/remotes/origin/${BASE_REF}" | |
| - name: Create Dependabot changelog entry when missing | |
| id: dependabot_entry | |
| if: ${{ (github.event.pull_request.user.login == 'dependabot[bot]' || github.event.pull_request.user.login == 'app/dependabot' || startsWith(github.event.pull_request.head.ref, 'dependabot/')) && github.event.pull_request.head.repo.full_name == github.repository }} | |
| uses: ./.dev-tools-actions/.github/actions/changelog/create-dependabot-entry | |
| with: | |
| changelog-file: ${{ env.CHANGELOG_FILE }} | |
| base-ref: ${{ env.BASE_REF }} | |
| head-ref: ${{ env.HEAD_REF }} | |
| pull-request-number: ${{ env.PULL_REQUEST_NUMBER }} | |
| pull-request-title: ${{ env.PULL_REQUEST_TITLE }} | |
| - name: Verify changelog update | |
| run: dev-tools changelog:check --file="${CHANGELOG_FILE}" --against="origin/${BASE_REF}" | |
| - uses: ./.dev-tools-actions/.github/actions/summary/write | |
| with: | |
| markdown: | | |
| ## Changelog Validation Summary | |
| - Changelog file: `${{ env.CHANGELOG_FILE }}` | |
| - Compared base ref: `origin/${{ env.BASE_REF }}` | |
| - Dependabot fallback status: `${{ steps.dependabot_entry.outputs.status || 'not needed' }}` | |
| - Dependabot fallback entry created: `${{ steps.dependabot_entry.outputs.created || 'false' }}` | |
| - Dependabot fallback generated message: `${{ steps.dependabot_entry.outputs.message || 'not needed' }}` | |
| - Validation result: success | |
| changelog_validation: | |
| name: Changelog Validation | |
| needs: | |
| - resolve_php | |
| - validate_pull_request | |
| if: ${{ always() && github.event.pull_request.number && github.event.pull_request.merged != true }} | |
| runs-on: ubuntu-latest | |
| env: | |
| RELEASE_BRANCH_PREFIX: ${{ inputs.release-branch-prefix || 'release/v' }} | |
| VALIDATION_RESULT: ${{ needs.validate_pull_request.result }} | |
| steps: | |
| - name: Require changelog validation result | |
| env: | |
| HEAD_REF: ${{ github.event.pull_request.head.ref }} | |
| run: | | |
| if [[ "${HEAD_REF}" == "${RELEASE_BRANCH_PREFIX}"* ]]; then | |
| echo "Release preparation branch detected; changelog validation is intentionally skipped." | |
| exit 0 | |
| fi | |
| if [ "${VALIDATION_RESULT}" = "success" ]; then | |
| echo "Changelog validation passed." | |
| exit 0 | |
| fi | |
| echo "::error::Changelog validation did not pass for this pull request." | |
| echo "Validation result: ${VALIDATION_RESULT}" | |
| exit 1 | |
| prepare_release_pull_request: | |
| name: Prepare Release Pull Request | |
| needs: resolve_php | |
| if: ${{ !github.event.pull_request.number }} | |
| runs-on: ubuntu-latest | |
| env: | |
| CHANGELOG_FILE: ${{ inputs.changelog-file || 'CHANGELOG.md' }} | |
| RELEASE_BRANCH_PREFIX: ${{ inputs.release-branch-prefix || 'release/v' }} | |
| CHANGELOG_ROOT_VERSION: ${{ format('dev-{0}', github.event.repository.default_branch) }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| token: ${{ github.token }} | |
| ref: ${{ github.event.repository.default_branch }} | |
| fetch-depth: 0 | |
| - name: Checkout dev-tools workflow action source | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: php-fast-forward/dev-tools | |
| ref: ${{ github.repository == 'php-fast-forward/dev-tools' && (github.event_name == 'pull_request_target' && github.event.pull_request.base.sha || github.sha) || 'main' }} | |
| path: .dev-tools-actions | |
| - name: Setup PHP and install dependencies | |
| uses: ./.dev-tools-actions/.github/actions/php/setup-composer | |
| with: | |
| php-version: ${{ needs.resolve_php.outputs.php-version }} | |
| root-version: ${{ env.CHANGELOG_ROOT_VERSION }} | |
| install-options: --prefer-dist --no-progress --no-interaction --no-plugins --no-scripts | |
| - name: Resolve release version | |
| id: version | |
| uses: ./.dev-tools-actions/.github/actions/changelog/resolve-version | |
| with: | |
| changelog-file: ${{ env.CHANGELOG_FILE }} | |
| version: ${{ inputs.version || '' }} | |
| - name: Promote changelog release | |
| env: | |
| RELEASE_VERSION: ${{ steps.version.outputs.value }} | |
| run: | | |
| release_date="$(date -u +%F)" | |
| dev-tools changelog:promote "${RELEASE_VERSION}" --file="${CHANGELOG_FILE}" --date="${release_date}" | |
| - name: Render release notes preview | |
| uses: ./.dev-tools-actions/.github/actions/changelog/render-release-notes | |
| with: | |
| changelog-file: ${{ env.CHANGELOG_FILE }} | |
| version: ${{ steps.version.outputs.value }} | |
| - name: Create release preparation pull request | |
| id: create_pr | |
| uses: peter-evans/create-pull-request@v8 | |
| with: | |
| token: ${{ github.token }} | |
| branch: ${{ env.RELEASE_BRANCH_PREFIX }}${{ steps.version.outputs.value }} | |
| delete-branch: false | |
| base: ${{ github.event.repository.default_branch }} | |
| add-paths: | | |
| ${{ env.CHANGELOG_FILE }} | |
| commit-message: Prepare release v${{ steps.version.outputs.value }} | |
| title: Prepare release v${{ steps.version.outputs.value }} | |
| body: | | |
| ## Summary | |
| - promote `Unreleased` into `${{ steps.version.outputs.value }}` | |
| - prepare the GitHub release body from `${{ env.CHANGELOG_FILE }}` | |
| ## Version Resolution | |
| - source: `${{ steps.version.outputs.source }}` | |
| - name: Checkout release branch | |
| if: ${{ steps.create_pr.outputs.pull-request-number != '' }} | |
| uses: actions/checkout@v6 | |
| with: | |
| token: ${{ github.token }} | |
| ref: ${{ env.RELEASE_BRANCH_PREFIX }}${{ steps.version.outputs.value }} | |
| fetch-depth: 0 | |
| submodules: recursive | |
| - name: Checkout dev-tools workflow action source | |
| if: ${{ steps.create_pr.outputs.pull-request-number != '' }} | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: php-fast-forward/dev-tools | |
| ref: ${{ github.repository == 'php-fast-forward/dev-tools' && (github.event_name == 'pull_request_target' && github.event.pull_request.base.sha || github.sha) || 'main' }} | |
| path: .dev-tools-actions | |
| - name: Setup PHP and install dependencies | |
| if: ${{ steps.create_pr.outputs.pull-request-number != '' }} | |
| uses: ./.dev-tools-actions/.github/actions/php/setup-composer | |
| with: | |
| php-version: ${{ needs.resolve_php.outputs.php-version }} | |
| root-version: ${{ format('dev-{0}{1}', env.RELEASE_BRANCH_PREFIX, steps.version.outputs.value) }} | |
| install-options: --prefer-dist --no-progress --no-interaction --no-scripts | |
| safe-directories: | | |
| ${{ github.workspace }}/.github/wiki | |
| - name: Refresh wiki preview pointer for release pull request | |
| if: ${{ steps.create_pr.outputs.pull-request-number != '' }} | |
| id: refresh_release_preview | |
| uses: ./.dev-tools-actions/.github/actions/wiki/refresh-preview-pointer | |
| with: | |
| preview-branch: pr-${{ steps.create_pr.outputs.pull-request-number }} | |
| commit-message: Update wiki docs for PR #${{ steps.create_pr.outputs.pull-request-number }} | |
| - name: Commit release pull request wiki submodule pointer | |
| if: ${{ steps.create_pr.outputs.pull-request-number != '' && steps.refresh_release_preview.outputs.pointer-changed == 'true' }} | |
| id: release_wiki_pointer_commit | |
| uses: EndBug/add-and-commit@v10 | |
| with: | |
| add: .github/wiki | |
| message: Update wiki submodule pointer for PR #${{ steps.create_pr.outputs.pull-request-number }} | |
| default_author: github_actions | |
| pull: "--rebase --autostash" | |
| push: true | |
| - name: Dispatch required tests for release pull request | |
| if: ${{ steps.create_pr.outputs.pull-request-number != '' }} | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| RELEASE_BRANCH: ${{ env.RELEASE_BRANCH_PREFIX }}${{ steps.version.outputs.value }} | |
| run: gh workflow run tests.yml --ref "${RELEASE_BRANCH}" -f publish-required-statuses=true | |
| - uses: actions/checkout@v6 | |
| - name: Checkout dev-tools workflow action source | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: php-fast-forward/dev-tools | |
| ref: ${{ github.repository == 'php-fast-forward/dev-tools' && (github.event_name == 'pull_request_target' && github.event.pull_request.base.sha || github.sha) || 'main' }} | |
| path: .dev-tools-actions | |
| sparse-checkout: | | |
| .github/actions | |
| - uses: ./.dev-tools-actions/.github/actions/project-board/transition-status | |
| with: | |
| project: ${{ inputs.project || vars.PROJECT || '' }} | |
| from-status: Merged | |
| to-status: Release Prepared | |
| - uses: ./.dev-tools-actions/.github/actions/summary/write | |
| with: | |
| markdown: | | |
| ## Release Preparation Summary | |
| - Changelog file: `${{ env.CHANGELOG_FILE }}` | |
| - Release version: `${{ steps.version.outputs.value }}` | |
| - Version source: `${{ steps.version.outputs.source }}` | |
| - Pull request operation: `${{ steps.create_pr.outputs.pull-request-operation || 'none' }}` | |
| - Pull request URL: ${{ steps.create_pr.outputs.pull-request-url || 'not created' }} | |
| - Wiki preview refresh: `${{ steps.create_pr.outputs.pull-request-number != '' && (steps.refresh_release_preview.outputs.published == 'true' && 'published' || 'unchanged') || 'not needed' }}` | |
| - Wiki pointer update: `${{ steps.create_pr.outputs.pull-request-number != '' && (steps.refresh_release_preview.outputs.pointer-changed == 'true' && 'updated' || 'unchanged') || 'not needed' }}` | |
| - Required test dispatch: `${{ steps.create_pr.outputs.pull-request-number != '' && 'requested' || 'not needed' }}` | |
| publish_merged_release: | |
| name: Publish Merged Release | |
| needs: resolve_php | |
| if: ${{ github.event.pull_request.merged == true && github.event.pull_request.base.ref == github.event.repository.default_branch && github.event.pull_request.head.repo.full_name == github.repository && startsWith(github.event.pull_request.head.ref, inputs.release-branch-prefix || 'release/v') }} | |
| runs-on: ubuntu-latest | |
| env: | |
| CHANGELOG_FILE: ${{ inputs.changelog-file || 'CHANGELOG.md' }} | |
| RELEASE_BRANCH_PREFIX: ${{ inputs.release-branch-prefix || 'release/v' }} | |
| CHANGELOG_ROOT_VERSION: ${{ format('dev-{0}', github.event.repository.default_branch) }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| token: ${{ github.token }} | |
| ref: ${{ github.event.pull_request.base.ref }} | |
| fetch-depth: 0 | |
| - name: Checkout dev-tools workflow action source | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: php-fast-forward/dev-tools | |
| ref: ${{ github.repository == 'php-fast-forward/dev-tools' && (github.event_name == 'pull_request_target' && github.event.pull_request.base.sha || github.sha) || 'main' }} | |
| path: .dev-tools-actions | |
| - name: Setup PHP and install dependencies | |
| uses: ./.dev-tools-actions/.github/actions/php/setup-composer | |
| with: | |
| php-version: ${{ needs.resolve_php.outputs.php-version }} | |
| root-version: ${{ env.CHANGELOG_ROOT_VERSION }} | |
| install-options: --prefer-dist --no-progress --no-interaction --no-plugins --no-scripts | |
| - name: Resolve merged release version | |
| id: version | |
| uses: ./.dev-tools-actions/.github/actions/changelog/resolve-merged-version | |
| with: | |
| head-ref: ${{ github.event.pull_request.head.ref }} | |
| release-branch-prefix: ${{ env.RELEASE_BRANCH_PREFIX }} | |
| - name: Render release notes | |
| uses: ./.dev-tools-actions/.github/actions/changelog/render-release-notes | |
| with: | |
| changelog-file: ${{ env.CHANGELOG_FILE }} | |
| version: ${{ steps.version.outputs.value }} | |
| - name: Publish GitHub release | |
| id: publish_release | |
| uses: ./.dev-tools-actions/.github/actions/changelog/publish-release | |
| with: | |
| version: ${{ steps.version.outputs.value }} | |
| target: ${{ github.event.pull_request.merge_commit_sha || github.sha }} | |
| - uses: actions/checkout@v6 | |
| - name: Checkout dev-tools workflow action source | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: php-fast-forward/dev-tools | |
| ref: ${{ github.repository == 'php-fast-forward/dev-tools' && (github.event_name == 'pull_request_target' && github.event.pull_request.base.sha || github.sha) || 'main' }} | |
| path: .dev-tools-actions | |
| sparse-checkout: | | |
| .github/actions | |
| - id: release_project_status | |
| uses: ./.dev-tools-actions/.github/actions/project-board/transition-status | |
| with: | |
| project: ${{ inputs.project || vars.PROJECT || '' }} | |
| from-statuses: Release Prepared,Merged | |
| to-status: Released | |
| include-current-pull-request: 'true' | |
| - uses: ./.dev-tools-actions/.github/actions/summary/write | |
| with: | |
| markdown: | | |
| ## Release Publication Summary | |
| - Changelog file: `${{ env.CHANGELOG_FILE }}` | |
| - Published tag: `v${{ steps.version.outputs.value }}` | |
| - Release operation: `${{ steps.publish_release.outputs.operation }}` | |
| - Release URL: ${{ steps.publish_release.outputs.url }} | |
| - Wiki publication: `delegated to wiki-maintenance from pr-${{ github.event.pull_request.number }}` | |
| - Project items released: `${{ steps.release_project_status.outputs.moved-count }}` | |
| - Project items skipped: `${{ steps.release_project_status.outputs.skipped-count }}` | |
| - Project source statuses: `${{ steps.release_project_status.outputs.source-statuses }}` |