2023-10-19 18:24:20 +00:00
name : 'CI'
on :
pull_request :
push :
branches :
- 'trunk'
- 'release/*'
2023-04-26 20:41:31 +00:00
concurrency :
2023-10-19 18:24:20 +00:00
group : '${{ github.workflow }}-${{ github.ref }}'
cancel-in-progress : true
2021-03-14 00:29:15 +00:00
jobs :
2023-10-19 18:24:20 +00:00
project-matrix :
# Since this is a monorepo, not every pull request or change is going to impact every project.
# Instead of running CI tasks on all projects indiscriminately, we use a script to detect
# which projects have changed and what kind of change occurred. This lets us build a
# matrix that we can use to run CI tasks only on the projects that need them.
name : 'Build Project Matrix'
runs-on : 'ubuntu-20.04'
outputs :
matrix : ${{ steps.project-matrix.outputs.matrix }}
steps :
- uses : 'actions/checkout@v3'
name : 'Checkout'
with :
fetch-depth : 0
- uses : './.github/actions/setup-woocommerce-monorepo'
name : 'Setup Monorepo'
with :
install : false
- uses : actions/github-script@v6
id : 'project-matrix'
name : 'Build Matrix'
with :
script : |
let baseRef = ${{ toJson( github.base_ref ) }};
if ( baseRef ) {
baseRef = 'origin/' + baseRef;
}
const buildCIMatrix = require( './.github/workflows/scripts/build-ci-matrix' );
core.setOutput( 'matrix', JSON.stringify( await buildCIMatrix( baseRef ) ) );
project-task-matrix :
# This is the actual CI job that will be ran against every project with applicable changes.
# Note that we only run the tasks that have commands set. Our script will set them if
# they are needed and so all the workflow needs to do is run them.
name : '${{ matrix.projectName }} - ${{ matrix.taskName }}' # Note: GitHub doesn't process expressions for skipped jobs so when there's no matrix the name will literally be this.
runs-on : 'ubuntu-20.04'
needs : 'project-matrix'
if : ${{ needs.project-matrix.outputs.matrix != '[]' }}
strategy :
fail-fast : false
matrix :
include : ${{ fromJSON( needs.project-matrix.outputs.matrix ) }}
steps :
- uses : 'actions/checkout@v3'
name : 'Checkout'
with :
fetch-depth : 0
- uses : './.github/actions/setup-woocommerce-monorepo'
id : 'setup-monorepo'
name : 'Setup Monorepo'
with :
# install-filters: '${{ matrix.projectName }}...'
build-filters : '${{ matrix.projectName }}'
- name : 'Lint'
if : ${{ !cancelled() && matrix.lintCommand && steps.setup-monorepo.conclusion == 'success' }}
run : 'pnpm --filter="${{ matrix.projectName }}" ${{ matrix.lintCommand }}'
- name : 'Prepare Test Environment'
id : 'prepare-test-environment'
if : ${{ !cancelled() && matrix.testEnvCommand && steps.setup-monorepo.conclusion == 'success' }}
env : ${{ matrix.testEnvVars }}
run : 'pnpm --filter="${{ matrix.projectName }}" ${{ matrix.testEnvCommand }}'
- name : 'Test - JS'
if : ${{ !cancelled() && matrix.jsTestCommand && steps.setup-monorepo.conclusion == 'success' && ( ! matrix.testEnvCommand || steps.prepare-test-environment.conclusion == 'success' ) }}
run : 'pnpm --filter="${{ matrix.projectName }}" ${{ matrix.jsTestCommand }}'
- name : 'Test - PHP'
if : ${{ !cancelled() && matrix.phpTestCommand && steps.setup-monorepo.conclusion == 'success' && ( ! matrix.testEnvCommand || steps.prepare-test-environment.conclusion == 'success' ) }}
run : 'pnpm --filter="${{ matrix.projectName }}" ${{ matrix.phpTestCommand }}'
project-task-matrix-evaluation :
# In order to add a required status check we need a consistent job that we can grab onto.
# Since we are dynamically generating a project matrix, however, we can't rely on
# on any specific job being present. We can get around this limitation by using
# a job that runs after all the others and either passes or fails based on the
# results of the other jobs in the workflow.
name : 'Evaluate Project Matrix'
runs-on : 'ubuntu-20.04'
needs : 'project-task-matrix'
if : ${{ always() }}
steps :
- name : 'Check Matrix Success'
run : |
result="${{ needs.project-task-matrix.result }}"
if [[ $result == "success" || $result == "skipped" ]]; then
echo "The matrix has completed successfully."
exit 0
else
echo "One or more jobs in the matrix has failed."
exit 1
fi