I'd like to implement a conditional E2E test that needs to pass before a release is executed in production.
Currently our workflow is as follows:
Between steps 4 and 5, I'd like a quality gate established where if 4 fails, the user cannot run 5.
How can I achieve this?
Heres the current pipeline with a few remitted lines of cicd.
name: CI
on:
pull_request:
types:
- opened
- reopened
- synchronize
push:
branches:
- master
permissions:
checks: write
pull-requests: write
contents: write
actions: write
env:
NODE_AUTH_TOKEN: ${{secrets.remitted}}
defaults:
run:
working-directory: ./vendor
jobs:
install:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: remitted@master
build:
needs: [install]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: remitted/pnpm@master
- name: Build and then install necessary packages
run: npm run build:uikit:production
- name: Build webpack
run: NODE_ENV=development npm run build:webpack
unit_test:
needs: [install]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Create env file
run: |
- uses: remitted/pnpm@master
- name: Test Unit
run: npm run test:ci:coverage
lint:
if: ${{ github.actor != 'dependabot[bot]' }}
runs-on: ubuntu-latest
needs: [install]
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: remitted/pnpm@master
- name: Lint
run: npm run lint
deploy_ecs:
runs-on: ubuntu-latest
if: ${{ github.ref == 'refs/heads/master' }}
needs: [build, unit_test, lint]
env:
GH_TOKEN: ${{ github.token }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Trigger Deploy ECS
run: gh workflow run deploy_ecs.yml --ref master
Inside deploy_ecs.yml, the deployment occurs, and the E2E is triggered like so:
trigger_e2e:
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ github.token }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Trigger E2E
run: gh workflow run cypress.yml --ref master
Below is the workflow that allows a user to manually release.
name: Release ECS
on:
workflow_dispatch:
jobs:
To still allow manual triggering of the workflow but also automatically run your Release ECS
workflow against master
when the trigger_e2e
workflow has been reported successful, you could use a solution like this:
name: Release ECS
on:
workflow_dispatch:
workflow_run:
workflows:
- trigger_e2e
types:
- completed
branches:
- master
jobs:
deploy-to-prod:
# only runs when triggered manually OR when all of the previus workflows from `workflow_run` were successful
if: ${{ github.event_name == 'workflow_dispatch' || ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
#...
The above code assumes that you want to automically do a release when someone is running the cypress e2e test through the trigger_e2e
.
If you want to always enforce the e2e tests to run, or all the other workflows, you should be able to remove the check for github.event_name == 'workflow_dispatch'
.
There is another way to read your question. At least from the question in the title, it sounds like you want to ensure the e2e tests run successfully when someone triggers the Release workflow manually. In this case, you could try something like this:
name: Release ECS
on:
workflow_dispatch:
jobs:
trigger-e2e:
steps:
- name: Trigger E2E
- uses: ./.github/workflows/deploy_ecs.yml
deploy-to-prod:
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
#...
Relevant docs:
Please let me know if this helps :)