e2e #919
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: e2e | |
on: | |
push: | |
branches: | |
- develop | |
- release/* | |
pull_request: | |
merge_group: | |
schedule: | |
# run at 6AM UTC Daily | |
# 6AM UTC -> 11PM PT | |
- cron: "0 6 * * *" | |
workflow_dispatch: | |
inputs: | |
default-test: | |
type: boolean | |
required: false | |
default: false | |
upgrade-light-test: | |
type: boolean | |
required: false | |
default: false | |
upgrade-test: | |
type: boolean | |
required: false | |
default: false | |
admin-test: | |
type: boolean | |
required: false | |
default: false | |
upgrade-import-mainnet-test: | |
type: boolean | |
required: false | |
default: false | |
performance-test: | |
type: boolean | |
required: false | |
default: false | |
stateful-data-test: | |
type: boolean | |
required: false | |
default: false | |
tss-migration-test: | |
type: boolean | |
required: false | |
default: false | |
solana-test: | |
type: boolean | |
required: false | |
default: false | |
concurrency: | |
group: e2e-${{ github.head_ref || github.sha }} | |
cancel-in-progress: true | |
jobs: | |
matrix-conditionals: | |
runs-on: ubuntu-22.04 | |
env: | |
GH_TOKEN: ${{ github.token }} | |
outputs: | |
DEFAULT_TESTS: ${{ steps.matrix-conditionals.outputs.DEFAULT_TESTS }} | |
UPGRADE_TESTS: ${{ steps.matrix-conditionals.outputs.UPGRADE_TESTS }} | |
UPGRADE_LIGHT_TESTS: ${{ steps.matrix-conditionals.outputs.UPGRADE_LIGHT_TESTS }} | |
UPGRADE_IMPORT_MAINNET_TESTS: ${{ steps.matrix-conditionals.outputs.UPGRADE_IMPORT_MAINNET_TESTS }} | |
ADMIN_TESTS: ${{ steps.matrix-conditionals.outputs.ADMIN_TESTS }} | |
PERFORMANCE_TESTS: ${{ steps.matrix-conditionals.outputs.PERFORMANCE_TESTS }} | |
STATEFUL_DATA_TESTS: ${{ steps.matrix-conditionals.outputs.STATEFUL_DATA_TESTS }} | |
TSS_MIGRATION_TESTS: ${{ steps.matrix-conditionals.outputs.TSS_MIGRATION_TESTS }} | |
SOLANA_TESTS: ${{ steps.matrix-conditionals.outputs.SOLANA_TESTS }} | |
steps: | |
# use api rather than event context to avoid race conditions (label added after push) | |
- id: matrix-conditionals | |
uses: actions/github-script@v7 | |
with: | |
script: | | |
if (context.eventName === 'pull_request') { | |
const { data: pr } = await github.rest.pulls.get({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
pull_number: context.payload.pull_request.number, | |
}); | |
const labels = pr.labels.map(label => label.name); | |
console.log("labels:", labels); | |
core.setOutput('DEFAULT_TESTS', true); | |
core.setOutput('UPGRADE_TESTS', labels.includes('UPGRADE_TESTS')); | |
core.setOutput('UPGRADE_LIGHT_TESTS', labels.includes('UPGRADE_LIGHT_TESTS')); | |
core.setOutput('UPGRADE_IMPORT_MAINNET_TESTS', labels.includes('UPGRADE_IMPORT_MAINNET_TESTS')); | |
core.setOutput('ADMIN_TESTS', labels.includes('ADMIN_TESTS')); | |
core.setOutput('PERFORMANCE_TESTS', labels.includes('PERFORMANCE_TESTS')); | |
core.setOutput('STATEFUL_DATA_TESTS', labels.includes('STATEFUL_DATA_TESTS')); | |
core.setOutput('TSS_MIGRATION_TESTS', labels.includes('TSS_MIGRATION_TESTS')); | |
core.setOutput('SOLANA_TESTS', labels.includes('SOLANA_TESTS')); | |
} else if (context.eventName === 'merge_group') { | |
core.setOutput('DEFAULT_TESTS', true); | |
core.setOutput('UPGRADE_LIGHT_TESTS', true); | |
} else if (context.eventName === 'push' && context.ref === 'refs/heads/develop') { | |
core.setOutput('DEFAULT_TESTS', true); | |
} else if (context.eventName === 'push' && context.ref.startsWith('refs/heads/release/')) { | |
core.setOutput('DEFAULT_TESTS', true); | |
core.setOutput('UPGRADE_TESTS', true); | |
core.setOutput('UPGRADE_LIGHT_TESTS', true); | |
core.setOutput('UPGRADE_IMPORT_MAINNET_TESTS', true); | |
core.setOutput('ADMIN_TESTS', true); | |
core.setOutput('PERFORMANCE_TESTS', true); | |
core.setOutput('STATEFUL_DATA_TESTS', true); | |
} else if (context.eventName === 'schedule') { | |
core.setOutput('DEFAULT_TESTS', true); | |
core.setOutput('UPGRADE_TESTS', true); | |
core.setOutput('UPGRADE_LIGHT_TESTS', true); | |
core.setOutput('UPGRADE_IMPORT_MAINNET_TESTS', true); | |
core.setOutput('ADMIN_TESTS', true); | |
core.setOutput('PERFORMANCE_TESTS', true); | |
core.setOutput('STATEFUL_DATA_TESTS', true); | |
core.setOutput('TSS_MIGRATION_TESTS', true); | |
core.setOutput('SOLANA_TESTS', true); | |
} else if (context.eventName === 'workflow_dispatch') { | |
core.setOutput('DEFAULT_TESTS', context.payload.inputs['default-test']); | |
core.setOutput('UPGRADE_TESTS', context.payload.inputs['upgrade-test']); | |
core.setOutput('UPGRADE_LIGHT_TESTS', context.payload.inputs['upgrade-light-test']); | |
core.setOutput('UPGRADE_IMPORT_MAINNET_TESTS', context.payload.inputs['upgrade-import-mainnet-test']); | |
core.setOutput('ADMIN_TESTS', context.payload.inputs['admin-test']); | |
core.setOutput('PERFORMANCE_TESTS', context.payload.inputs['performance-test']); | |
core.setOutput('STATEFUL_DATA_TESTS', context.payload.inputs['stateful-data-test']); | |
core.setOutput('TSS_MIGRATION_TESTS', context.payload.inputs['tss-migration-test']); | |
core.setOutput('SOLANA_TESTS', context.payload.inputs['solana-test']); | |
} | |
e2e: | |
needs: matrix-conditionals | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- make-target: "start-e2e-test" | |
runs-on: ubuntu-20.04 | |
run: ${{ needs.matrix-conditionals.outputs.DEFAULT_TESTS == 'true' }} | |
- make-target: "start-upgrade-test" | |
runs-on: ubuntu-20.04 | |
run: ${{ needs.matrix-conditionals.outputs.UPGRADE_TESTS == 'true' }} | |
- make-target: "start-upgrade-test-light" | |
runs-on: ubuntu-20.04 | |
run: ${{ needs.matrix-conditionals.outputs.UPGRADE_LIGHT_TESTS == 'true' }} | |
- make-target: "start-upgrade-import-mainnet-test" | |
runs-on: buildjet-16vcpu-ubuntu-2204 | |
run: ${{ needs.matrix-conditionals.outputs.UPGRADE_IMPORT_MAINNET_TESTS == 'true' }} | |
timeout-minutes: 40 | |
- make-target: "start-e2e-admin-test" | |
runs-on: ubuntu-20.04 | |
run: ${{ needs.matrix-conditionals.outputs.ADMIN_TESTS == 'true' }} | |
- make-target: "start-e2e-performance-test" | |
runs-on: buildjet-4vcpu-ubuntu-2204 | |
run: ${{ needs.matrix-conditionals.outputs.PERFORMANCE_TESTS == 'true' }} | |
- make-target: "start-e2e-import-mainnet-test" | |
runs-on: buildjet-16vcpu-ubuntu-2204 | |
run: ${{ needs.matrix-conditionals.outputs.STATEFUL_DATA_TESTS == 'true' }} | |
timeout-minutes: 40 | |
- make-target: "start-tss-migration-test" | |
runs-on: ubuntu-20.04 | |
run: ${{ needs.matrix-conditionals.outputs.TSS_MIGRATION_TESTS == 'true' }} | |
- make-target: "start-solana-test" | |
runs-on: ubuntu-20.04 | |
run: ${{ needs.matrix-conditionals.outputs.SOLANA_TESTS == 'true' }} | |
name: ${{ matrix.make-target }} | |
uses: ./.github/workflows/reusable-e2e.yml | |
with: | |
make-target: ${{ matrix.make-target }} | |
runs-on: ${{ matrix.runs-on}} | |
run: ${{ matrix.run }} | |
timeout-minutes: "${{ matrix.timeout-minutes || 25 }}" | |
secrets: inherit | |
# this allows you to set a required status check | |
e2e-ok: | |
runs-on: ubuntu-22.04 | |
needs: | |
- matrix-conditionals | |
- e2e | |
if: always() | |
steps: | |
- name: Send slack message with results | |
uses: actions/github-script@v7 | |
if: ${{ github.event_name == 'schedule' || (github.event_name == 'push' && needs.e2e.result == 'failure') }} | |
env: | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_CI_ALERTS }} | |
with: | |
script: | | |
const {data} = await github.rest.actions.listJobsForWorkflowRunAttempt({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
run_id: context.runId, | |
attempt_number: ${{ github.run_attempt }}, | |
}); | |
const e2eJobs = data.jobs.filter(job => job.name.includes('/') && job.conclusion != 'skipped'); | |
const e2eResults = e2eJobs.map(job => { | |
const icon = job.conclusion === 'success' ? ':white_check_mark:' : ':x:'; | |
const cleanName = job.name.split("/")[0]; | |
return `${icon} ${cleanName}`; | |
}); | |
e2eResults.sort(); | |
const overallResultStr = '${{ needs.e2e.result }}'; | |
const overallResultPassing = overallResultStr === 'success' || overallResultStr === 'skipped'; | |
const overallResultIcon = overallResultPassing ? ':white_check_mark:' : ':x:'; | |
let overallResultText = `<https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}|E2E Test Run Results>`; | |
if (context.eventName === 'push') { | |
overallResultText += ` for push to ${context.ref}`; | |
} else if (context.eventName === 'schedule') { | |
overallResultText += ` for scheduled run`; | |
} | |
const msg = `${overallResultIcon} ${overallResultText}\n${e2eResults.join('\n')}`; | |
await fetch(process.env.SLACK_WEBHOOK_URL, { | |
method: 'POST', | |
headers: { | |
'Content-Type': 'application/json', | |
}, | |
body: JSON.stringify({text: msg}), | |
}); | |
- run: | | |
result="${{ needs.e2e.result }}" | |
if [[ $result == "success" || $result == "skipped" ]]; then | |
exit 0 | |
else | |
exit 1 | |
fi |