-
Notifications
You must be signed in to change notification settings - Fork 428
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore: setup workflow for E2E tests that
@sanity/ui
can run on its …
…PRs (#7156)
- Loading branch information
Showing
5 changed files
with
405 additions
and
2 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,390 @@ | ||
name: End-to-End Tests with upcoming @sanity/ui changes | ||
permissions: | ||
contents: read # for checkout | ||
on: | ||
# Can only be called remotely | ||
workflow_call: | ||
secrets: | ||
TURBO_TOKEN: | ||
SANITY_E2E_SESSION_TOKEN_NEW: | ||
required: true | ||
SANITY_E2E_PROJECT_ID: | ||
required: true | ||
|
||
jobs: | ||
prepare: | ||
runs-on: ubuntu-latest | ||
env: | ||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} | ||
TURBO_TEAM: ${{ vars.TURBO_TEAM }} | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- uses: pnpm/action-setup@v4 | ||
- uses: actions/setup-node@v4 | ||
with: | ||
node-version: lts/* | ||
- run: pnpm install | ||
- name: Patch increment version in package.json | ||
id: npm-version | ||
shell: bash | ||
run: | | ||
echo "NPM_VERSION=$(npm version --no-git-commit-hooks --no-git-tag-version patch)" >> $GITHUB_OUTPUT | ||
- name: Namespace version with build run id | ||
run: npm version --no-git-commit-hooks --no-git-tag-version "${{ steps.npm-version.outputs.NPM_VERSION }}-gh.${{ github.run_id }}" | ||
- run: pnpm pack --pack-destination ./artifacts | ||
- uses: actions/upload-artifact@v4 | ||
with: | ||
name: pack-sanity-ui | ||
path: artifacts | ||
if-no-files-found: error | ||
overwrite: true | ||
|
||
cache-cli: | ||
needs: [prepare] | ||
timeout-minutes: 30 | ||
runs-on: ubuntu-latest | ||
env: | ||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} | ||
TURBO_TEAM: ${{ vars.TURBO_TEAM }} | ||
|
||
steps: | ||
- uses: actions/checkout@v4 | ||
with: | ||
repository: sanity-io/sanity | ||
- uses: actions/setup-node@v4 | ||
with: | ||
node-version: 18 | ||
|
||
- uses: pnpm/action-setup@v4 | ||
name: Install pnpm | ||
id: pnpm-install | ||
with: | ||
run_install: false | ||
|
||
- uses: actions/download-artifact@v4 | ||
with: | ||
name: pack-sanity-ui | ||
path: artifacts | ||
- name: Install project dependencies | ||
run: pnpm install | ||
- run: pnpm add -w ./artifacts/sanity-ui-*.tgz | ||
|
||
- name: Build CLI | ||
run: pnpm build:cli --output-logs=full --log-order=grouped | ||
|
||
install: | ||
needs: [prepare, cache-cli] | ||
timeout-minutes: 30 | ||
runs-on: ubuntu-latest | ||
env: | ||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} | ||
TURBO_TEAM: ${{ vars.TURBO_TEAM }} | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
# Be sure to update all instances in this file and `pr-cleanup.yml` if updated | ||
project: [chromium, firefox] | ||
steps: | ||
- uses: actions/checkout@v4 | ||
with: | ||
repository: sanity-io/sanity | ||
- uses: actions/setup-node@v4 | ||
with: | ||
node-version: 18 | ||
|
||
- uses: pnpm/action-setup@v4 | ||
name: Install pnpm | ||
id: pnpm-install | ||
with: | ||
run_install: false | ||
|
||
- name: Get pnpm store directory | ||
id: pnpm-cache | ||
shell: bash | ||
run: | | ||
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT | ||
- name: Cache node modules | ||
id: cache-node-modules | ||
uses: actions/cache@v4 | ||
env: | ||
cache-name: cache-node-modules | ||
with: | ||
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} | ||
key: ${{ runner.os }}-pnpm-store-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }} | ||
restore-keys: | | ||
v1-${{ runner.os }}-pnpm-store-${{ env.cache-name }}- | ||
v1-${{ runner.os }}-pnpm-store- | ||
v1-${{ runner.os }}- | ||
- uses: actions/download-artifact@v4 | ||
with: | ||
name: pack-sanity-ui | ||
path: artifacts | ||
- name: Install project dependencies | ||
run: pnpm install | ||
- run: pnpm add -w ./artifacts/sanity-ui-*.tgz | ||
|
||
- name: Store Playwright's Version | ||
run: | | ||
PLAYWRIGHT_VERSION=$(npx playwright --version | sed 's/Version //') | ||
echo "Playwright's Version: $PLAYWRIGHT_VERSION" | ||
echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_ENV | ||
- name: Cache Playwright Browsers for Playwright's Version | ||
id: cache-playwright-browsers | ||
uses: actions/cache@v4 | ||
with: | ||
path: ~/.cache/ms-playwright | ||
key: playwright-browsers-${{ env.PLAYWRIGHT_VERSION }} | ||
|
||
- name: Install Playwright Browsers | ||
if: steps.cache-playwright-browsers.outputs.cache-hit != 'true' | ||
run: npx playwright install --with-deps | ||
|
||
- name: Build CLI | ||
run: pnpm build:cli --output-logs=full --log-order=grouped | ||
|
||
# - name: Build E2E test studio on next | ||
# if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/next' }} | ||
# env: | ||
# # Update the SANITY_E2E_SESSION_TOKEN on github to the new value once this is merged to next | ||
# # Change the below to `secrets.SANITY_E2E_SESSION_TOKEN` | ||
# # Delete `SANITY_E2E_SESSION_TOKEN_NEW` from github | ||
# SANITY_E2E_SESSION_TOKEN: ${{ secrets.SANITY_E2E_SESSION_TOKEN_NEW }} | ||
# SANITY_E2E_PROJECT_ID: ${{ secrets.SANITY_E2E_PROJECT_ID }} | ||
# SANITY_E2E_DATASET: ${{ secrets.SANITY_E2E_DATASET }} | ||
# run: pnpm e2e:setup && pnpm e2e:build | ||
|
||
- name: Build E2E test studio on PR | ||
# Always run with PRs logic, to ensure tests run by the UI repo doesn't conflict with tests run by the sanity repo | ||
# if: ${{ github.event_name == 'pull_request' }} | ||
env: | ||
# Update the SANITY_E2E_SESSION_TOKEN on github to the new value once this is merged to next | ||
# Change the below to `secrets.SANITY_E2E_SESSION_TOKEN` | ||
# Delete `SANITY_E2E_SESSION_TOKEN_NEW` from github | ||
SANITY_E2E_SESSION_TOKEN: ${{ secrets.SANITY_E2E_SESSION_TOKEN_NEW }} | ||
SANITY_E2E_PROJECT_ID: ${{ secrets.SANITY_E2E_PROJECT_ID }} | ||
SANITY_E2E_DATASET: pr-${{ matrix.project }}-${{ github.event.number }} | ||
run: pnpm e2e:setup && pnpm e2e:build | ||
|
||
# Caches build from either PR or next | ||
- name: Cache build | ||
id: cache-e2e-build | ||
uses: actions/cache@v4 | ||
env: | ||
cache-name: cache-e2e-build | ||
with: | ||
path: | | ||
./* | ||
!**/node_modules/** | ||
# Unique key for a workflow run. Should be invalidated in the next run | ||
key: ${{ runner.os }}-${{ matrix.project }}-${{ env.cache-name }}-${{ github.run_id }} | ||
|
||
playwright-test: | ||
timeout-minutes: 30 | ||
runs-on: ubuntu-latest | ||
needs: [install] | ||
env: | ||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} | ||
TURBO_TEAM: ${{ vars.TURBO_TEAM }} | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
# Be sure to update all instances in this file and `pr-cleanup.yml` if updated | ||
project: [chromium, firefox] | ||
# Add more shards here if needed | ||
shardIndex: [1, 2] | ||
shardTotal: [2] | ||
steps: | ||
- uses: actions/checkout@v4 | ||
with: | ||
repository: sanity-io/sanity | ||
- uses: actions/setup-node@v4 | ||
with: | ||
node-version: 18 | ||
|
||
- uses: pnpm/action-setup@v4 | ||
name: Install pnpm | ||
id: pnpm-install | ||
with: | ||
run_install: false | ||
|
||
- name: Get pnpm store directory | ||
id: pnpm-cache | ||
shell: bash | ||
run: | | ||
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT | ||
- name: Cache node modules | ||
id: cache-node-modules | ||
uses: actions/cache@v4 | ||
env: | ||
cache-name: cache-node-modules | ||
with: | ||
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} | ||
key: ${{ runner.os }}-pnpm-store-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }} | ||
restore-keys: | | ||
v1-${{ runner.os }}-pnpm-store-${{ env.cache-name }}- | ||
v1-${{ runner.os }}-pnpm-store- | ||
v1-${{ runner.os }}- | ||
- uses: actions/download-artifact@v4 | ||
with: | ||
name: pack-sanity-ui | ||
path: artifacts | ||
- name: Install project dependencies | ||
run: pnpm install | ||
|
||
- name: Store Playwright's Version | ||
run: | | ||
PLAYWRIGHT_VERSION=$(npx playwright --version | sed 's/Version //') | ||
echo "Playwright's Version: $PLAYWRIGHT_VERSION" | ||
echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_ENV | ||
- name: Cache Playwright Browsers for Playwright's Version | ||
id: cache-playwright-browsers | ||
uses: actions/cache/restore@v4 | ||
with: | ||
path: ~/.cache/ms-playwright | ||
key: playwright-browsers-${{ env.PLAYWRIGHT_VERSION }} | ||
|
||
- name: Install Playwright Browsers | ||
if: steps.cache-playwright-browsers.outputs.cache-hit != 'true' | ||
run: npx playwright install --with-deps | ||
|
||
- name: Restore build cache | ||
uses: actions/cache/restore@v4 | ||
id: restore-build | ||
env: | ||
cache-name: cache-e2e-build | ||
with: | ||
path: | | ||
./* | ||
!**/node_modules/** | ||
key: ${{ runner.os }}-${{ matrix.project }}-${{ env.cache-name }}-${{ github.run_id }} | ||
# If the cached build from the pervious step is not available. Fail the build | ||
fail-on-cache-miss: true | ||
|
||
# - name: Run E2E tests on next | ||
# if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/next' }} | ||
# env: | ||
# # Missing in docs but in use | ||
# # here https://github.com/microsoft/playwright/blob/main/packages/playwright/src/reporters/blob.ts#L108 | ||
# PWTEST_BLOB_REPORT_NAME: ${{ matrix.project }} | ||
# # Update the SANITY_E2E_SESSION_TOKEN on github to the new value once this is merged to next | ||
# # Change the below to `secrets.SANITY_E2E_SESSION_TOKEN` | ||
# # Delete `SANITY_E2E_SESSION_TOKEN_NEW` from github | ||
# SANITY_E2E_SESSION_TOKEN: ${{ secrets.SANITY_E2E_SESSION_TOKEN_NEW }} | ||
# SANITY_E2E_PROJECT_ID: ${{ secrets.SANITY_E2E_PROJECT_ID }} | ||
# SANITY_E2E_DATASET: ${{ secrets.SANITY_E2E_DATASET }} | ||
# run: pnpm test:e2e --project ${{ matrix.project }} --shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }} | ||
|
||
- name: Run E2E tests on PR | ||
# Always run with PRs logic, to ensure tests run by the UI repo doesn't conflict with tests run by the sanity repo | ||
# if: ${{ github.event_name == 'pull_request' }} | ||
env: | ||
# Missing in docs but in use | ||
# here https://github.com/microsoft/playwright/blob/main/packages/playwright/src/reporters/blob.ts#L108 | ||
PWTEST_BLOB_REPORT_NAME: ${{ matrix.project }} | ||
# Update the SANITY_E2E_SESSION_TOKEN on github to the new value once this is merged to next | ||
# Change the below to `secrets.SANITY_E2E_SESSION_TOKEN` | ||
# Delete `SANITY_E2E_SESSION_TOKEN_NEW` from github | ||
SANITY_E2E_SESSION_TOKEN: ${{ secrets.SANITY_E2E_SESSION_TOKEN_NEW }} | ||
SANITY_E2E_PROJECT_ID: ${{ secrets.SANITY_E2E_PROJECT_ID }} | ||
SANITY_E2E_DATASET: pr-${{ matrix.project }}-${{ github.event.number }} | ||
run: pnpm test:e2e --project ${{ matrix.project }} --shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }} | ||
|
||
- uses: actions/upload-artifact@v3 | ||
if: always() | ||
with: | ||
name: playwright-report | ||
path: blob-report | ||
retention-days: 30 | ||
merge-reports: | ||
if: always() | ||
needs: [playwright-test] | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v4 | ||
with: | ||
repository: sanity-io/sanity | ||
- uses: actions/setup-node@v4 | ||
with: | ||
node-version: 18 | ||
|
||
- uses: pnpm/action-setup@v4 | ||
name: Install pnpm | ||
id: pnpm-install | ||
with: | ||
run_install: false | ||
|
||
- name: Get pnpm store directory | ||
id: pnpm-cache | ||
shell: bash | ||
run: | | ||
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT | ||
- name: Cache node modules | ||
id: cache-node-modules | ||
uses: actions/cache@v4 | ||
env: | ||
cache-name: cache-node-modules | ||
with: | ||
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} | ||
key: ${{ runner.os }}-pnpm-store-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }} | ||
restore-keys: | | ||
v1-${{ runner.os }}-pnpm-store-${{ env.cache-name }}- | ||
v1-${{ runner.os }}-pnpm-store- | ||
v1-${{ runner.os }}- | ||
- name: Install project dependencies | ||
run: pnpm install | ||
|
||
- name: Download blob reports from Github Actions Artifacts | ||
uses: actions/download-artifact@v3 | ||
with: | ||
name: playwright-report | ||
path: playwright-report | ||
|
||
- name: Merge into HTML Report | ||
run: npx playwright merge-reports --reporter html ./playwright-report | ||
|
||
- name: Upload HTML report | ||
uses: actions/upload-artifact@v3 | ||
with: | ||
name: html-report--attempt-${{ github.run_attempt }} | ||
path: playwright-report | ||
retention-days: 30 | ||
|
||
cleanup: | ||
permissions: | ||
contents: read | ||
actions: write # needed to delete the cache | ||
timeout-minutes: 30 | ||
name: Cleanup (${{ matrix.project }}) | ||
runs-on: ubuntu-latest | ||
needs: [playwright-test] | ||
|
||
strategy: | ||
# we want to know if a test fails on a specific node version | ||
fail-fast: false | ||
matrix: | ||
# Be sure to update all instances in this file and `pr-cleanup.yml` if updated | ||
project: [chromium, firefox] | ||
|
||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
|
||
- name: Setup node | ||
uses: actions/setup-node@v4 | ||
with: | ||
node-version: 18 | ||
|
||
# Delete the cache so it is only used once | ||
- name: Delete Cache | ||
run: gh cache delete ${{ runner.os }}-${{ matrix.project }}-${{ env.cache-name }}-${{ github.run_id }} | ||
env: | ||
cache-name: cache-e2e-build | ||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
Oops, something went wrong.