2022-06-07 16:03:25 +08:00
# Triggers after the layered build has finished, taking the artifact and running cypress on it
name : Cypress End to End Tests
on :
2022-12-12 19:24:14 +08:00
workflow_run :
workflows : [ "Element Web - Build" ]
types :
- completed
2022-06-07 16:03:25 +08:00
jobs :
2022-12-12 19:24:14 +08:00
prepare :
name : Prepare
if : github.event.workflow_run.conclusion == 'success'
runs-on : ubuntu-latest
permissions :
actions : read
issues : read
statuses : write
pull-requests : read
outputs :
uuid : ${{ steps.uuid.outputs.value }}
pr_id : ${{ steps.prdetails.outputs.pr_id }}
commit_message : ${{ steps.commit.outputs.message }}
commit_author : ${{ steps.commit.outputs.author }}
commit_email : ${{ steps.commit.outputs.email }}
percy_enable : ${{ steps.percy.outputs.value || '1' }}
2022-12-15 20:04:03 +08:00
testrail_enable : ${{ steps.testrail.outputs.value || '1' }}
2022-12-12 19:24:14 +08:00
steps :
# We create the status here and then update it to success/failure in the `report` stage
# This provides an easy link to this workflow_run from the PR before Cypress is done.
- uses : Sibz/github-status-action@v1
with :
authToken : ${{ secrets.GITHUB_TOKEN }}
state : pending
context : ${{ github.workflow }} / cypress (${{ github.event.workflow_run.event }} => ${{ github.event_name }})
sha : ${{ github.event.workflow_run.head_sha }}
target_url : https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
2022-09-09 07:05:05 +08:00
2022-12-12 19:24:14 +08:00
- id : prdetails
if : github.event.workflow_run.event == 'pull_request'
uses : matrix-org/pr-details-action@v1.2
with :
owner : ${{ github.event.workflow_run.head_repository.owner.login }}
branch : ${{ github.event.workflow_run.head_branch }}
2022-06-07 16:03:25 +08:00
2022-12-12 19:24:14 +08:00
- name : Get commit details
id : commit
if : github.event.workflow_run.event == 'pull_request'
uses : actions/github-script@v6
with :
script : |
const response = await github.rest.git.getCommit({
owner : context.repo.owner,
repo : context.repo.repo,
commit_sha : "${{ github.event.workflow_run.head_sha }}" ,
});
core.setOutput("message", response.data.message);
core.setOutput("author", response.data.author.name);
core.setOutput("email", response.data.author.email);
2022-09-07 19:48:37 +08:00
2022-12-12 19:24:14 +08:00
# Only run Percy when it is demanded or on develop
- name : Disable Percy if not needed
id : percy
if : |
github.event.workflow_run.event == 'pull_request' &&
!contains(fromJSON(steps.prdetails.outputs.data).labels.*.name, 'X-Needs-Percy')
run : echo "::set-output name=value::0"
2022-09-07 19:48:37 +08:00
2022-12-15 20:04:03 +08:00
# Only run Testrail when it is demanded or on develop
- name : Disable Testrail if not needed
id : testrail
if : |
github.event.workflow_run.event == 'pull_request' &&
!contains(fromJSON(steps.prdetails.outputs.data).labels.*.name, 'X-Send-Testrail')
run : echo "::set-output name=value::0"
2022-12-12 19:24:14 +08:00
- name : Generate unique ID 💎
id : uuid
run : echo "::set-output name=value::sha-$GITHUB_SHA-time-$(date +"%s")"
2022-09-07 19:48:37 +08:00
2022-12-12 19:24:14 +08:00
tests :
name : "Run Tests"
needs : prepare
runs-on : ubuntu-latest
permissions :
actions : read
issues : read
pull-requests : read
2023-01-12 23:16:05 +08:00
environment : Cypress
strategy :
fail-fast : false
matrix :
# Run 4 instances in Parallel
runner : [ 1 , 2 , 3 , 4 ]
2022-12-12 19:24:14 +08:00
steps :
2023-01-12 23:16:05 +08:00
- uses : browser-actions/setup-chrome@latest
- run : echo "BROWSER_PATH=$(which chrome)" >> $GITHUB_ENV
2023-01-06 12:11:41 +08:00
- uses : tecolicom/actions-use-apt-tools@v1
with :
# Our test suite includes some screenshot tests with unusual diacritics, which are
# supposed to be covered by STIXGeneral.
tools : fonts-stix
2022-12-12 19:24:14 +08:00
- uses : actions/checkout@v3
with :
# XXX: We're checking out untrusted code in a secure context
# We need to be careful to not trust anything this code outputs/may do
# We need to check this out to access the cypress tests which are on the head branch
repository : ${{ github.event.workflow_run.head_repository.full_name }}
ref : ${{ github.event.workflow_run.head_sha }}
persist-credentials : false
2022-06-07 16:03:25 +08:00
2022-12-12 19:24:14 +08:00
# There's a 'download artifact' action, but it hasn't been updated for the workflow_run action
# (https://github.com/actions/download-artifact/issues/60) so instead we get this mess:
- name : 📥 Download artifact
uses : dawidd6/action-download-artifact@v2
with :
run_id : ${{ github.event.workflow_run.id }}
name : previewbuild
path : webapp
2022-06-07 16:03:25 +08:00
2022-12-12 19:24:14 +08:00
- name : Run Cypress tests
2022-12-20 13:06:34 +08:00
uses : cypress-io/github-action@v5.0.2
2022-12-12 19:24:14 +08:00
with :
# The built-in Electron runner seems to grind to a halt trying
# to run the tests, so use chrome.
2023-01-12 23:16:05 +08:00
browser : "${{ env.BROWSER_PATH }}"
2022-12-12 19:24:14 +08:00
start : npx serve -p 8080 webapp
wait-on : "http://localhost:8080"
2023-01-12 23:16:05 +08:00
record : true
parallel : true
command-prefix : "yarn percy exec --parallel --"
2022-12-15 20:04:03 +08:00
config : '{"reporter":"cypress-multi-reporters", "reporterOptions": { "configFile": "cypress-ci-reporter-config.json" } }'
2022-12-12 19:24:14 +08:00
ci-build-id : ${{ needs.prepare.outputs.uuid }}
env :
# pass the Dashboard record key as an environment variable
CYPRESS_RECORD_KEY : ${{ secrets.CYPRESS_RECORD_KEY }}
2022-09-07 19:48:37 +08:00
2022-12-12 19:24:14 +08:00
# Use existing chromium rather than downloading another
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD : true
2022-09-07 19:48:37 +08:00
2022-12-12 19:24:14 +08:00
# pass GitHub token to allow accurately detecting a build vs a re-run build
GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
2022-09-07 19:48:37 +08:00
2022-12-12 19:24:14 +08:00
# make Node's os.tmpdir() return something where we actually have permissions
TMPDIR : ${{ runner.temp }}
2022-09-07 19:48:37 +08:00
2022-12-12 19:24:14 +08:00
# tell Cypress more details about the context of this run
COMMIT_INFO_BRANCH : ${{ github.event.workflow_run.head_branch }}
COMMIT_INFO_SHA : ${{ github.event.workflow_run.head_sha }}
COMMIT_INFO_REMOTE : ${{ github.repositoryUrl }}
COMMIT_INFO_MESSAGE : ${{ needs.prepare.outputs.commit_message }}
COMMIT_INFO_AUTHOR : ${{ needs.prepare.outputs.commit_author }}
COMMIT_INFO_EMAIL : ${{ needs.prepare.outputs.commit_email }}
2023-01-13 18:35:45 +08:00
CYPRESS_PULL_REQUEST_ID : ${{ needs.prepare.outputs.pr_id }}
CYPRESS_PULL_REQUEST_URL : https://github.com/${{ github.repository }}/pull/${{ needs.prepare.outputs.pr_id }}
2022-06-07 16:03:25 +08:00
2022-12-12 19:24:14 +08:00
# pass the Percy token as an environment variable
PERCY_TOKEN : ${{ secrets.PERCY_TOKEN }}
PERCY_ENABLE : ${{ needs.prepare.outputs.percy_enable }}
PERCY_BROWSER_EXECUTABLE : /usr/bin/chromium-browser
# tell Percy more details about the context of this run
PERCY_BRANCH : ${{ github.event.workflow_run.head_branch }}
PERCY_COMMIT : ${{ github.event.workflow_run.head_sha }}
2023-01-12 23:16:05 +08:00
PERCY_PULL_REQUEST : ${{ needs.prepare.outputs.pr_id }}
PERCY_PARALLEL_TOTAL : ${{ strategy.job-total }}
2022-12-12 19:24:14 +08:00
PERCY_PARALLEL_NONCE : ${{ needs.prepare.outputs.uuid }}
2022-06-07 16:03:25 +08:00
2022-12-12 19:24:14 +08:00
- name : Upload Artifact
if : failure()
uses : actions/upload-artifact@v3
with :
name : cypress-results
path : |
cypress/screenshots
cypress/videos
cypress/synapselogs
2022-06-07 16:03:25 +08:00
2022-12-15 20:04:03 +08:00
- name : Upload reports
if : always()
uses : actions/upload-artifact@v2
with :
name : cypress-junit
path : cypress/results
2022-12-12 19:24:14 +08:00
report :
name : Report results
needs : tests
runs-on : ubuntu-latest
if : always()
permissions :
statuses : write
steps :
- uses : Sibz/github-status-action@v1
with :
authToken : ${{ secrets.GITHUB_TOKEN }}
state : ${{ needs.tests.result == 'success' && 'success' || 'failure' }}
context : ${{ github.workflow }} / cypress (${{ github.event.workflow_run.event }} => ${{ github.event_name }})
sha : ${{ github.event.workflow_run.head_sha }}
target_url : https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
2022-12-15 20:04:03 +08:00
testrail :
name : Report results to testrail
needs :
- prepare
- tests
environment : Testrail
runs-on : ubuntu-latest
if : ${{ needs.prepare.outputs.testrail_enable }}
steps :
- uses : actions/download-artifact@v3
with :
name : cypress-junit
- name : Prepare testrail upload config
id : testrailprep
env :
TESTRAIL_PROJECT_ID : ${{ secrets.TESTRAIL_PROJECT_ID }}
TESTRAIL_SUITE_ID : ${{ secrets.TESTRAIL_SUITE_ID }}
TEST_ID : ${{ github.run_id }}
TESTRAIL_URL : https://elementqa.testrail.io
TESTRAIL_USER : ${{ secrets.TESTRAIL_USER }}
TESTRAIL_API_KEY : ${{ secrets.TESTRAIL_API_KEY }}
run : |
echo '{"name": "element-web cypress '$TEST_ID'", "suite_id": '$TESTRAIL_SUITE_ID' }' > body.json # TODO add description with more context?
RUN_ID=`curl -X POST -d @body.json -u "$TESTRAIL_USER:$TESTRAIL_API_KEY" -H "Content-Type: application/json" "$TESTRAIL_URL/index.php?/api/v2/add_run/$TESTRAIL_PROJECT_ID" | jq '.id'`
PROJECT_NAME=`curl -X GET -u "$TESTRAIL_USER:$TESTRAIL_API_KEY" -H "Content-Type: application/json" "$TESTRAIL_URL/index.php?/api/v2/get_project/$TESTRAIL_PROJECT_ID" | jq '.name'`
echo "run_id=$RUN_ID" >> $GITHUB_OUTPUT
echo "project_name=$PROJECT_NAME" >> $GITHUB_OUTPUT
- name : setup python
uses : actions/setup-python@v4
with :
python-version : "3.11"
- run : pip install trcli
- name : Upload junit files
env :
TESTRAIL_PROJECT_ID : ${{ secrets.TESTRAIL_PROJECT_ID }}
TESTRAIL_SUITE_ID : ${{ secrets.TESTRAIL_SUITE_ID }}
TESTRAIL_URL : https://elementqa.testrail.io
TESTRAIL_USER : ${{ secrets.TESTRAIL_USER }}
TESTRAIL_API_KEY : ${{ secrets.TESTRAIL_API_KEY }}
TESTRAIL_RUN_ID : ${{ steps.testrailprep.outputs.run_id }}
run : |
2023-01-05 19:27:03 +08:00
for file in results-*.xml; do
2022-12-15 20:04:03 +08:00
echo "Handling $file"
trcli -y -h $TESTRAIL_URL \
--project-id $TESTRAIL_PROJECT_ID \
--project ${{ steps.testrailprep.outputs.project_name }} \
--username $TESTRAIL_USER \
--password $TESTRAIL_API_KEY \
parse_junit \
--run-id $TESTRAIL_RUN_ID \
--suite-id $TESTRAIL_SUITE_ID \
--title "if you see this please check cypress build for run id not being provisioned" \
2023-01-05 19:22:47 +08:00
-f $file || true
# We want to keep uploading what we can; but don't want the failures/red marks when it fails, so we add || true above.
2023-01-05 19:53:53 +08:00
done
2022-12-15 20:04:03 +08:00
- name : Close test run
id : testrailpost
if : always()
env :
TESTRAIL_URL : https://elementqa.testrail.io
TESTRAIL_USER : ${{ secrets.TESTRAIL_USER }}
TESTRAIL_API_KEY : ${{ secrets.TESTRAIL_API_KEY }}
TESTRAIL_RUN_ID : ${{ steps.testrailprep.outputs.run_id }}
run : |
CLOSE_RESPONSE=`curl -X POST -d '{}' -u "$TESTRAIL_USER:$TESTRAIL_API_KEY" -H "Content-Type: application/json" "$TESTRAIL_URL/index.php?/api/v2/close_run/$TESTRAIL_RUN_ID"`
if [ ! "0" == "`echo $CLOSE_RESPONSE | jq .untested_count`" ] ; then echo "::warning title=Missing Tests::Testrail reported some cypress tests were not run. $CLOSE_RESPONSE"; fi