Skip to content

Commit

Permalink
Build/Test Tools: Add a workflow that tests the process of upgrading …
Browse files Browse the repository at this point in the history
…WordPress to a build of the current branch.

This complements the existing workflow which tests upgrading to an already released version.

Props johnbillion, peterwilsoncc, mukesh27, desrosj, audrasjb, joemcgill.

See #62221

git-svn-id: https://develop.svn.wordpress.org/trunk@59815 602fd350-edb4-49c9-b593-d223f7449a82
  • Loading branch information
johnbillion committed Feb 12, 2025
1 parent ac2eeb9 commit 24a2eac
Show file tree
Hide file tree
Showing 3 changed files with 222 additions and 1 deletion.
60 changes: 60 additions & 0 deletions .github/workflows/reusable-build-package.yml
Original file line number Diff line number Diff line change
@@ -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
34 changes: 33 additions & 1 deletion .github/workflows/reusable-upgrade-testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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: {}
Expand Down Expand Up @@ -96,11 +101,38 @@ jobs:
--url=http://localhost/ --title="Upgrade Test" --admin_user=admin \
--admin_password=password [email protected] --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
129 changes: 129 additions & 0 deletions .github/workflows/upgrade-develop-testing.yml
Original file line number Diff line number Diff line change
@@ -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}`,
}
});

0 comments on commit 24a2eac

Please sign in to comment.