Store WordPress "build" directory as an artifact to enable live previews with Playground #7153
Workflow file for this run
This file contains 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: Performance Tests | |
on: | |
push: | |
branches: | |
- trunk | |
- '6.[2-9]' | |
- '[7-9].[0-9]' | |
tags: | |
- '[0-9]+.[0-9]' | |
- '[0-9]+.[0-9].[0-9]+' | |
- '![45].[0-9].[0-9]+' | |
- '!6.[01].[0-9]+' | |
pull_request: | |
branches: | |
- trunk | |
- '6.[2-9]' | |
- '[7-9].[0-9]' | |
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: {} | |
env: | |
# Performance testing should be performed in an environment reflecting a standard production environment. | |
LOCAL_WP_DEBUG: false | |
LOCAL_SCRIPT_DEBUG: false | |
LOCAL_SAVEQUERIES: false | |
LOCAL_WP_DEVELOPMENT_MODE: "''" | |
# This workflow takes two sets of measurements — one for the current commit, | |
# and another against a consistent version that is used as a baseline measurement. | |
# This is done to isolate variance in measurements caused by the GitHub runners | |
# from differences caused by code changes between commits. The BASE_TAG value here | |
# represents the version being used for baseline measurements. It should only be | |
# changed if we want to normalize results against a different baseline. | |
BASE_TAG: '6.1.1' | |
LOCAL_DIR: build | |
TARGET_REF: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.ref || '' }} | |
TARGET_SHA: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} | |
jobs: | |
# Runs the performance test suite. | |
# | |
# Performs the following steps: | |
# - Configure environment variables. | |
# - Checkout repository. | |
# - Set up Node.js. | |
# - Log debug information. | |
# - Install npm dependencies. | |
# - Install Playwright browsers. | |
# - Build WordPress. | |
# - Start Docker environment. | |
# - Log running Docker containers. | |
# - Docker debug information. | |
# - Install WordPress. | |
# - Install WordPress Importer plugin. | |
# - Import mock data. | |
# - Update permalink structure. | |
# - Install MU plugin. | |
# - Run performance tests (current commit). | |
# - Print performance tests results. | |
# - Check out target commit (target branch or previous commit). | |
# - Install npm dependencies. | |
# - Build WordPress. | |
# - Run performance tests (previous/target commit). | |
# - Print target performance tests results. | |
# - Reset to original commit. | |
# - Install npm dependencies. | |
# - Set the environment to the baseline version. | |
# - Run baseline performance tests. | |
# - Print baseline performance tests results. | |
# - Compare results with base. | |
# - Add workflow summary. | |
# - Set the base sha. | |
# - Set commit details. | |
# - Publish performance results. | |
# - Ensure version-controlled files are not modified or deleted. | |
# - Dispatch workflow run. | |
performance: | |
name: Run performance tests | |
runs-on: ubuntu-latest | |
permissions: | |
contents: read | |
if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} | |
steps: | |
- name: Configure environment variables | |
run: | | |
echo "PHP_FPM_UID=$(id -u)" >> $GITHUB_ENV | |
echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV | |
- name: Checkout repository | |
uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 | |
with: | |
show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} | |
- name: Set up Node.js | |
uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 | |
with: | |
node-version-file: '.nvmrc' | |
cache: npm | |
- name: Log debug information | |
run: | | |
npm --version | |
node --version | |
curl --version | |
git --version | |
svn --version | |
locale -a | |
- name: Install npm dependencies | |
run: npm ci | |
- name: Install Playwright browsers | |
run: npx playwright install --with-deps | |
- name: Build WordPress | |
run: npm run build | |
- name: Start Docker environment | |
run: | | |
npm run env:start | |
- name: Log running Docker containers | |
run: docker ps -a | |
- name: Docker debug information | |
run: | | |
docker -v | |
docker-compose -v | |
docker-compose run --rm mysql mysql --version | |
docker-compose run --rm php php --version | |
docker-compose run --rm php php -m | |
docker-compose run --rm php php -i | |
docker-compose run --rm php locale -a | |
- name: Install WordPress | |
run: npm run env:install | |
- name: Install WordPress Importer plugin | |
run: npm run env:cli -- plugin install wordpress-importer --activate --path=/var/www/${{ env.LOCAL_DIR }} | |
- name: Import mock data | |
run: | | |
curl -O https://raw.githubusercontent.com/WordPress/theme-test-data/b9752e0533a5acbb876951a8cbb5bcc69a56474c/themeunittestdata.wordpress.xml | |
npm run env:cli -- import themeunittestdata.wordpress.xml --authors=create --path=/var/www/${{ env.LOCAL_DIR }} | |
rm themeunittestdata.wordpress.xml | |
- name: Update permalink structure | |
run: | | |
npm run env:cli -- rewrite structure '/%year%/%monthnum%/%postname%/' --path=/var/www/${{ env.LOCAL_DIR }} | |
- name: Install MU plugin | |
run: | | |
mkdir ./${{ env.LOCAL_DIR }}/wp-content/mu-plugins | |
cp ./tests/performance/wp-content/mu-plugins/server-timing.php ./${{ env.LOCAL_DIR }}/wp-content/mu-plugins/server-timing.php | |
- name: Run performance tests (current commit) | |
run: npm run test:performance | |
- name: Print performance tests results | |
run: node ./tests/performance/results.js | |
- name: Check out target commit (target branch or previous commit) | |
run: | | |
if [[ -z "$TARGET_REF" ]]; then | |
git fetch -n origin $TARGET_SHA | |
else | |
git fetch -n origin $TARGET_REF | |
fi | |
git reset --hard $TARGET_SHA | |
- name: Install npm dependencies | |
run: npm ci | |
- name: Build WordPress | |
run: npm run build | |
- name: Run target performance tests (base/previous commit) | |
env: | |
TEST_RESULTS_PREFIX: before | |
run: npm run test:performance | |
- name: Print target performance tests results | |
env: | |
TEST_RESULTS_PREFIX: before | |
run: node ./tests/performance/results.js | |
- name: Reset to original commit | |
run: git reset --hard $GITHUB_SHA | |
- name: Install npm dependencies | |
run: npm ci | |
- name: Set the environment to the baseline version | |
run: | | |
npm run env:cli -- core update --version=${{ env.BASE_TAG }} --force --path=/var/www/${{ env.LOCAL_DIR }} | |
npm run env:cli -- core version --path=/var/www/${{ env.LOCAL_DIR }} | |
- name: Run baseline performance tests | |
env: | |
TEST_RESULTS_PREFIX: base | |
run: npm run test:performance | |
- name: Print baseline performance tests results | |
env: | |
TEST_RESULTS_PREFIX: base | |
run: node ./tests/performance/results.js | |
- name: Compare results with base | |
run: node ./tests/performance/compare-results.js ${{ runner.temp }}/summary.md | |
- name: Add workflow summary | |
run: cat ${{ runner.temp }}/summary.md >> $GITHUB_STEP_SUMMARY | |
- name: Set the base sha | |
# Only needed when publishing results. | |
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' }} | |
uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 | |
id: base-sha | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
script: | | |
const baseRef = await github.rest.git.getRef({ owner: context.repo.owner, repo: context.repo.repo, ref: 'tags/${{ env.BASE_TAG }}' }); | |
return baseRef.data.object.sha; | |
- name: Set commit details | |
# Only needed when publishing results. | |
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' }} | |
uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 | |
id: commit-timestamp | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
script: | | |
const commit_details = await github.rest.git.getCommit({ owner: context.repo.owner, repo: context.repo.repo, commit_sha: context.sha }); | |
return parseInt((new Date( commit_details.data.author.date ).getTime() / 1000).toFixed(0)) | |
- name: Publish performance results | |
# Only publish results on pushes to trunk. | |
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' }} | |
env: | |
BASE_SHA: ${{ steps.base-sha.outputs.result }} | |
COMMITTED_AT: ${{ steps.commit-timestamp.outputs.result }} | |
CODEVITALS_PROJECT_TOKEN: ${{ secrets.CODEVITALS_PROJECT_TOKEN }} | |
HOST_NAME: "www.codevitals.run" | |
run: node ./tests/performance/log-results.js $CODEVITALS_PROJECT_TOKEN trunk $GITHUB_SHA $BASE_SHA $COMMITTED_AT $HOST_NAME | |
- name: Ensure version-controlled files are not modified or deleted | |
run: git diff --exit-code | |
slack-notifications: | |
name: Slack Notifications | |
uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk | |
permissions: | |
actions: read | |
contents: read | |
needs: [ performance ] | |
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-latest | |
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@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.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: '${{ github.run_id }}' | |
} | |
}); |