Skip to content

fix: More robust token validation #17710

fix: More robust token validation

fix: More robust token validation #17710

Workflow file for this run

name: Test
on:
push:
branches: [main]
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
permissions:
actions: write
contents: read
pull-requests: read
jobs:
determine_jobs:
name: Determine jobs to run
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Find PR Comment
id: comment
if: github.event_name == 'pull_request'
uses: peter-evans/find-comment@v2
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: "github-actions[bot]"
body-includes: "<!-- CI COMMENT -->"
- name: Create or update PR comment
if: github.event_name == 'pull_request' && steps.comment.outputs.comment-id != ''
uses: peter-evans/create-or-update-comment@v2
continue-on-error: true
with:
comment-id: ${{ steps.comment.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body: |
## ⏳ CI is running again... ⏳
[Wait for it...](https://github.com/vercel/turbo/actions/runs/${{ github.run_id }})
<!-- CI COMMENT -->
edit-mode: replace
- name: Checkout
uses: actions/checkout@v3
- name: CI related changes
id: ci
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
.github/actions/**
.github/workflows/test.yml
- name: Root cargo related changes
id: cargo
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
Cargo.*
rust-toolchain
- name: Turborepo version changes
id: turborepo_version
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
version.txt
- name: Rust related changes
id: rust
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
pnpm-lock.yaml
package.json
Cargo.**
crates/**
shim/**
xtask/**
.cargo/**
rust-toolchain
!**.md
!**.mdx
- name: Turbopack related changes
id: turbopack
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
pnpm-lock.yaml
package.json
crates/**
xtask/**
.cargo/**
rust-toolchain
!crates/turborepo*/**
!**.md
!**.mdx
- name: Turbopack Benchmark related changes
id: turbopack_bench
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
crates/turbopack-bench/**
!*.md
- name: Turbopack TypeScript related changes
id: turbopack_typescript
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
crates/turbopack*/js/**
- name: Turborepo Rust related changes
id: turborepo_rust
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
pnpm-lock.yaml
package.json
crates/turborepo*/**
.cargo/**
rust-toolchain
!**.md
!**.mdx
- name: Turborepo integration tests changes
id: turborepo_integration
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
turborepo-tests/integration/**
turborepo-tests/helpers/**
- name: Examples related changes
id: examples
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
examples/**
turborepo-tests/example-*/**
turborepo-tests/helpers/**
!**.md
!**.mdx
- name: Turborepo JS Package related changes
id: turborepo_js
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
packages/**
- name: Docs related changes
id: docs
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
docs/**
- name: Formatting related changes
id: format
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
**/*.{yml,yaml,md,mdx,js,jsx,ts,tsx,json,toml,css}
outputs:
rust: ${{ steps.ci.outputs.diff != '' || steps.rust.outputs.diff != '' }}
cargo_only: ${{ steps.ci.outputs.diff != '' || (steps.cargo.outputs.diff != '' && steps.turbopack.outputs.diff == '' && steps.turborepo_rust.outputs.diff == '') }}
# We only test workspace dependency changes on main, not on PRs to speed up CI
cargo_on_main: ${{ steps.ci.outputs.diff != '' || (steps.cargo.outputs.diff != '' && github.event_name == 'push' && github.ref == 'refs/heads/main') }}
turbopack: ${{ steps.ci.outputs.diff != '' || steps.turbopack.outputs.diff != '' }}
turbopack_typescript: ${{ steps.ci.outputs.diff != '' || steps.turbopack_typescript.outputs.diff != '' }}
turborepo_rust: ${{ steps.ci.outputs.diff != '' || steps.turborepo_rust.outputs.diff != '' }}
turbopack_bench: ${{ steps.ci.outputs.diff != '' || steps.turbopack_bench.outputs.diff != '' }}
turborepo_build: ${{ steps.ci.outputs.diff != '' || steps.turborepo_rust.outputs.diff != '' || steps.turborepo_integration.outputs.diff != ''}}
turborepo_integration: ${{ steps.ci.outputs.diff != '' || steps.turborepo_rust.outputs.diff != '' || steps.turborepo_integration.outputs.diff != '' }}
examples: ${{ steps.ci.outputs.diff != '' || steps.examples.outputs.diff != '' || steps.turborepo_version.outputs.diff != '' }}
turborepo_js: ${{ steps.ci.outputs.diff != '' || steps.turborepo_js.outputs.diff != '' }}
docs: ${{ steps.ci.outputs.diff != '' || steps.docs.outputs.diff != '' }}
format: ${{ steps.ci.outputs.diff != '' || steps.format.outputs.diff != '' }}
push: ${{ steps.ci.outputs.diff != '' || github.event_name == 'push' }}
tag: ${{ steps.ci.outputs.diff != '' || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/node-file-trace')) }}
main_push: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
tag_push: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/node-file-trace') }}
build_turborepo:
name: Build Turborepo
needs: determine_jobs
if: needs.determine_jobs.outputs.turborepo_build == 'true'
runs-on: ${{ matrix.os.runner }}
strategy:
fail-fast: false
matrix:
os:
- name: ubuntu
runner:
- "self-hosted"
- "linux"
- "x64"
- "metal"
- name: macos
runner: macos-latest
- name: windows
runner: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Run sccache-cache
uses: mozilla-actions/sccache-action@v0.0.3
- uses: ./.github/actions/setup-turborepo-environment
with:
windows: ${{ matrix.os.name == 'windows' }}
github-token: "${{ secrets.GITHUB_TOKEN }}"
# We explicitly unset RUSTC_WRAPPER if it is an empty string as causes build issues
- run: |
if [ -z "${RUSTC_WRAPPER}" ]; then
unset RUSTC_WRAPPER
fi
turbo run build --filter=cli --color --env-mode=strict --token=${{ secrets.TURBO_TOKEN }} --team=${{ vars.TURBO_TEAM }}
shell: bash
env:
SCCACHE_BUCKET: turborepo-sccache
SCCACHE_REGION: us-east-2
# Only use sccache if we're in the Vercel repo.
RUSTC_WRAPPER: ${{ !github.event.pull_request.head.repo.fork && 'sccache' || '' }}
CARGO_INCREMENTAL: 0
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: Run sccache stat for check
shell: bash
run: ${SCCACHE_PATH} --show-stats
if: ${{ !github.event.pull_request.head.repo.fork }}
turborepo_integration:
name: Turborepo Integration
needs: [determine_jobs, build_turborepo]
if: needs.determine_jobs.outputs.turborepo_integration == 'true'
runs-on: ${{ matrix.os.runner }}
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
os:
- runner: ubuntu-latest
- runner: macos-latest
- runner: windows-latest
steps:
# On Windows, set autocrlf to input so that when the repo is cloned down
# the fixtures retain their line endings and don't get updated to CRLF.
# We want this because this repo also contains the fixtures for our test cases
# and these fixtures have files that need stable file hashes. If we let git update
# the line endings on checkout, the file hashes will change.
# https://www.git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_core_autocrlf
- name: set crlf
if: matrix.os.runner == 'windows-latest'
shell: bash
run: git config --global core.autocrlf input
- uses: actions/checkout@v3
- uses: ./.github/actions/setup-turborepo-environment
with:
windows: ${{ matrix.os.runner == 'windows-latest' }}
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Setup Graphviz
uses: ts-graphviz/setup-graphviz@v1
with:
macos-skip-brew-update: "true"
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: true
- name: Cache Prysk
id: cache-prysk
uses: actions/cache@v3
with:
path: cli/.cram_env
key: prysk-venv-${{ matrix.os.runner }}
- name: Integration Tests
run: turbo run test --filter=turborepo-tests-integration --color --env-mode=strict --token=${{ secrets.TURBO_TOKEN }} --team=${{ vars.TURBO_TEAM }}
turborepo_examples:
name: Turborepo Examples
needs: [determine_jobs]
if: needs.determine_jobs.outputs.examples == 'true'
timeout-minutes: 40
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
# Disable corepack. actions/setup-node invokes other package managers and
# that causes corepack to throw an error, so we disable it first.
- name: Disable corepack
shell: bash
run: corepack disable
- uses: ./.github/actions/setup-turborepo-environment
with:
windows: ${{ matrix.os.runner == 'windows-latest' }}
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Check examples
shell: bash
# Concurrency being 1 is a big hammer here.
# It's a quick fix for non-deterministic behaviors we're seeing around package resolution.
# We could likely do some hacking to reparallelize this, but it's not worth it right now.
run: turbo run test --filter="@turborepo-examples-tests/*" --continue --token=${{ secrets.TURBO_TOKEN }} --team=${{ vars.TURBO_TEAM }} --env-mode=strict --concurrency=1
# Disable corepack again. actions/setup-node's "Post" step runs at the end of
# this job invokes other package managers, and corepack throws an error.
# (corepack was enabled from inside the tests above).
- name: Disable corepack again
shell: bash
run: corepack disable
js_packages:
name: JS Package Tests
timeout-minutes: 30
if: needs.determine_jobs.outputs.turborepo_js == 'true' || needs.determine_jobs.outputs.docs == 'true'
needs: [determine_jobs]
runs-on: ${{ matrix.os.runner }}
strategy:
fail-fast: false
matrix:
os:
- name: ubuntu
runner:
- "self-hosted"
- "linux"
- "x64"
- "metal"
- name: macos
runner: macos-latest
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
TURBO_REMOTE_ONLY: true
steps:
# on main -> current + prev commit
# pr -> pr commits + base commit
- name: Determine fetch depth
id: fetch-depth
run: |
echo "depth=$(( ${{ github.event.pull_request.commits || 1 }} + 1 ))" >> $GITHUB_OUTPUT
- name: Checkout
uses: actions/checkout@v3
with:
ref: ${{ github.ref }}
fetch-depth: ${{ steps.fetch-depth.outputs.depth }}
- name: Build turborepo CLI from source
uses: ./.github/actions/setup-turborepo-environment
with:
windows: ${{ matrix.os.name == 'windows' }}
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Run tests
# We manually set TURBO_API to an empty string to override Hetzner env
# We filter out turborepo-repository because it's a native package and needs
# to run when turbo core changes. This job (`js_packages`) does not run on turborpeo core
# changes, and we don't want to enable that beahvior for _all_ our JS packages.
run: |
TURBO_API= turbo run check-types test --filter=docs --filter="!turborepo-repository" --filter={./packages/*}...[${{ github.event.pull_request.base.sha || 'HEAD^1' }}] --color --env-mode=strict
turbopack_typescript:
name: Turbopack TypeScript files
runs-on:
- "self-hosted"
- "linux"
- "x64"
- "metal"
needs: determine_jobs
if: needs.determine_jobs.outputs.turbopack_typescript == 'true'
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node.js
uses: ./.github/actions/setup-node
- name: Install dependencies
run: pnpm install -r --side-effects-cache false
- name: Check turbopack-node types
working-directory: crates/turbopack-node/js
run: pnpm run check
- name: Check turbopack-cli types
working-directory: crates/turbopack-cli/js
run: pnpm run check
- name: Check turbopack-ecmascript-runtime types
working-directory: crates/turbopack-ecmascript-runtime/js
run: pnpm run check
rust_lint:
needs: [determine_jobs]
if: needs.determine_jobs.outputs.rust == 'true'
name: Rust lints
runs-on:
- "self-hosted"
- "linux"
- "x64"
- "metal"
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Rust
uses: ./.github/actions/setup-rust
with:
components: rustfmt
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Run cargo fmt check
run: |
cargo fmt --check
- name: Check Cargo.toml formatting (taplo)
run: npx @taplo/cli@0.5.2 format --check
- name: Check licenses
uses: EmbarkStudios/cargo-deny-action@v1
with:
command: check licenses
turborepo_rust_check:
needs: [determine_jobs]
# We test dependency changes only on main
if: |
(needs.determine_jobs.outputs.rust == 'true' && needs.determine_jobs.outputs.turborepo_rust == 'true') ||
needs.determine_jobs.outputs.cargo_on_main == 'true' ||
needs.determine_jobs.outputs.cargo_only == 'true'
name: Turborepo rust check
runs-on:
- "self-hosted"
- "linux"
- "x64"
- "metal"
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Turborepo Environment
uses: ./.github/actions/setup-turborepo-environment
with:
windows: ${{ matrix.os.name == 'windows' }}
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Run cargo check
run: |
cargo groups check turborepo-libraries --features rustls-tls
turborepo_rust_clippy:
needs: [turborepo_rust_check]
name: Turborepo rust clippy
runs-on:
- "self-hosted"
- "linux"
- "x64"
- "metal"
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Turborepo Environment
uses: ./.github/actions/setup-turborepo-environment
with:
windows: ${{ matrix.os.name == 'windows' }}
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Run cargo clippy
run: |
cargo groups clippy turborepo-libraries --features rustls-tls -- --deny clippy::all
- name: Run ast-grep lints
run: |
npx --package @ast-grep/cli -- ast-grep scan $(cargo groups list turborepo-libraries | awk '{ print $2 }' | tr '\n' ' ')
turbopack_rust_check:
needs: [determine_jobs]
# We test dependency changes only on main
if: |
(needs.determine_jobs.outputs.rust == 'true' && needs.determine_jobs.outputs.turbopack == 'true') ||
needs.determine_jobs.outputs.cargo_on_main == 'true' ||
needs.determine_jobs.outputs.cargo_only == 'true'
name: Turbopack rust check
runs-on:
- "self-hosted"
- "linux"
- "x64"
- "metal"
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Rust
uses: ./.github/actions/setup-rust
with:
components: clippy
targets: wasm32-unknown-unknown,wasm32-wasi-preview1-threads
- name: Run cargo check release
run: |
RUSTFLAGS="-D warnings -A deprecated" cargo groups check turbopack --features rustls-tls --release
- name: Run cargo check for the wasi targets
run: |
RUSTFLAGS="-D warnings -A deprecated" cargo groups check turbopack-wasi --release
turbopack_rust_clippy:
needs: [turbopack_rust_check]
name: Turbopack rust clippy
runs-on:
- "self-hosted"
- "linux"
- "x64"
- "metal"
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Rust
uses: ./.github/actions/setup-rust
with:
components: clippy
targets: wasm32-unknown-unknown
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Run cargo clippy
run: |
RUSTFLAGS="-D warnings -A deprecated" cargo groups clippy turbopack --features rustls-tls
- name: Run ast-grep lints
run: |
npx --package @ast-grep/cli -- ast-grep scan $(cargo groups list turbopack | awk '{ print $2 }' | tr '\n' ' ')
next_dev_check:
needs: [determine_jobs]
if: needs.determine_jobs.outputs.turbopack == 'true' || needs.determine_jobs.outputs.cargo_on_main == 'true'
name: Check next-swc
runs-on:
- "self-hosted"
- "linux"
- "x64"
- "metal"
permissions:
pull-requests: write
steps:
- name: Checkout Next.js
uses: actions/checkout@v3
with:
repository: vercel/next.js
- name: Setup Rust
uses: ./.github/actions/setup-rust
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Build next-swc
run: |
export TURBOPACK_REMOTE="https://github.com/vercel/turbo"
# patch the turbo git dependency with the commit of the current PR.
export BINDING=$(printf 'patch."%s".%s.git="%s?rev=%s"' "$TURBOPACK_REMOTE" "turbopack-binding" "$TURBOPACK_REMOTE" "$GITHUB_SHA")
export TASKS=$(printf 'patch."%s".%s.git="%s?rev=%s"' "$TURBOPACK_REMOTE" "turbo-tasks" "$TURBOPACK_REMOTE" "$GITHUB_SHA")
export TASKS_FS=$(printf 'patch."%s".%s.git="%s?rev=%s"' "$TURBOPACK_REMOTE" "turbo-tasks-fs" "$TURBOPACK_REMOTE" "$GITHUB_SHA")
# set pipefail so the exit code of `cargo check` gets preserved
(set -o pipefail && \
cargo check \
--config $BINDING --config $TASKS --config $TASKS_FS \
--all -p next-swc-api \
--no-default-features --features rustls-tls \
--message-format short --quiet \
2>&1 | tee cargo_output.log)
- name: Success Log
run: |
printf ":white_check_mark: This change can build \`next-swc\`" > out.log
- name: Post logs if there are errors
if: failure()
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
job_url=$(gh api repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/attempts/${{ github.run_attempt }}/jobs --paginate --jq '.jobs.[] | select(.name == "Check next-swc").html_url')
# strip ansi colors with `sed`
echo "\
⚠️ This change may fail to build \`next-swc\`.
<details><summary>Logs</summary>
<p>
\`\`\`
$(cat cargo_output.log | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2};?)?)?[mGK]//g")
\`\`\`
</p>
</details>
See [job summary]($job_url) for details
" > out.log
- name: PR comment with file
uses: thollander/actions-comment-pull-request@v2
if: always() && github.repository == 'vercel/turbo'
# We'll not block CI on this step
continue-on-error: true
with:
filePath: ./out.log
comment_tag: check_next_swc_turbopack
turborepo_rust_test:
needs: [turborepo_rust_check]
strategy:
fail-fast: false
matrix:
os:
- name: ubuntu
runner:
- "self-hosted"
- "linux"
- "x64"
- "metal"
nextest: linux
- name: macos
runner: macos-latest
nextest: mac
- name: windows
runner: windows-latest
nextest: windows-tar
runs-on: ${{ matrix.os.runner }}
name: Turborepo Rust testing on ${{ matrix.os.name }}
steps:
- name: Set git to use LF line endings
run: |
git config --global core.autocrlf false
git config --global core.eol lf
if: matrix.os.name == 'windows'
- name: Checkout
uses: actions/checkout@v3
- name: Setup Turborepo Environment
uses: ./.github/actions/setup-turborepo-environment
with:
windows: ${{ matrix.os.name == 'windows' }}
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Run tests
timeout-minutes: 120
run: |
cargo groups test turborepo-libraries
turbopack_rust_test1:
needs: [turbopack_rust_check]
runs-on:
- "self-hosted"
- "linux"
- "x64"
- "metal"
name: Turbopack Rust testing on ubuntu
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Rust
uses: ./.github/actions/setup-rust
with:
save-cache: true
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Setup Node.js
uses: ./.github/actions/setup-node
with:
node-version: 18
- name: Install tests dependencies
working-directory: crates/turbopack/tests/node-file-trace
run: pnpm install -r --side-effects-cache false
- name: Install tests dependencies in examples/with-yarn
working-directory: examples/with-yarn
run: npm install
- name: Install nextest
uses: taiki-e/install-action@v2
with:
tool: cargo-nextest@0.9.61
- name: Build nextest
timeout-minutes: 120
run: |
cargo tp-pre-test
- name: Run nextest
timeout-minutes: 120
run: |
cargo tp-test --profile tp-test-linux
- name: Upload results
if: always()
uses: actions/upload-artifact@v3
with:
name: test_reports
path: target/nextest/**/*.xml
turbopack_rust_test2:
needs: [turbopack_rust_check]
strategy:
fail-fast: false
matrix:
os:
- name: macos
runner: macos-latest
- name: windows
runner: windows-latest
runs-on: ${{ matrix.os.runner }}
name: Turbopack Rust testing on ${{ matrix.os.name }}
steps:
- name: Set git to use LF line endings
run: |
git config --global core.autocrlf false
git config --global core.eol lf
if: matrix.os.name == 'windows'
- name: Checkout
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
# TODO: Remove this specific version constraint once pnpm ships with
# node-gyp that's compatible with Python 3.12+
python-version: 3.11
- name: Setup Rust
uses: ./.github/actions/setup-rust
with:
save-cache: true
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Setup Node.js
uses: ./.github/actions/setup-node
with:
node-version: 18
- name: Prepare toolchain on Windows
run: |
pnpx node-gyp install
echo 'node-linker = "hoisted"' > crates/turbopack/tests/node-file-trace/.npmrc
if: matrix.os.name == 'windows'
- name: Install tests dependencies
working-directory: crates/turbopack/tests/node-file-trace
run: pnpm install -r --side-effects-cache false
- name: Install tests dependencies in examples/with-yarn
working-directory: examples/with-yarn
run: npm install
- name: Install nextest
uses: taiki-e/install-action@v2
with:
tool: cargo-nextest@0.9.61
- name: Build nextest
timeout-minutes: 120
run: |
cargo tp-pre-test
- name: Run nextest (Mac)
timeout-minutes: 120
if: matrix.os.name == 'macos'
run: |
cargo tp-test --profile tp-test-mac
- name: Run nextest (Windows)
timeout-minutes: 120
if: matrix.os.name == 'windows'
run: |
cargo tp-test --profile tp-test-win
- name: Upload results
if: always()
uses: actions/upload-artifact@v3
with:
name: test_reports
path: target/nextest/**/*.xml
turbopack_rust_test_bench1:
needs: [determine_jobs, turbopack_rust_check]
name: Turbopack Rust testing benchmarks on linux
uses: ./.github/workflows/test-turbopack-rust-bench-test.yml
with:
# custom runner label specific to workflow
runner: ubuntu-latest-metal
os: linux
all: ${{ needs.determine_jobs.outputs.turbopack_bench == 'true' }}
turbopack_rust_test_bench2:
needs: [determine_jobs, turbopack_rust_check]
strategy:
fail-fast: false
matrix:
os:
- name: macos
runner: macos-latest
# Temporarily disable windows bench due to consistent timeouts
# - name: windows
# runner: windows-2019
name: Turbopack Rust testing benchmarks on ${{ matrix.os.name }}
uses: ./.github/workflows/test-turbopack-rust-bench-test.yml
with:
runner: ${{ matrix.os.runner }}
os: ${{ matrix.os.name }}
all: ${{ needs.determine_jobs.outputs.turbopack_bench == 'true' }}
format_lint:
name: Formatting
runs-on:
- "self-hosted"
- "linux"
- "x64"
- "metal"
needs: determine_jobs
if: needs.determine_jobs.outputs.format == 'true'
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
TURBO_REMOTE_ONLY: true
steps:
- name: Checkout
uses: actions/checkout@v3
- uses: ./.github/actions/setup-turborepo-environment
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Lint
# Filters some workspaces out:
# - Other `@vercel/*` packages because ??
run: turbo run lint --filter=!@vercel/devlow-bench --filter=!@vercel/experimental-nft-next-plugin --filter=!@vercel/experimental-nft-next-plugin --filter=!turbopack-bump-action --filter=!next-integration-stat --env-mode=strict
final:
name: Ok
needs:
- determine_jobs
- turborepo_examples
- turborepo_integration
- js_packages
- rust_lint
- turborepo_rust_check
- turborepo_rust_clippy
- turbopack_rust_check
- turbopack_rust_clippy
- turbopack_rust_test1
- turbopack_rust_test_bench1
- turbopack_typescript
- turborepo_rust_test
- format_lint
if: always()
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- name: Compute info
id: info
if: always()
run: |
cancelled=false
failure=false
subjob () {
local result=$1
local name=$2
if [ "$result" = "cancelled" ]; then
cancelled=true
elif [ "$result" != "success" ] && [ "$result" != "skipped" ]; then
echo "- $name" >> failures.md
failure=true
fi
}
subjob ${{needs.determine_jobs.result}} "Determining jobs"
subjob ${{needs.turborepo_examples.result}} "Turborepo examples"
subjob ${{needs.turborepo_integration.result}} "Turborepo integration tests"
subjob ${{needs.js_packages.result}} "JS Package tests"
subjob ${{needs.rust_lint.result}} "Rust lints"
subjob ${{needs.turborepo_rust_check.result}} "Turborepo Rust checks"
subjob ${{needs.turborepo_rust_clippy.result}} "Turborepo Rust clippy"
subjob ${{needs.turbopack_rust_check.result}} "Turbopack Rust checks"
subjob ${{needs.turbopack_rust_clippy.result}} "Turbopack Rust clippy"
subjob ${{needs.turbopack_rust_test1.result}} "Turbopack Rust tests (linux)"
subjob ${{needs.turbopack_rust_test_bench1.result}} "Turbopack Rust benchmark tests (linux)"
subjob ${{needs.turbopack_typescript.result}} "Turbopack Typescript checks"
subjob ${{needs.turborepo_rust_test.result}} "Turborepo Rust tests"
subjob ${{needs.format_lint.result}} "Formatting"
if [ "$cancelled" = "true" ]; then
echo "cancelled=true" >> $GITHUB_OUTPUT
elif [ "$failure" = "true" ]; then
echo "failure=true" >> $GITHUB_OUTPUT
else
echo "success=true" >> $GITHUB_OUTPUT
fi
- name: Add failure prose text
if: steps.info.outputs.failure == 'true'
run: |
echo "## ⚠ CI failed ⚠" > comment.md
echo >> comment.md
echo "The following steps have failed in CI:" >> comment.md
echo >> comment.md
cat failures.md >> comment.md
echo >> comment.md
echo "See [workflow summary](https://github.com/vercel/turbo/actions/runs/${{ github.run_id }}) for details">> comment.md
echo >> comment.md
echo "<!-- CI COMMENT -->" >> comment.md
- name: Add success prose text
if: steps.info.outputs.success == 'true'
run: |
echo "## 🟢 CI likely successful 🟢" > comment.md
echo >> comment.md
echo "A few longer running steps are still running, but they should not be considered as blocking." >> comment.md
echo >> comment.md
echo "See [workflow summary](https://github.com/vercel/turbo/actions/runs/${{ github.run_id }}) for details">> comment.md
echo >> comment.md
echo "<!-- CI COMMENT -->" >> comment.md
- name: Find PR Comment
id: comment
if: always() && github.event_name == 'pull_request' && steps.info.outputs.cancelled != 'true'
uses: peter-evans/find-comment@v2
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: "github-actions[bot]"
body-includes: "<!-- CI COMMENT -->"
- name: Create or update PR comment
if: always() && github.event_name == 'pull_request' && steps.info.outputs.cancelled != 'true'
uses: peter-evans/create-or-update-comment@v2
continue-on-error: true
with:
comment-id: ${{ steps.comment.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body-file: "comment.md"
edit-mode: replace
- name: It's not fine
if: steps.info.outputs.failure == 'true'
run: exit 1
- name: It's fine
if: steps.info.outputs.success == 'true'
run: echo Ok
# Upload Turbopack's test results into datadog.
upload_test_results:
name: Upload Test results
needs: [determine_jobs, turbopack_rust_test1, turbopack_rust_test2]
# We have to set condition to always, since we want to upload test results for the failed tests as well.
if: ${{ always() }}
runs-on: ubuntu-latest
# Do not block CI if upload fails for some reason
continue-on-error: true
steps:
# Uploading test results does not require turbopack's src codes, but this
# allows datadog uploader to sync with git information.
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3.6.0
with:
node-version: 18
- name: Install datadog
run: npm install -g @datadog/datadog-ci@2.18.1
- name: Download test results
uses: actions/download-artifact@v3
with:
path: artifacts
- name: Upload
continue-on-error: true
env:
DATADOG_API_KEY: ${{ secrets.DD_KEY_TURBOPACK }}
run: |
DD_ENV=ci datadog-ci junit upload --service Turbopack ./artifacts/test_reports/**/*.xml
done:
name: Done
needs:
- final
- determine_jobs
- turborepo_examples
- turborepo_integration
- rust_lint
- turborepo_rust_check
- turborepo_rust_clippy
- turbopack_rust_check
- turbopack_rust_clippy
- turbopack_rust_test1
- turbopack_rust_test2
- turbopack_rust_test_bench1
- turbopack_rust_test_bench2
- turbopack_typescript
- turborepo_rust_test
- format_lint
if: always()
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- name: Compute info
id: info
if: always()
run: |
cancelled=false
failure=false
subjob () {
local result=$1
local name=$2
echo "$name: $result"
if [ "$result" = "cancelled" ]; then
cancelled=true
elif [ "$result" != "success" ] && [ "$result" != "skipped" ]; then
echo "- $name" >> failures.md
failure=true
fi
}
subjob ${{needs.determine_jobs.result}} "Determining jobs"
subjob ${{needs.turborepo_examples.result}} "Turborepo examples"
subjob ${{needs.turborepo_integration.result}} "Turborepo integration tests"
subjob ${{needs.rust_lint.result}} "Rust lints"
subjob ${{needs.turborepo_rust_check.result}} "Turborepo Rust checks"
subjob ${{needs.turborepo_rust_clippy.result}} "Turborepo Rust clippy"
subjob ${{needs.turbopack_rust_check.result}} "Turbopack Rust checks"
subjob ${{needs.turbopack_rust_clippy.result}} "Turbopack Rust clippy"
subjob ${{needs.turbopack_rust_test1.result}} "Turbopack Rust tests (linux)"
subjob ${{needs.turbopack_rust_test2.result}} "Turbopack Rust tests (mac/win, non-blocking)"
subjob ${{needs.turbopack_rust_test_bench1.result}} "Turbopack Rust benchmark tests (linux)"
subjob ${{needs.turbopack_rust_test_bench2.result}} "Turbopack Rust benchmark tests (mac/win, non-blocking)"
subjob ${{needs.turbopack_typescript.result}} "Turbopack Typescript checks"
subjob ${{needs.turborepo_rust_test.result}} "TurboRepo Rust tests"
subjob ${{needs.format_lint.result}} "Formatting"
if [ "$cancelled" = "true" ]; then
echo "cancelled=true" >> $GITHUB_OUTPUT
elif [ "$failure" = "true" ]; then
echo "failure=true" >> $GITHUB_OUTPUT
else
echo "success=true" >> $GITHUB_OUTPUT
fi
- name: Add failure prose text
if: steps.info.outputs.failure == 'true'
run: |
echo "## ⚠️ CI failed ⚠️" > comment.md
echo >> comment.md
echo "The following steps have failed in CI:" >> comment.md
echo >> comment.md
cat failures.md >> comment.md
echo >> comment.md
echo "See [workflow summary](https://github.com/vercel/turbo/actions/runs/${{ github.run_id }}) for details">> comment.md
echo >> comment.md
echo "<!-- CI COMMENT -->" >> comment.md
- name: Add success prose text
if: steps.info.outputs.success == 'true'
run: |
echo "## 🟢 CI successful 🟢" > comment.md
echo >> comment.md
echo "Thanks" >> comment.md
echo >> comment.md
echo "<!-- CI COMMENT -->" >> comment.md
- name: Find PR Comment
id: comment
if: always() && github.event_name == 'pull_request' && steps.info.outputs.cancelled != 'true'
uses: peter-evans/find-comment@v2
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: "github-actions[bot]"
body-includes: "<!-- CI COMMENT -->"
- name: Create or update PR comment
if: always() && github.event_name == 'pull_request' && steps.info.outputs.cancelled != 'true'
uses: peter-evans/create-or-update-comment@v2
continue-on-error: true
with:
comment-id: ${{ steps.comment.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body-file: "comment.md"
edit-mode: replace
- name: It's not fine
if: steps.info.outputs.failure == 'true'
run: exit 1
- name: It's fine
if: steps.info.outputs.success == 'true'
run: echo Ok
cleanup:
name: Cleanup
needs: [done]
if: always()
uses: ./.github/workflows/pr-clean-caches.yml
secrets: inherit