Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new build and test workflow #50436

Merged
merged 1 commit into from
May 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
430 changes: 430 additions & 0 deletions .github/workflows/build_and_deploy.yml.tmp

Large diffs are not rendered by default.

169 changes: 169 additions & 0 deletions .github/workflows/build_and_test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
name: build-and-test

on:
push:
branches: ['canary']
pull_request_target:
types: [opened, synchronize]

concurrency:
group: ${{ github.ref }}-build-and-test
cancel-in-progress: true

env:
NAPI_CLI_VERSION: 2.14.7
TURBO_VERSION: 1.9.6
RUST_TOOLCHAIN: nightly-2023-03-09
PNPM_VERSION: 7.24.3
NODE_MAINTENANCE_VERSION: 16
NODE_LTS_VERSION: 18
TEST_CONCURRENCY: 8
# TODO: remove after testing
# NEXT_TEST_CONTINUE_ON_ERROR: 'true'

TURBO_TEAM: 'vercel'
TURBO_REMOTE_ONLY: 'true'
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
NEXT_TELEMETRY_DISABLED: 1
# we build a dev binary for use in CI so skip downloading
# canary next-swc binaries in the monorepo
NEXT_SKIP_NATIVE_POSTINSTALL: 1
TEST_TIMINGS_TOKEN: ${{ secrets.TEST_TIMINGS_TOKEN }}
NEXT_TEST_JOB: 1

jobs:
build:
name: build
uses: vercel/next.js/.github/workflows/build_reusable.yml@ijjk/update-ci-workflow
secrets: inherit

lint:
name: lint
needs: ['build']

uses: vercel/next.js/.github/workflows/build_reusable.yml@ijjk/update-ci-workflow
with:
afterBuild: pnpm lint-no-typescript && pnpm check-examples
secrets: inherit

check-types-precompiled:
name: types and precompiled
needs: ['build']

uses: vercel/next.js/.github/workflows/build_reusable.yml@ijjk/update-ci-workflow
with:
afterBuild: pnpm types-and-precompiled
skipForDocsOnly: 'yes'
secrets: inherit

test-cargo-unit:
name: test cargo unit
needs: ['build']

uses: vercel/next.js/.github/workflows/build_reusable.yml@ijjk/update-ci-workflow
with:
skipForDocsOnly: 'yes'
skipInstallBuild: 'yes'
afterBuild: turbo run test-cargo-unit
secrets: inherit

rust-check:
name: rust check
needs: ['build']

uses: vercel/next.js/.github/workflows/build_reusable.yml@ijjk/update-ci-workflow
with:
skipForDocsOnly: 'yes'
skipInstallBuild: 'yes'
afterBuild: turbo run rust-check
secrets: inherit

test-turbopack-dev:
name: test turbopack dev
needs: ['build']
uses: vercel/next.js/.github/workflows/build_reusable.yml@ijjk/update-ci-workflow
with:
skipForDocsOnly: 'yes'
afterBuild: RUST_BACKTRACE=0 NEXT_EXTERNAL_TESTS_FILTERS="$(pwd)/packages/next-swc/crates/next-dev-tests/tests-manifest.js" __INTERNAL_NEXT_DEV_TEST_TURBO_DEV=TRUE __INTERNAL_CUSTOM_TURBOPACK_BINDINGS="$(pwd)/packages/next-swc/native/next-swc.linux-x64-gnu.node" __INTERNAL_NEXT_DEV_TEST_TURBO_GLOB_MATCH="*" NEXT_E2E_TEST_TIMEOUT=240000 NEXT_TEST_MODE=dev node run-tests.js --type development --timings -c ${TEST_CONCURRENCY}
secrets: inherit

test-next-swc-wasm:
name: test next-swc wasm
needs: ['build']

uses: vercel/next.js/.github/workflows/build_reusable.yml@ijjk/update-ci-workflow
with:
skipForDocsOnly: 'yes'
afterBuild: rustup target add wasm32-unknown-unknown && curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh && node ./scripts/normalize-version-bump.js && turbo run build-wasm -- --target nodejs --features tracing/release_max_level_info && git checkout . && mv packages/next-swc/crates/wasm/pkg packages/next-swc/crates/wasm/pkg-nodejs && node ./scripts/setup-wasm.mjs && NEXT_TEST_MODE=start TEST_WASM=true node run-tests.js test/integration/production/test/index.test.js test/e2e/streaming-ssr/index.test.ts
secrets: inherit

test-dev:
name: test dev
needs: ['build']
strategy:
fail-fast: false
matrix:
group: [1, 2, 3]

uses: vercel/next.js/.github/workflows/build_reusable.yml@ijjk/update-ci-workflow
with:
skipForDocsOnly: 'yes'
afterBuild: NEXT_TEST_MODE=dev node run-tests.js --timings -g ${{ matrix.group }}/3 -c ${TEST_CONCURRENCY} --test-pattern '^(development|e2e|unit)/.*\.test\.(js|jsx|ts|tsx)$'
secrets: inherit

test-prod:
name: test prod
needs: ['build']
strategy:
fail-fast: false
matrix:
group: [1, 2, 3]

uses: vercel/next.js/.github/workflows/build_reusable.yml@ijjk/update-ci-workflow
with:
skipForDocsOnly: 'yes'
afterBuild: NEXT_TEST_MODE=start node run-tests.js --timings -g ${{ matrix.group }}/3 -c ${TEST_CONCURRENCY} --test-pattern '^(production|e2e)/.*\.test\.(js|jsx|ts|tsx)$'
secrets: inherit

