Skip to content

build(cargo): skip external build script with rust-analyzer #13720

build(cargo): skip external build script with rust-analyzer

build(cargo): skip external build script with rust-analyzer #13720

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: |
## :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: 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 Go related changes
id: turborepo_go
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
cli/**
- name: Turborepo integration tests changes
id: turborepo_integration
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
turborepo-tests/integration/**
turborepo-tests/helpers/**
- name: Turborepo e2e tests changes
id: turborepo_e2e
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
turborepo-tests/e2e/**
turborepo-tests/helpers/**
- name: Examples related changes
id: examples
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
examples/**
examples-tests/**
!**.md
!**.mdx
- name: Turborepo JS Package related changes
id: turborepo_js
uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
packages/**
- 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_go_unit: ${{ steps.ci.outputs.diff != '' || steps.turborepo_go.outputs.diff != '' || steps.turborepo_rust.outputs.diff != '' }}
turborepo_go_lint: ${{ steps.ci.outputs.diff != '' || steps.turborepo_go.outputs.diff != ''}}
turborepo_build: ${{ steps.ci.outputs.diff != '' || steps.turborepo_go.outputs.diff != '' || steps.turborepo_rust.outputs.diff != '' || steps.turborepo_integration.outputs.diff != '' || steps.turborepo_e2e.outputs.diff != ''}}
turborepo_e2e: ${{ steps.ci.outputs.diff != '' || steps.turborepo_go.outputs.diff != '' || steps.turborepo_rust.outputs.diff != '' || steps.turborepo_e2e.outputs.diff != '' }}
turborepo_integration: ${{ steps.ci.outputs.diff != '' || steps.turborepo_go.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 != '' }}
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: ubuntu-latest
- 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 }}"
- run: turbo run build --filter=cli --color --env-mode=strict --token=${{ secrets.TURBO_TOKEN }} --team=${{ vars.TURBO_TEAM }}
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 }}
go_lint:
name: Go linting
runs-on: ubuntu-latest
needs: determine_jobs
if: needs.determine_jobs.outputs.turborepo_go_lint == '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.turborepo_go_unit == 'true'
timeout-minutes: 45
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:
windows: ${{ matrix.os.name == 'windows' }}
github-token: "${{ secrets.GITHUB_TOKEN }}"
- run: turbo run test --filter=cli --color
turborepo_integration:
name: Turborepo Integration Tests
needs: [determine_jobs, build_turborepo]
if: needs.determine_jobs.outputs.turborepo_integration == '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
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/setup-turborepo-environment
with:
windows: ${{ matrix.os.name == 'windows' }}
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 --color --env-mode=strict --token=${{ secrets.TURBO_TOKEN }} --team=${{ vars.TURBO_TEAM }}
turborepo_integration_rust:
name: Turborepo Integration Tests (Rust Codepath)
needs: [determine_jobs, build_turborepo]
if: needs.determine_jobs.outputs.turborepo_integration == 'true'
timeout-minutes: 30
runs-on: ${{ matrix.os.runner }}
strategy:
fail-fast: false
matrix:
os:
- name: ubuntu
runner: ubuntu-latest
# TODO: enable macos when --experimental-rust-codepath is passing all tests on ubuntu
# - name: macos
# runner: macos-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:rust-codepath --filter=turborepo-tests-integration --color --env-mode=strict --token=${{ secrets.TURBO_TOKEN }} --team=${{ vars.TURBO_TEAM }}
turborepo_e2e:
name: Turborepo E2E Tests
needs: [determine_jobs, build_turborepo]
if: needs.determine_jobs.outputs.turborepo_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:
windows: ${{ matrix.os.name == 'windows' }}
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: E2E Tests
run: turbo run test --filter=turborepo-tests-e2e --remote-only --token=${{ secrets.TURBO_TOKEN }} --team=${{ vars.TURBO_TEAM }} --color --env-mode=strict
turborepo_examples:
name: Turborepo Examples
needs: [determine_jobs]
if: needs.determine_jobs.outputs.examples == 'true'
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
os:
- name: ubuntu
runner: ubuntu-latest
- name: macos
runner: macos-latest
runs-on: ${{ matrix.os.runner }}
steps:
- name: Checkout
uses: actions/checkout@v3
# Note: the setup-node action inside this is somehow required for
# the node setup below this step. Not sure why.
- uses: ./.github/actions/setup-turborepo-environment
with:
windows: ${{ matrix.os.name == 'windows' }}
github-token: "${{ secrets.GITHUB_TOKEN }}"
# TODO: .github/actions/setup-node is pretty similar to the following
# steps (Setup Pnpm, pnpm cache, corepack, setup node), but it didn't
# work out of box. We should take another stab at it later.
- name: Setup Pnpm
uses: pnpm/action-setup@v2.2.4
- name: Make sure pnpm always has a cache
shell: bash
run: |
mkdir -p `pnpm store path`
# 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
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 18
cache: ${{ matrix.manager }}
cache-dependency-path: package.json
- name: Check examples
shell: bash
# Note: using CLI flags instead of env vars because
# envs var would apply to the actual tests that exercise turbo also,
# making test output non-deterministic.
run: turbo run example-test --color --remote-only --token=${{ secrets.TURBO_TOKEN }} --team=${{ vars.TURBO_TEAM }} --env-mode=strict
# Re-enable corepack, actions/setup-node invokes other package managers and
# that causes corepack to throw an error, so we disable it here. The "Post" step
# for actions/setup-node will run at the end of this job, so we need to prep for it.
- 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]
runs-on: ${{ matrix.os.runner }}
strategy:
fail-fast: false
matrix:
os:
- name: ubuntu
runner: ubuntu-latest
- 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
run: |
turbo run check-types test --filter={./packages/*}...[${{ github.event.pull_request.base.sha || 'HEAD^1' }}] --color
turbopack_typescript:
name: Turbopack TypeScript files
runs-on: ubuntu-latest
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: 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
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: 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: Setup capnproto
uses: ./.github/actions/setup-capnproto
- 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: 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: Setup capnproto
uses: ./.github/actions/setup-capnproto
- 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: 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: |
RUSTFLAGS="-D warnings -A deprecated" cargo groups check turbopack --features rustls-tls --release
turbopack_rust_clippy:
needs: [turbopack_rust_check]
name: Turbopack rust 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 clippy
run: |
RUSTFLAGS="-D warnings -A deprecated -Aclippy::too_many_arguments" 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: ubuntu-latest-8-core-oss
permissions:
pull-requests: write
steps:
- 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: Setup Rust
uses: ./.github/actions/setup-rust
- 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 custom_allocator,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 "\
:warning: 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: 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 capnproto
uses: ./.github/actions/setup-capnproto
- name: Setup Protoc
uses: arduino/setup-protoc@v1
with:
repo-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: 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
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@nextest
- 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: Setup Rust
uses: ./.github/actions/setup-rust
with:
save-cache: true
- name: Setup Node.js
uses: ./.github/actions/setup-node
with:
node-version: 18
- 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 (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
format_lint:
name: Formatting
runs-on: ubuntu-latest
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:
# - `cli` because it runs golangci-lint and this Job doesn't have all the dependencies for that.
# - Other `@vercel/*` packages because ??
run: turbo run lint --filter=!cli --filter=!@vercel/devlow-bench --filter=!@vercel/experimental-nft-next-plugin --filter=!@vercel/experimental-nft-next-plugin --filter=!turbopack-bump-action --filter=!next-integration-stat
final:
name: Ok
needs:
- determine_jobs
- go_lint
- go_unit
- turborepo_examples
- turborepo_e2e
- turborepo_integration
- js_packages
- rust_lint
- turborepo_rust_check
- turborepo_rust_clippy
- turbopack_rust_check
- turbopack_rust_clippy
- turbopack_rust_test1
- 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.go_lint.result}} "Go lints"
subjob ${{needs.go_unit.result}} "Go unit tests"
subjob ${{needs.turborepo_examples.result}} "Turborepo examples"
subjob ${{needs.turborepo_e2e.result}} "Go e2e tests"
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_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 "## :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
# 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
- go_lint
- go_unit
- turborepo_examples
- turborepo_e2e
- turborepo_integration
- rust_lint
- turborepo_rust_check
- turborepo_rust_clippy
- turbopack_rust_check
- turbopack_rust_clippy
- turbopack_rust_test1
- turbopack_rust_test2
- 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.go_lint.result}} "Go lints"
subjob ${{needs.go_unit.result}} "Go unit tests"
subjob ${{needs.turborepo_examples.result}} "Turborepo examples"
subjob ${{needs.turborepo_e2e.result}} "Turborepo e2e tests"
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_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 "## :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