remove box_syntax #8197
Workflow file for this run
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
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: | | |
## :hourglass_flowing_sand: CI is running again... :hourglass_flowing_sand: | |
[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 | |
.github/workflows/setup-nextjs-build.yml | |
.github/workflows/nextjs-integration-test-results.yml | |
.github/workflows/upload-nextjs-integration-test-results.yml | |
- name: Root cargo related changes | |
id: cargo | |
uses: technote-space/get-diff-action@v6 | |
with: | |
PATTERNS: | | |
Cargo.* | |
rust-toolchain | |
- 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 | |
!glob-watch | |
!crates/turborepo/** | |
!crates/turborepo-api-client/** | |
!crates/turborepo-lib/** | |
!crates/turborepo-ffi/** | |
!crates/turborepo-scm/** | |
!crates/turborepo-lockfiles/** | |
!crates/turbo-updater/** | |
!**.md | |
!**.mdx | |
- name: Turbopack Benchmark related changes | |
id: turbopack_bench | |
uses: technote-space/get-diff-action@v6 | |
with: | |
PATTERNS: | | |
crates/turbopack-bench/** | |
!*.md | |
- name: Turborepo related changes | |
id: turborepo | |
uses: technote-space/get-diff-action@v6 | |
with: | |
PATTERNS: | | |
pnpm-lock.yaml | |
package.json | |
glob-watch | |
crates/turborepo/** | |
crates/turborepo-api-client/** | |
crates/turborepo-lib/** | |
crates/turborepo-ffi/** | |
crates/turborepo-scm/** | |
crates/turborepo-lockfiles/** | |
crates/turbo-updater/** | |
.cargo/** | |
rust-toolchain | |
!**.md | |
!**.mdx | |
- name: Go related changes | |
id: go | |
uses: technote-space/get-diff-action@v6 | |
with: | |
PATTERNS: | | |
cli/** | |
- name: Go E2E related changes | |
id: go_e2e | |
uses: technote-space/get-diff-action@v6 | |
with: | |
PATTERNS: | | |
cli/** | |
crates/turborepo* | |
crates/turborepo*/** | |
crates/turbo-updater | |
Cargo.lock | |
- name: Examples related changes | |
id: examples | |
uses: technote-space/get-diff-action@v6 | |
with: | |
PATTERNS: | | |
examples/** | |
turborepo-tests/examples/** | |
!**.md | |
!**.mdx | |
- 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 != '' }} | |
# 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 != '' }} | |
turborepo: ${{ steps.ci.outputs.diff != '' || steps.turborepo.outputs.diff != '' }} | |
turbopack_bench: ${{ steps.ci.outputs.diff != '' || steps.turbopack_bench.outputs.diff != '' }} | |
go: ${{ steps.ci.outputs.diff != '' || steps.go.outputs.diff != '' }} | |
go_e2e: ${{ steps.ci.outputs.diff != '' || steps.go.outputs.diff != '' || steps.go_e2e.outputs.diff != '' }} | |
examples: ${{ steps.ci.outputs.diff != '' || steps.examples.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') }} | |
go_lint: | |
name: Go linting | |
runs-on: ubuntu-latest | |
needs: determine_jobs | |
if: needs.determine_jobs.outputs.go == 'true' | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
- name: Setup Go | |
uses: ./.github/actions/setup-go | |
with: | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- name: Setup Protos | |
run: cd cli && make compile-protos | |
- name: Build turborepo-ffi | |
run: cd cli && make turborepo-ffi-install | |
- name: golangci Linting | |
uses: golangci/golangci-lint-action@v3 | |
with: | |
# More config options documented here: https://github.com/golangci/golangci-lint-action | |
version: latest | |
working-directory: cli | |
args: --new-from-rev=${{ github.event.pull_request.base.sha || 'HEAD~1' }} | |
go_unit: | |
name: Go Unit Tests | |
needs: determine_jobs | |
if: needs.determine_jobs.outputs.go == 'true' | |
timeout-minutes: 30 | |
runs-on: ${{ matrix.os.runner }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- name: ubuntu | |
runner: ubuntu-latest | |
- name: macos | |
runner: macos-latest | |
- name: windows | |
runner: windows-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup-turborepo-environment | |
with: | |
target: ${{ matrix.os.name }} | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- run: turbo run test --filter=cli --color | |
go_integration: | |
name: Go Integration Tests | |
needs: determine_jobs | |
if: needs.determine_jobs.outputs.go_e2e == 'true' | |
timeout-minutes: 30 | |
runs-on: ${{ matrix.os.runner }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- name: ubuntu | |
runner: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup-turborepo-environment | |
with: | |
target: ${{ matrix.os.name }} | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- name: Cache Prysk | |
id: cache-prysk | |
uses: actions/cache@v3 | |
with: | |
path: cli/.cram_env | |
key: prysk-venv-${{ matrix.os.name }} | |
- name: Integration Tests | |
run: turbo run test --filter=turborepo-tests-integration | |
env: | |
GO_TAG: rust | |
go_e2e: | |
name: Go E2E Tests | |
needs: determine_jobs | |
if: needs.determine_jobs.outputs.go_e2e == 'true' | |
timeout-minutes: 60 | |
runs-on: ${{ matrix.os.runner }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- name: ubuntu | |
runner: ubuntu-latest | |
- name: macos | |
runner: macos-latest | |
- name: windows | |
runner: windows-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup-turborepo-environment | |
with: | |
target: ${{ matrix.os.name }} | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- name: E2E Tests | |
run: turbo run test --filter=turborepo-tests-e2e | |
go_examples: | |
name: Go Cli Examples | |
needs: determine_jobs | |
if: needs.determine_jobs.outputs.examples == 'true' | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- name: ubuntu | |
runner: ubuntu-latest | |
- name: macos | |
runner: macos-latest | |
manager: [yarn, npm] | |
example: [with-yarn, with-npm, non-monorepo] | |
include: | |
- os: | |
name: ubuntu | |
runner: ubuntu-latest | |
manager: pnpm | |
example: basic | |
- os: | |
name: macos | |
runner: macos-latest | |
manager: pnpm | |
example: basic | |
- os: | |
name: ubuntu | |
runner: ubuntu-latest | |
manager: pnpm | |
example: kitchen-sink | |
- os: | |
name: macos | |
runner: macos-latest | |
manager: pnpm | |
example: kitchen-sink | |
- os: | |
name: ubuntu | |
runner: ubuntu-latest | |
manager: pnpm | |
example: with-svelte | |
- os: | |
name: macos | |
runner: macos-latest | |
manager: pnpm | |
example: with-svelte | |
runs-on: ${{ matrix.os.runner }} | |
steps: | |
# Used by scripts/check-examples.sh | |
- name: Install Sponge | |
shell: bash | |
run: | | |
if [ "$RUNNER_OS" == "Linux" ]; then | |
sudo apt-get install -y moreutils | |
else | |
brew install moreutils | |
fi | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup-turborepo-environment | |
with: | |
target: ${{ matrix.os.name }} | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- name: Setup Pnpm | |
uses: pnpm/action-setup@v2.2.4 | |
with: | |
version: 7.2.1 | |
- name: Make sure pnpm always has a cache | |
shell: bash | |
run: | | |
mkdir -p `pnpm store path` | |
- name: Disable corepack | |
shell: bash | |
run: corepack disable | |
- name: Setup Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: 16 | |
cache: ${{ matrix.manager }} | |
cache-dependency-path: package.json | |
- name: Check \"${{ matrix.example }}\" example with \"${{ matrix.manager }}\" | |
shell: bash | |
env: | |
FORCE_COLOR: true | |
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} | |
TURBO_TEAM: ${{ secrets.TURBO_TEAM }} | |
TURBO_REMOTE_ONLY: true | |
run: turbo run test --filter="turborepo-tests-examples" -- "${{ matrix.example }}" "${{ matrix.manager }}" | |
rust_prepare: | |
name: Check rust crates | |
runs-on: ubuntu-latest-16-core-oss | |
needs: determine_jobs | |
if: needs.determine_jobs.outputs.rust == 'true' | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Setup Go | |
uses: ./.github/actions/setup-go | |
with: | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- name: Setup Rust | |
uses: ./.github/actions/setup-rust | |
with: | |
save-cache: true | |
- name: Run cargo check | |
uses: actions-rs/cargo@v1 | |
with: | |
command: check | |
args: --workspace --all-targets --locked --features rustls-tls | |
rust_lint: | |
needs: [determine_jobs, rust_prepare] | |
if: needs.determine_jobs.outputs.rust == 'true' | |
name: Rust linting | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Setup Rust | |
uses: ./.github/actions/setup-rust | |
with: | |
components: rustfmt | |
- name: Run cargo fmt check | |
run: | | |
cargo fmt --check | |
- name: Check Cargo.toml formatting (taplo) | |
run: npx @taplo/cli format --check | |
- name: Check licenses | |
uses: EmbarkStudios/cargo-deny-action@v1 | |
with: | |
command: check licenses | |
rust_check: | |
needs: [determine_jobs, rust_prepare] | |
if: needs.determine_jobs.outputs.rust == 'true' | |
name: Rust check / clippy | |
runs-on: ubuntu-latest-16-core-oss | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Setup Rust | |
uses: ./.github/actions/setup-rust | |
with: | |
components: clippy | |
targets: wasm32-unknown-unknown | |
- name: Setup Go | |
uses: ./.github/actions/setup-go | |
with: | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- name: Run cargo check release | |
run: | | |
cargo check --workspace --all-targets --release --features rustls-tls | |
- name: Run cargo clippy | |
run: | | |
cargo clippy --workspace --all-targets --features rustls-tls | |
- name: Count clippy warnings | |
run: | | |
count="0" | |
clippy_output="$(cargo clippy --workspace --all-targets --features rustls-tls 2>&1)" | |
# Clippy will be invoked and report on each crate individually. We need to sum manually. | |
for warnings in $(echo "$clippy_output" | sed -n 's/.*generated \([0-9]*\) warnings\?$/\1/p'); do | |
count=$((count + warnings)) | |
done | |
echo "$count" > clippy-warnings | |
echo "$count clippy warnings" | |
echo "$clippy_output" > clippy-warnings-raw | |
- name: Cache clippy warnings | |
id: expected-clippy-warnings | |
uses: actions/cache@v3 | |
with: | |
path: | | |
expected-clippy-warnings | |
expected-clippy-warnings-raw | |
key: expected-clippy-warnings-${{ github.sha }} | |
restore-keys: | | |
expected-clippy-warnings | |
- name: Update expected Clippy warnings on main | |
if: github.ref == 'refs/heads/main' | |
run: | | |
mv clippy-warnings expected-clippy-warnings | |
mv clippy-warnings-raw expected-clippy-warnings-raw | |
- name: Check the number of Clippy warnings is ever decreasing | |
if: github.ref != 'refs/heads/main' | |
run: | | |
if [[ -f "expected-clippy-warnings" ]]; then | |
clippy_warnings=$(cat clippy-warnings) | |
expected_clippy_warnings=$(cat expected-clippy-warnings) | |
if [[ "$clippy_warnings" -gt "$expected_clippy_warnings" ]]; then | |
echo "Clippy reported $clippy_warnings warnings, which is higher than the upstream number of $expected_clippy_warnings warnings." | |
echo "Please make sure you've run \`cargo clippy\` on the Rust files you've modified." | |
if [[ -f "expected-clippy-warnings-raw" ]]; then | |
diff clippy-warnings-raw expected-clippy-warnings-raw | |
fi | |
exit 1 | |
fi | |
fi | |
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: ubuntu-latest-8-core-oss | |
permissions: | |
pull-requests: write | |
steps: | |
- name: Setup Rust | |
uses: dtolnay/rust-toolchain@stable | |
- name: tune linux network | |
run: sudo ethtool -K eth0 tx off rx off | |
- name: Checkout Next.js | |
uses: actions/checkout@v3 | |
with: | |
repository: vercel/next.js | |
- name: Build next-swc | |
continue-on-error: true | |
env: | |
CARGO_TERM_COLOR: never | |
run: | | |
export TURBOPACK_REMOTE="https://github.com/vercel/turbo" | |
# Apply patches to the cargo to the latest turbopack's sha. | |
export BINDING=$(printf 'patch."%s".%s.git="%s?rev=%s"' "$TURBOPACK_REMOTE" "turbo-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") | |
cd packages/next-swc | |
cargo check --config $BINDING --config $TASKS --config $TASKS_FS --all -p next-swc-api -p next-dev --no-default-features --features cli,custom_allocator,rustls-tls,__internal_nextjs_integration_test --message-format short --quiet &> cargo_output.log | |
- name: Post logs if there are errors | |
run: | | |
cp packages/next-swc/cargo_output.log ./cargo_output.log | |
if grep 'error: could not compile' ./cargo_output.log; then (printf "This change may fail to build \`next-swc\`. \n\n\`\`\`\n"; cat ./cargo_output.log; printf "\`\`\`\n") > out.log; else printf ":white_check_mark: This change can build \`next-swc\`" > out.log; fi | |
- name: PR comment with file | |
uses: thollander/actions-comment-pull-request@v2 | |
if: 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: [determine_jobs, rust_prepare] | |
# We test dependency changes only on main | |
if: needs.determine_jobs.outputs.turborepo == 'true' || needs.determine_jobs.outputs.cargo_on_main == 'true' | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- name: ubuntu | |
runner: ubuntu-latest-16-core-oss | |
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 Rust | |
uses: ./.github/actions/setup-rust | |
with: | |
save-cache: true | |
- name: Setup Protoc | |
uses: arduino/setup-protoc@v1 | |
with: | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Run tests | |
timeout-minutes: 120 | |
# We exclude turbo as it requires linking Go and all logic resides in turborepo-lib | |
run: | | |
cargo tr-test | |
turbopack_rust_test1: | |
needs: [determine_jobs, rust_prepare] | |
if: needs.determine_jobs.outputs.turbopack == 'true' || needs.determine_jobs.outputs.cargo_on_main == 'true' | |
runs-on: ubuntu-latest-16-core-oss | |
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 | |
- name: Setup Node.js | |
uses: ./.github/actions/setup-node | |
- 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@nextest | |
- name: Build nextest | |
timeout-minutes: 120 | |
run: | | |
cargo tp-pre-test | |
- name: Run nextest | |
timeout-minutes: 120 | |
run: | | |
cargo tp-test | |
turbopack_rust_test2: | |
needs: [determine_jobs, rust_prepare] | |
if: needs.determine_jobs.outputs.turbopack == 'true' || needs.determine_jobs.outputs.cargo_on_main == 'true' | |
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: Setup Rust | |
uses: ./.github/actions/setup-rust | |
with: | |
save-cache: true | |
- name: Setup Node.js | |
uses: ./.github/actions/setup-node | |
- name: Setup Protoc | |
uses: arduino/setup-protoc@v1 | |
with: | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
- 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@nextest | |
- name: Build nextest | |
timeout-minutes: 120 | |
run: | | |
cargo tp-pre-test | |
- name: Run nextest | |
timeout-minutes: 120 | |
run: | | |
cargo tp-test | |
turbopack_rust_test_bench1: | |
needs: [determine_jobs, rust_prepare] | |
if: needs.determine_jobs.outputs.turbopack == 'true' || needs.determine_jobs.outputs.cargo_on_main == 'true' | |
runs-on: ubuntu-latest-16-core-oss | |
name: Turbopack Rust testing benchmarks on ubuntu | |
env: | |
TURBOPACK_BENCH_COUNTS: "100" | |
TURBOPACK_BENCH_PROGRESS: "1" | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Setup Rust | |
uses: ./.github/actions/setup-rust | |
with: | |
save-cache: true | |
- name: Setup Go | |
uses: ./.github/actions/setup-go | |
with: | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- name: Setup Node.js | |
uses: ./.github/actions/setup-node | |
with: | |
node-version: 16 | |
- name: Build benchmarks for tests | |
timeout-minutes: 120 | |
run: | | |
cargo tp-bench-test --no-run | |
- name: Run cargo test on benchmarks | |
timeout-minutes: 120 | |
run: | | |
cargo tp-bench-test | |
- name: Build benchmarks for tests for other bundlers | |
if: needs.determine_jobs.outputs.turbopack_bench == 'true' | |
timeout-minutes: 120 | |
run: | | |
cargo test --benches --release -p turbopack-bench --no-run | |
- name: Run cargo test on benchmarks for other bundlers | |
if: needs.determine_jobs.outputs.turbopack_bench == 'true' | |
timeout-minutes: 120 | |
run: | | |
cargo test --benches --release -p turbopack-bench | |
turbopack_rust_test_bench2: | |
needs: [determine_jobs, rust_prepare] | |
if: needs.determine_jobs.outputs.turbopack == 'true' || needs.determine_jobs.outputs.cargo_on_main == 'true' | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- name: macos | |
runner: macos-latest | |
# Temporarily disable windows bench due to consistent timeouts | |
# - name: windows | |
# runner: windows-2019 | |
runs-on: ${{ matrix.os.runner }} | |
name: Turbopack Rust testing benchmarks on ${{ matrix.os.name }} | |
env: | |
TURBOPACK_BENCH_COUNTS: "100" | |
TURBOPACK_BENCH_PROGRESS: "1" | |
steps: | |
- name: Set git to use LF | |
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 Rust | |
uses: ./.github/actions/setup-rust | |
with: | |
save-cache: true | |
- name: Setup Go | |
uses: ./.github/actions/setup-go | |
with: | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- name: Setup Node.js | |
uses: ./.github/actions/setup-node | |
with: | |
node-version: 16 | |
- name: Build benchmarks for tests | |
timeout-minutes: 120 | |
run: | | |
cargo test --benches --release --workspace --exclude turbopack-bench --no-run | |
- name: Run cargo test on benchmarks | |
timeout-minutes: 120 | |
run: | | |
cargo test --benches --release --workspace --exclude turbopack-bench | |
- name: Build benchmarks for tests for other bundlers | |
if: needs.determine_jobs.outputs.turbopack_bench == 'true' | |
timeout-minutes: 120 | |
run: | | |
cargo test --benches --release -p turbopack-bench --no-run | |
- name: Run cargo test on benchmarks for other bundlers | |
if: needs.determine_jobs.outputs.turbopack_bench == 'true' | |
timeout-minutes: 120 | |
run: | | |
cargo test --benches --release -p turbopack-bench | |
rust_bench: | |
needs: [determine_jobs, rust_prepare] | |
if: (needs.determine_jobs.outputs.rust == 'true' && needs.determine_jobs.outputs.push == 'true') || needs.determine_jobs.outputs.turbopack_bench == 'true' | |
strategy: | |
fail-fast: false | |
matrix: | |
bench: | |
# One of Turbopack with 1000 modules is benchmarked in every run | |
# to create a baseline result for normalization (should the runners performance vary between jobs) | |
# This runs all the non next-dev benchmarks | |
- name: generic | |
cache_key: all | |
args: --workspace --exclude turbopack-bench | |
# This measures Turbopack with small app | |
- name: turbopack | |
cache_key: turbopack-cli | |
args: -p turbopack-cli | |
TURBOPACK_BENCH_COUNTS: 100,500,1000 | |
# This measures Turbopack with normal apps | |
- name: turbopack-large | |
cache_key: turbopack-cli | |
args: -p turbopack-cli | |
TURBOPACK_BENCH_COUNTS: 1000,2000,3000 | |
# This measures Turbopack with larger apps | |
- name: turbopack-xlarge | |
cache_key: turbopack-cli | |
args: -p turbopack-cli | |
TURBOPACK_BENCH_COUNTS: 1000,5000 | |
# This measures Turbopack with huge apps | |
- name: turbopack-xxlarge | |
cache_key: turbopack-cli | |
args: -p turbopack-cli | |
TURBOPACK_BENCH_COUNTS: 1000,10000 | |
runs-on: ubuntu-latest-8-core-oss | |
name: Benchmark on ${{ matrix.bench.name }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Setup Go | |
uses: ./.github/actions/setup-go | |
with: | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- name: Setup Node.js | |
uses: ./.github/actions/setup-node | |
- name: Setup Rust | |
uses: ./.github/actions/setup-rust | |
with: | |
shared-cache-key: benchmark-${{ matrix.bench.cache_key }} | |
save-cache: true | |
- name: Clear benchmarks | |
run: rm -rf target/criterion | |
- name: Compile cargo benches | |
run: cargo bench --no-run ${{ matrix.bench.args }} | |
- name: Run cargo bench | |
timeout-minutes: 180 | |
run: cargo bench ${{ matrix.bench.args }} | |
env: | |
TURBOPACK_BENCH_COUNTS: ${{ matrix.bench.TURBOPACK_BENCH_COUNTS }} | |
- name: Install critcmp | |
if: always() | |
uses: baptiste0928/cargo-install@v1 | |
with: | |
crate: critcmp | |
- name: Compare results | |
if: always() | |
run: critcmp --group "([^/]+/)[^/]+(?:/)(.+)" base | |
- name: Export results | |
if: always() | |
run: critcmp --export base > raw.json | |
- name: Upload results | |
if: always() | |
uses: actions/upload-artifact@v3 | |
with: | |
name: bench_${{ matrix.bench.name }} | |
path: raw.json | |
# This avoids putting this data into the rust-cache | |
- name: Clear benchmarks | |
run: rm -rf target/criterion | |
rust_bench_commit: | |
needs: [determine_jobs, rust_bench] | |
if: always() && needs.determine_jobs.outputs.rust == 'true' && needs.determine_jobs.outputs.push == 'true' | |
name: Store benchmark result | |
runs-on: ubuntu-latest | |
permissions: | |
contents: write | |
steps: | |
- name: Get current date | |
id: date | |
run: | | |
echo "year=$(date +'%Y')" >> $GITHUB_OUTPUT | |
echo "month=$(date +'%m')" >> $GITHUB_OUTPUT | |
echo "date=$(date +'%s')" >> $GITHUB_OUTPUT | |
echo "pretty=$(date +'%Y-%m-%d %H:%M')" >> $GITHUB_OUTPUT | |
- name: Checkout benchmark-data | |
uses: actions/checkout@v3 | |
with: | |
ref: benchmark-data | |
- name: Download benchmark data | |
uses: actions/download-artifact@v3 | |
with: | |
path: artifacts | |
- name: Copy benchmark results | |
run: | | |
find artifacts -size 0 -delete | |
mkdir -p data/${{ steps.date.outputs.year }}/${{ steps.date.outputs.month }}/ubuntu-latest-8-core/${{ steps.date.outputs.date }}-${{ github.sha }}/ | |
mv artifacts/bench_* data/${{ steps.date.outputs.year }}/${{ steps.date.outputs.month }}/ubuntu-latest-8-core/${{ steps.date.outputs.date }}-${{ github.sha }}/ | |
- name: Git pull | |
run: git pull --depth=1 --no-tags origin benchmark-data | |
- name: Push data to branch | |
if: needs.determine_jobs.outputs.main_push == 'true' | |
uses: stefanzweifel/git-auto-commit-action@v4 | |
with: | |
file_pattern: data/** | |
commit_message: Benchmark result for ${{ steps.date.outputs.pretty }} (${{ github.sha }}) | |
turbopack_build_release: | |
needs: [determine_jobs, rust_prepare] | |
if: needs.determine_jobs.outputs.turbopack == 'true' && needs.determine_jobs.outputs.push == 'true' | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- name: ubuntu-latest-16-core-oss | |
target: x86_64-unknown-linux-musl | |
- name: macos-latest | |
target: x86_64-apple-darwin | |
- name: macos-latest | |
target: aarch64-apple-darwin | |
- name: ubuntu-latest-16-core-oss | |
target: x86_64-pc-windows-msvc | |
runs-on: ${{ matrix.os.name }} | |
name: Rust building release for ${{ matrix.os.target }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Setup Rust | |
uses: ./.github/actions/setup-rust | |
with: | |
components: ${{ matrix.os.target == 'x86_64-pc-windows-msvc' && 'llvm-tools-preview' || '' }} | |
targets: ${{ matrix.os.target }} | |
cache-key: ${{ matrix.os.target }} | |
save-cache: true | |
- name: Install musl tools | |
run: | | |
wget https://github.com/napi-rs/napi-rs/releases/download/linux-musl-cross%4011.2.1/x86_64-linux-musl-native.tgz -O musl.tgz | |
tar -xvzf musl.tgz | |
sudo mv x86_64-linux-musl-native /usr/x86_64-linux-musl | |
sudo ln -sf /usr/x86_64-linux-musl/bin/x86_64-linux-musl-cc /usr/bin/musl-gcc | |
sudo ln -sf /usr/x86_64-linux-musl/bin/x86_64-linux-musl-g++ /usr/bin/musl-g++ | |
if: matrix.os.target == 'x86_64-unknown-linux-musl' | |
- name: Install Cargo xwin toolchain | |
if: matrix.os.target == 'x86_64-pc-windows-msvc' | |
uses: baptiste0928/cargo-install@v1 | |
with: | |
crate: cargo-xwin | |
- name: Build node-file-trace | |
if: matrix.os.target != 'x86_64-pc-windows-msvc' | |
run: | | |
cargo build --release -p node-file-trace --target ${{ matrix.os.target }} | |
- name: Build node-file-trace | |
if: matrix.os.target == 'x86_64-pc-windows-msvc' | |
run: | | |
cargo xwin build --release -p node-file-trace --target ${{ matrix.os.target }} | |
- name: Build turbopack-cli (native-tls) | |
if: matrix.os.target != 'x86_64-pc-windows-msvc' && matrix.os.target != 'x86_64-unknown-linux-musl' | |
run: | | |
cargo build --release -p turbopack-cli --target ${{ matrix.os.target }} | |
- name: Build turbopack-cli (rustls-tls) | |
if: matrix.os.target == 'x86_64-unknown-linux-musl' | |
run: | | |
cargo build --release -p turbopack-cli --target ${{ matrix.os.target }} --no-default-features --features custom_allocator,rustls-tls | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: release-${{ matrix.os.target }} | |
path: | | |
target/${{ matrix.os.target }}/release/turbopack-cli | |
target/${{ matrix.os.target }}/release/turbopack-cli.exe | |
turbopack_bench_pr: | |
needs: [determine_jobs, rust_prepare] | |
if: needs.determine_jobs.outputs.turbopack == 'true' && github.event_name == 'pull_request' | |
name: Benchmark and compare Turbopack performance on ${{ matrix.os.title }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- name: linux | |
title: Linux | |
quiet: false | |
runner: ubuntu-latest-16-core-oss | |
- name: macos | |
title: MacOS | |
quiet: true | |
runner: macos-latest | |
- name: windows | |
title: Windows | |
quiet: true | |
runner: windows-latest | |
runs-on: ${{ matrix.os.runner }} | |
permissions: | |
contents: read | |
pull-requests: write | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Fetch the base branch | |
run: git -c protocol.version=2 fetch --no-tags --progress --no-recurse-submodules --depth=1 origin +${{ github.base_ref }}:base | |
- name: Setup Go | |
uses: ./.github/actions/setup-go | |
with: | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- name: Setup Node.js | |
uses: ./.github/actions/setup-node | |
- name: Setup Rust | |
uses: ./.github/actions/setup-rust | |
with: | |
shared-cache-key: benchmark-${{ matrix.os.name }} | |
- name: Benchmark and compare with base branch | |
uses: sokra/criterion-compare-action@main | |
timeout-minutes: 180 | |
with: | |
branchName: base | |
title: ${{ matrix.os.title }} Benchmark | |
quiet: ${{ matrix.os.quiet }} | |
cwd: crates/turbopack-cli | |
format_lint: | |
name: Formatting | |
runs-on: ubuntu-latest | |
needs: determine_jobs | |
if: needs.determine_jobs.outputs.format == 'true' | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup-turborepo-environment | |
with: | |
target: ubuntu | |
github-token: "${{ secrets.GITHUB_TOKEN }}" | |
- name: Format check | |
# This is the syntax for running the `//#lint` task specifically in turbo.json | |
# It runs the taplo check on taplo.toml, and prettier check across the whole repo. | |
# TODO: run prettier in individual workspaces instead of globally. | |
run: turbo run lint --filter=// | |
final: | |
name: Ok | |
needs: | |
- determine_jobs | |
- go_lint | |
- go_unit | |
- go_examples | |
- go_e2e | |
- go_integration | |
- rust_prepare | |
- rust_lint | |
- rust_check | |
- turbopack_rust_test1 | |
- turborepo_rust_test | |
- turbopack_rust_test_bench1 | |
- turbopack_build_release | |
- 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.go_lint.result}} "Go lints" | |
subjob ${{needs.go_unit.result}} "Go unit tests" | |
subjob ${{needs.go_examples.result}} "Go examples" | |
subjob ${{needs.go_e2e.result}} "Go e2e tests" | |
subjob ${{needs.go_integration.result}} "Go integration tests" | |
subjob ${{needs.rust_prepare.result}} "Rust prepare" | |
subjob ${{needs.rust_lint.result}} "Rust lints" | |
subjob ${{needs.rust_check.result}} "Rust checks" | |
subjob ${{needs.turbopack_rust_test1.result}} "Turbopack Rust tests (linux)" | |
subjob ${{needs.turborepo_rust_test.result}} "TurboRepo Rust tests" | |
subjob ${{needs.turbopack_rust_test_bench1.result}} "Turbopack Rust benchmark tests (linux)" | |
subjob ${{needs.turbopack_build_release.result}} "Turbopack Release Build" | |
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 "## :warning: CI failed :warning:" > 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 "## :green_circle: CI likely successful :green_circle:" > 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 | |
done: | |
name: Done | |
needs: | |
- final | |
- determine_jobs | |
- go_lint | |
- go_unit | |
- go_examples | |
- go_e2e | |
- go_integration | |
- rust_prepare | |
- rust_lint | |
- rust_check | |
- turbopack_rust_test1 | |
- turbopack_rust_test2 | |
- turborepo_rust_test | |
- turbopack_rust_test_bench1 | |
- turbopack_rust_test_bench2 | |
- turbopack_build_release | |
- rust_bench | |
- 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.go_lint.result}} "Go lints" | |
subjob ${{needs.go_unit.result}} "Go unit tests" | |
subjob ${{needs.go_examples.result}} "Go examples" | |
subjob ${{needs.go_e2e.result}} "Go e2e tests" | |
subjob ${{needs.go_integration.result}} "Go integration tests" | |
subjob ${{needs.rust_prepare.result}} "Rust prepare" | |
subjob ${{needs.rust_lint.result}} "Rust lints" | |
subjob ${{needs.rust_check.result}} "Rust checks" | |
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.turborepo_rust_test.result}} "TurboRepo Rust tests" | |
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.format_lint.result}} "Formatting" | |
subjob ${{needs.rust_bench.result}} "Turbopack Rust benchmarks (non-blocking)" | |
subjob ${{needs.turbopack_build_release.result}} "Turbopack Release Build" | |
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 "## :warning: CI failed :warning:" > 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 "## :green_circle: CI successful :green_circle:" > 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 |