test-integration:
name: test integration
needs: ['build']
strategy:
fail-fast: false
matrix:
group: [1, 2, 3, 4, 5, 6]

uses: vercel/next.js/.github/workflows/build_reusable.yml@ijjk/update-ci-workflow
with:
skipForDocsOnly: 'yes'
afterBuild: node run-tests.js --timings -g ${{ matrix.group }}/6 -c ${TEST_CONCURRENCY} --test-pattern '^(integration)/.*\.test\.(js|jsx|ts|tsx)$'
secrets: inherit

test-firefox-safari:
name: test firefox and safari
needs: ['build']

uses: vercel/next.js/.github/workflows/build_reusable.yml@ijjk/update-ci-workflow
with:
skipForDocsOnly: 'yes'
afterBuild: pnpm playwright install && BROWSER_NAME=firefox node run-tests.js test/integration/production/test/index.test.js && BROWSER_NAME=safari NEXT_TEST_MODE=start node run-tests.js -c 1 test/integration/production/test/index.test.js test/e2e/basepath.test.ts && BROWSER_NAME=safari DEVICE_NAME='iPhone XR' node run-tests.js -c 1 test/production/prerender-prefetch/index.test.ts
secrets: inherit

tests-pass:
needs:
[
'build',
'lint',
'check-types-precompiled',
'test-dev',
'test-prod',
'test-integration',
'test-cargo-unit',
'rust-check',
'test-next-swc-wasm',
'test-turbopack-dev',
]
runs-on: [self-hosted, linux, x64]
name: thank you, next
steps:
- run: echo 'success'
117 changes: 117 additions & 0 deletions .github/workflows/build_reusable.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
name: Build Reusable

on:
workflow_call:
inputs:
afterBuild:
required: false
description: 'additional steps to run'
type: string
skipInstallBuild:
required: false
description: 'whether to skip pnpm install && pnpm build'
type: string
skipForDocsOnly:
required: false
description: 'skip for docs only changes'
type: string
nodeVersion:
required: false
description: 'version of Node.js to use'
type: string
needsNextest:
required: false
description: 'if nextest rust dep is needed'
type: string

env:
NAPI_CLI_VERSION: 2.14.7
TURBO_VERSION: 1.9.6
RUST_TOOLCHAIN: nightly-2023-03-09
PNPM_VERSION: 7.24.3
NODE_MAINTENANCE_VERSION: 16
NODE_LTS_VERSION: 18
TEST_CONCURRENCY: 8
# TODO: remove after testing
# NEXT_TEST_CONTINUE_ON_ERROR: 'true'

TURBO_TEAM: 'vercel'
TURBO_REMOTE_ONLY: 'true'
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
NEXT_TELEMETRY_DISABLED: 1
# we build a dev binary for use in CI so skip downloading
# canary next-swc binaries in the monorepo
NEXT_SKIP_NATIVE_POSTINSTALL: 1
TEST_TIMINGS_TOKEN: ${{ secrets.TEST_TIMINGS_TOKEN }}
NEXT_TEST_JOB: 1

jobs:
build:
runs-on: [self-hosted, linux, x64]

steps:
- run: fnm install ${{ inputs.nodeVersion || env.NODE_LTS_VERSION }}
- run: fnm use ${{ inputs.nodeVersion || env.NODE_LTS_VERSION }}
- run: node -v
- run: pwd

- name: Install
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: ${{ env.RUST_TOOLCHAIN }}
components: rustfmt, clippy

- name: Install nextest
if: ${{ inputs.needsNextest == 'yes' }}
uses: taiki-e/install-action@nextest

- run: rustc --version

- run: npm i -g yarn "pnpm@${PNPM_VERSION}" "turbo@${TURBO_VERSION}" "@napi-rs/cli@${NAPI_CLI_VERSION}"

- uses: actions/checkout@v3
with:
fetch-depth: 25

# clean up any previous artifacts to avoid hitting disk space limits
- run: git clean -xdf && rm -rf /tmp/next-repo-*; rm -rf /tmp/next-install-* /tmp/yarn-* /tmp/ncc-cache target && cargo clean

- run: echo "DOCS_CHANGE<<EOF" >> $GITHUB_OUTPUT; echo "$(node scripts/run-for-change.js --not --type docs --exec echo 'nope')" >> $GITHUB_OUTPUT; echo 'EOF' >> $GITHUB_OUTPUT
name: check docs only change
id: docs-change

# normalize versions before build-native for better cache hits
- run: node scripts/normalize-version-bump.js
name: normalize versions

- run: turbo run build-native-release --summarize true -- --target x86_64-unknown-linux-gnu

# undo normalize version changes for install/build
- run: git checkout .
if: ${{ inputs.skipInstallBuild != 'yes' }}

- run: pnpm store path

- run: pnpm install
if: ${{ inputs.skipInstallBuild != 'yes' }}

- run: pnpm build
if: ${{ inputs.skipInstallBuild != 'yes' }}

- run: pnpm playwright install-deps
if: ${{ inputs.skipInstallBuild != 'yes' }}

- run: pnpm playwright install chromium
if: ${{ inputs.skipInstallBuild != 'yes' }}

- run: turbo run get-test-timings -- --build ${{ github.sha }}

- run: /bin/bash -c "${{ inputs.afterBuild }}"
if: ${{inputs.skipForDocsOnly != 'yes' || steps.docs-change.outputs.DOCS_CHANGE == 'nope'}}

- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: turbo run summary
path: .turbo/runs