diff --git a/.github/workflows/reusable-build-package.yml b/.github/workflows/reusable-build-package.yml new file mode 100644 index 0000000000000..f7c744af7c34a --- /dev/null +++ b/.github/workflows/reusable-build-package.yml @@ -0,0 +1,60 @@ +## +# A reusable workflow that builds and packages WordPress. The resulting package can be used to test upgrading and installing. +## +name: Build and package WordPress + +on: + workflow_call: + +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + +jobs: + # Builds and packages WordPress. + # + # Performs the following steps: + # - Checks out the repository. + # - Sets up Node.js. + # - Runs the build script. + # - Prepares the directory structure for the ZIP. + # - Creates a ZIP of the built files. + # - Uploads the ZIP as a GitHub Actions artifact. + build: + name: WordPress + permissions: + contents: read + runs-on: ubuntu-24.04 + timeout-minutes: 20 + + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false + + - name: Set up Node.js + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 + with: + node-version-file: '.nvmrc' + cache: npm + + - name: Install npm Dependencies + run: npm ci + + - name: Build WordPress + run: npm run build + + - name: Prepare the directory structure for the ZIP + run: mv build wordpress + + - name: Create ZIP of built files + run: zip -q -r develop.zip wordpress/. + + - name: Upload ZIP as a GitHub Actions artifact + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + with: + name: wordpress-develop + path: develop.zip + if-no-files-found: error diff --git a/.github/workflows/reusable-upgrade-testing.yml b/.github/workflows/reusable-upgrade-testing.yml index 1c617ee91f36f..7b9f542041165 100644 --- a/.github/workflows/reusable-upgrade-testing.yml +++ b/.github/workflows/reusable-upgrade-testing.yml @@ -14,7 +14,7 @@ on: required: true type: 'string' new-version: - description: 'The version of WordPress to update to.' + description: 'The version of WordPress to update to. Use "latest" to update to the latest version, "develop" to update to the current branch, or provide a specific version number to update to.' type: 'string' default: 'latest' php: @@ -49,8 +49,13 @@ jobs: # - Downloads the specified version of WordPress. # - Creates a `wp-config.php` file. # - Installs WordPress. + # - Checks the version of WordPress before the upgrade. # - Updates to the latest minor version. + # - Updates the database after the minor update. + # - Checks the version of WordPress after the minor update. # - Updates to the version of WordPress being tested. + # - Updates the database. + # - Checks the version of WordPress after the upgrade. upgrade-tests: name: ${{ inputs.wp }} to ${{ inputs.new-version }} / PHP ${{ inputs.php }} with ${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.multisite && ' multisite' || '' }} permissions: {} @@ -96,11 +101,38 @@ jobs: --url=http://localhost/ --title="Upgrade Test" --admin_user=admin \ --admin_password=password --admin_email=me@example.org --skip-email + - name: Pre-upgrade version check + run: wp core version + - name: Update to the latest minor version run: wp core update --minor + - name: Update the database after the minor update + run: wp core update-db ${{ inputs.multisite && '--network' || '' }} + + - name: Post-upgrade version check after the minor update + run: wp core version + + - name: Download build artifact for the current branch + if: ${{ inputs.new-version == 'develop' }} + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: wordpress-develop + + - name: Upgrade to WordPress at current branch + if: ${{ inputs.new-version == 'develop' }} + run: | + wp core update develop.zip + - name: Upgrade to WordPress ${{ inputs.new-version }} + if: ${{ inputs.new-version != 'develop' }} run: | wp core update ${{ 'latest' != inputs.new-version && '--version="${WP_VERSION}"' || '' }} env: WP_VERSION: ${{ inputs.new-version }} + + - name: Update the database + run: wp core update-db ${{ inputs.multisite && '--network' || '' }} + + - name: Post-upgrade version check + run: wp core version diff --git a/.github/workflows/upgrade-develop-testing.yml b/.github/workflows/upgrade-develop-testing.yml new file mode 100644 index 0000000000000..edb57bc8d6e88 --- /dev/null +++ b/.github/workflows/upgrade-develop-testing.yml @@ -0,0 +1,129 @@ +# Confirms that updating WordPress using WP-CLI works successfully. +# +# This workflow tests upgrading from a previous version to the current wordpress-develop checkout, not to a version available on WordPress.org. +name: Upgrade Develop Version Tests + +on: + push: + branches: + - trunk + - '6.[8-9]' + - '[7-9].[0-9]' + tags: + - '[0-9]+.[0-9]' + - '[0-9]+.[0-9].[0-9]+' + paths: + # Any change to a source PHP file should run checks. + - 'src/**.php' + # Confirm any changes to relevant workflow files. + - '.github/workflows/upgrade-develop-testing.yml' + - '.github/workflows/reusable-upgrade-testing.yml' + pull_request: + branches: + - trunk + - '6.[8-9]' + - '[7-9].[0-9]' + paths: + # Any change to a source PHP file should run checks. + - 'src/**.php' + # Confirm any changes to relevant workflow files. + - '.github/workflows/upgrade-develop-testing.yml' + - '.github/workflows/reusable-upgrade-testing.yml' + workflow_dispatch: + +# Cancels all previous workflow runs for pull requests that have not completed. +concurrency: + # The concurrency group contains the workflow name and the branch name for pull requests + # or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + cancel-in-progress: true + +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + +jobs: + # Build WordPress from the current branch ready for the upgrade tests. + build: + name: Build + uses: ./.github/workflows/reusable-build-package.yml + permissions: + contents: read + + # Run upgrade tests for the current branch. + upgrade-tests-develop: + name: Upgrade from ${{ matrix.wp }} + uses: ./.github/workflows/reusable-upgrade-testing.yml + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + needs: [ build ] + strategy: + fail-fast: false + matrix: + os: [ 'ubuntu-24.04' ] + php: [ '7.2', '8.4' ] + db-type: [ 'mysql' ] + db-version: [ '5.7', '8.4' ] + wp: [ '6.5', '6.6', '6.7' ] + multisite: [ false, true ] + + exclude: + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. + - php: '7.2' + db-version: '8.4' + with: + os: ${{ matrix.os }} + php: ${{ matrix.php }} + db-type: ${{ matrix.db-type }} + db-version: ${{ matrix.db-version }} + wp: ${{ matrix.wp }} + new-version: develop + multisite: ${{ matrix.multisite }} + + slack-notifications: + name: Slack Notifications + uses: ./.github/workflows/slack-notifications.yml + permissions: + actions: read + contents: read + needs: [ upgrade-tests-develop ] + if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }} + with: + calling_status: ${{ contains( needs.*.result, 'cancelled' ) && 'cancelled' || contains( needs.*.result, 'failure' ) && 'failure' || 'success' }} + secrets: + SLACK_GHA_SUCCESS_WEBHOOK: ${{ secrets.SLACK_GHA_SUCCESS_WEBHOOK }} + SLACK_GHA_CANCELLED_WEBHOOK: ${{ secrets.SLACK_GHA_CANCELLED_WEBHOOK }} + SLACK_GHA_FIXED_WEBHOOK: ${{ secrets.SLACK_GHA_FIXED_WEBHOOK }} + SLACK_GHA_FAILURE_WEBHOOK: ${{ secrets.SLACK_GHA_FAILURE_WEBHOOK }} + + failed-workflow: + name: Failed workflow tasks + runs-on: ubuntu-24.04 + permissions: + actions: write + needs: [ slack-notifications ] + if: | + always() && + github.repository == 'WordPress/wordpress-develop' && + github.event_name != 'pull_request' && + github.run_attempt < 2 && + ( + contains( needs.*.result, 'cancelled' ) || + contains( needs.*.result, 'failure' ) + ) + + steps: + - name: Dispatch workflow run + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + retries: 2 + retry-exempt-status-codes: 418 + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'failed-workflow.yml', + ref: 'trunk', + inputs: { + run_id: `${context.runId}`, + } + });