E2E Tests #21491
This file contains hidden or 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 Tests | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
schedule: | |
- cron: 0 * * * * # hourly | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
permissions: | |
contents: write | |
pull-requests: write | |
actions: read | |
jobs: | |
prepare-wasm: | |
runs-on: namespace-profile-ubuntu-8-cores | |
steps: | |
- uses: actions/checkout@v4 | |
- id: filter | |
name: Check for Rust changes | |
uses: dorny/paths-filter@v3 | |
with: | |
filters: | | |
rust: | |
- 'rust/**' | |
- uses: actions/setup-node@v4 | |
with: | |
node-version-file: '.nvmrc' | |
cache: 'npm' | |
- name: Install dependencies | |
run: npm install | |
- name: Download Wasm cache | |
id: download-wasm | |
if: ${{ github.event_name != 'schedule' && steps.filter.outputs.rust == 'false' }} | |
uses: dawidd6/action-download-artifact@v11 | |
continue-on-error: true | |
with: | |
github_token: ${{secrets.GITHUB_TOKEN}} | |
name: wasm-bundle | |
workflow: build-and-store-wasm.yml | |
branch: main | |
path: rust/kcl-wasm-lib/pkg | |
- name: Build Wasm condition | |
id: wasm | |
run: | | |
set -euox pipefail | |
# Build wasm if this is a scheduled run, there are Rust changes, or | |
# downloading from the wasm cache failed. | |
if [[ ${{github.event_name}} == 'schedule' || ${{steps.filter.outputs.rust}} == 'true' || ${{steps.download-wasm.outcome}} == 'failure' ]]; then | |
echo "should-build-wasm=true" >> $GITHUB_OUTPUT | |
else | |
echo "should-build-wasm=false" >> $GITHUB_OUTPUT | |
fi | |
- name: Use correct Rust toolchain | |
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }} | |
shell: bash | |
run: | | |
[ -e rust-toolchain.toml ] || cp rust/rust-toolchain.toml ./ | |
- name: Install Rust | |
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }} | |
uses: actions-rust-lang/setup-rust-toolchain@v1 | |
with: | |
cache: false # Configured below. | |
- uses: taiki-e/install-action@c07504cae06f832dc8de08911c9a9c5cddb0d2d3 | |
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }} | |
with: | |
tool: wasm-pack | |
- name: Use Rust cache | |
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }} | |
uses: Swatinem/rust-cache@v2 | |
with: | |
workspaces: './rust' | |
- name: Build Wasm | |
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }} | |
shell: bash | |
run: npm run build:wasm | |
- name: Upload compiled wasm artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: prepared-wasm | |
path: | | |
rust/kcl-wasm-lib/pkg/kcl_wasm_lib* | |
snapshots: | |
needs: [prepare-wasm] | |
runs-on: namespace-profile-ubuntu-8-cores | |
name: e2e:snapshots | |
steps: | |
- uses: actions/create-github-app-token@v2 | |
id: app-token | |
with: | |
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }} | |
private-key: ${{ secrets.MODELING_APP_GH_APP_PRIVATE_KEY }} | |
owner: ${{ github.repository_owner }} | |
- uses: actions/checkout@v4 | |
with: | |
token: ${{ steps.app-token.outputs.token }} | |
- uses: actions/download-artifact@v4 | |
name: prepared-wasm | |
- name: Copy prepared Wasm | |
run: | | |
ls -R prepared-wasm | |
cp prepared-wasm/kcl_wasm_lib_bg.wasm public | |
mkdir rust/kcl-wasm-lib/pkg | |
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg | |
- uses: actions/setup-node@v4 | |
with: | |
node-version-file: '.nvmrc' | |
cache: 'npm' | |
- name: Install dependencies | |
run: npm install | |
- name: Download browser cache | |
uses: actions/cache@v4 | |
with: | |
path: | | |
~/.cache/ms-playwright/ | |
key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }} | |
- name: Install browsers | |
run: npm run playwright install --with-deps | |
- name: npm run test:snapshots | |
uses: nick-fields/[email protected] | |
with: | |
shell: bash | |
command: npm run test:snapshots | |
timeout_minutes: 5 | |
max_attempts: 5 | |
env: | |
VITE_KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} | |
TAB_API_URL: ${{ secrets.TAB_API_URL }} | |
TAB_API_KEY: ${{ secrets.TAB_API_KEY }} | |
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }} | |
CI_PR_NUMBER: ${{ github.event.pull_request.number }} | |
CI_SUITE: e2e:snapshots | |
TARGET: web | |
- name: Update snapshots | |
if: failure() | |
run: npm run test:snapshots -- --last-failed --update-snapshots | |
env: | |
VITE_KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} | |
TAB_API_URL: ${{ secrets.TAB_API_URL }} | |
TAB_API_KEY: ${{ secrets.TAB_API_KEY }} | |
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }} | |
CI_PR_NUMBER: ${{ github.event.pull_request.number }} | |
CI_SUITE: e2e:snapshots | |
TARGET: web | |
- name: Upload playwright report | |
uses: actions/upload-artifact@v4 | |
if: ${{ !cancelled() }} | |
with: | |
name: playwright-report-snapshot-${{ github.sha }} | |
path: playwright-report/ | |
include-hidden-files: true | |
retention-days: 30 | |
overwrite: true | |
- name: Check diff | |
if: ${{ always() && github.ref != 'refs/heads/main' }} | |
shell: bash | |
id: git-check | |
run: | | |
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots | |
if git status | grep --quiet "Changes to be committed" | |
then echo "modified=true" >> $GITHUB_OUTPUT | |
else echo "modified=false" >> $GITHUB_OUTPUT | |
fi | |
- name: Commit changes | |
if: ${{ always() && steps.git-check.outputs.modified == 'true' }} | |
shell: bash | |
run: | | |
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots | |
git config --local user.email "github-actions[bot]@users.noreply.github.com" | |
git config --local user.name "github-actions[bot]" | |
git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git | |
git fetch origin | |
echo ${{ github.head_ref }} | |
git checkout ${{ github.head_ref }} | |
git commit --message "Update snapshots" || true | |
git push | |
git push origin ${{ github.head_ref }} | |
web: | |
needs: [prepare-wasm] | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: namespace-profile-ubuntu-8-cores | |
- os: namespace-profile-macos-8-cores | |
- os: namespace-profile-windows-8-cores | |
runs-on: ${{ matrix.os }} | |
name: e2e:web (${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }}) | |
env: | |
OS_NAME: ${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }} | |
steps: | |
- uses: actions/create-github-app-token@v2 | |
id: app-token | |
with: | |
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }} | |
private-key: ${{ secrets.MODELING_APP_GH_APP_PRIVATE_KEY }} | |
owner: ${{ github.repository_owner }} | |
- uses: actions/checkout@v4 | |
with: | |
token: ${{ steps.app-token.outputs.token }} | |
- uses: actions/download-artifact@v4 | |
name: prepared-wasm | |
- name: Copy prepared Wasm | |
run: | | |
ls -R prepared-wasm | |
cp prepared-wasm/kcl_wasm_lib_bg.wasm public | |
mkdir rust/kcl-wasm-lib/pkg | |
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg | |
- uses: actions/setup-node@v4 | |
with: | |
node-version-file: '.nvmrc' | |
cache: 'npm' | |
- name: Install dependencies | |
run: npm install | |
- name: Download browser cache | |
uses: actions/cache@v4 | |
with: | |
path: | | |
~/.cache/ms-playwright/ | |
key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }} | |
- name: Install browsers | |
run: npm run playwright install --with-deps | |
- name: Start Vector | |
if: ${{ !contains(matrix.os, 'windows') }} | |
run: .github/ci-cd-scripts/start-vector-${{ env.OS_NAME }}.sh | |
env: | |
GH_ACTIONS_AXIOM_TOKEN: ${{ secrets.GH_ACTIONS_AXIOM_TOKEN }} | |
OS_NAME: ${{ env.OS_NAME }} | |
- name: npm run test:e2e:web | |
uses: nick-fields/[email protected] | |
with: | |
shell: bash | |
command: npm run test:e2e:web | |
timeout_minutes: 5 | |
max_attempts: 5 | |
env: | |
VITE_KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} | |
TAB_API_URL: ${{ secrets.TAB_API_URL }} | |
TAB_API_KEY: ${{ secrets.TAB_API_KEY }} | |
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }} | |
CI_PR_NUMBER: ${{ github.event.pull_request.number }} | |
CI_SUITE: e2e:web | |
TARGET: web | |
- name: Upload playwright report | |
uses: actions/upload-artifact@v4 | |
if: ${{ !cancelled() && (success() || failure()) }} | |
with: | |
name: playwright-report-web-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }} | |
path: playwright-report/ | |
include-hidden-files: true | |
retention-days: 30 | |
overwrite: true | |
desktop: | |
needs: [prepare-wasm] | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: namespace-profile-ubuntu-8-cores | |
shardIndex: 1 | |
shardTotal: 8 | |
- os: namespace-profile-ubuntu-8-cores | |
shardIndex: 2 | |
shardTotal: 8 | |
- os: namespace-profile-ubuntu-8-cores | |
shardIndex: 3 | |
shardTotal: 8 | |
- os: namespace-profile-ubuntu-8-cores | |
shardIndex: 4 | |
shardTotal: 8 | |
- os: namespace-profile-ubuntu-8-cores | |
shardIndex: 5 | |
shardTotal: 8 | |
- os: namespace-profile-ubuntu-8-cores | |
shardIndex: 6 | |
shardTotal: 8 | |
- os: namespace-profile-ubuntu-8-cores | |
shardIndex: 7 | |
shardTotal: 8 | |
- os: namespace-profile-ubuntu-8-cores | |
shardIndex: 8 | |
shardTotal: 8 | |
- os: namespace-profile-macos-8-cores | |
shardIndex: 1 | |
shardTotal: 2 | |
- os: namespace-profile-macos-8-cores | |
shardIndex: 2 | |
shardTotal: 2 | |
- os: namespace-profile-windows-8-cores | |
shardIndex: 1 | |
shardTotal: 2 | |
- os: namespace-profile-windows-8-cores | |
shardIndex: 2 | |
shardTotal: 2 | |
runs-on: ${{ matrix.os }} | |
name: e2e:desktop (${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }}, shard ${{ matrix.shardIndex }}) | |
env: | |
OS_NAME: ${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/download-artifact@v4 | |
name: prepared-wasm | |
- name: Copy prepared Wasm | |
run: | | |
ls -R prepared-wasm | |
cp prepared-wasm/kcl_wasm_lib_bg.wasm public | |
mkdir rust/kcl-wasm-lib/pkg | |
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg | |
- uses: actions/setup-node@v4 | |
with: | |
node-version-file: '.nvmrc' | |
cache: 'npm' | |
- name: Install dependencies | |
id: deps-install | |
run: npm install | |
- name: Download browser cache | |
uses: actions/cache@v4 | |
with: | |
path: | | |
~/.cache/ms-playwright/ | |
key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }} | |
- name: Install browsers | |
run: npm run playwright install --with-deps | |
- name: Start Vector | |
if: ${{ !contains(matrix.os, 'windows') }} | |
run: .github/ci-cd-scripts/start-vector-${{ env.OS_NAME }}.sh | |
env: | |
GH_ACTIONS_AXIOM_TOKEN: ${{ secrets.GH_ACTIONS_AXIOM_TOKEN }} | |
OS_NAME: ${{ env.OS_NAME }} | |
- name: Build app | |
run: npm run tronb:vite:dev | |
- uses: actions/download-artifact@v4 | |
if: ${{ !cancelled() && (success() || failure()) }} | |
continue-on-error: true | |
with: | |
name: test-results-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }} | |
path: test-results/ | |
- name: npm run test:e2e:desktop | |
id: retry | |
if: ${{ !cancelled() && steps.deps-install.outcome == 'success' }} | |
uses: nick-fields/[email protected] | |
with: | |
shell: bash | |
command: .github/ci-cd-scripts/playwright-electron.sh ${{matrix.shardIndex}} ${{matrix.shardTotal}} ${{ env.OS_NAME }} | |
timeout_minutes: 30 | |
max_attempts: 9 | |
env: | |
FAIL_ON_CONSOLE_ERRORS: true | |
VITE_KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} | |
TAB_API_URL: ${{ secrets.TAB_API_URL }} | |
TAB_API_KEY: ${{ secrets.TAB_API_KEY }} | |
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }} | |
CI_PR_NUMBER: ${{ github.event.pull_request.number }} | |
CI_SUITE: e2e:desktop | |
TARGET: desktop | |
- name: Upload test report | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: test-results-desktop-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }} | |
path: test-results/ | |
include-hidden-files: true | |
retention-days: 30 | |
overwrite: true | |
- name: Upload playwright report | |
uses: actions/upload-artifact@v4 | |
if: always() | |
with: | |
name: playwright-report-desktop-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }} | |
path: playwright-report/ | |
include-hidden-files: true | |
retention-days: 30 | |
overwrite: true |