name: Build Reusable on: workflow_call: inputs: afterBuild: required: false description: 'additional steps to run' type: string # Toggles the mold linker. The default linker is much slower and can run into OOMs. # However, custom linkers won't work for wasm. mold: required: false description: 'whether to use the mold linker' type: string skipInstallBuild: required: false description: 'whether to skip pnpm install && pnpm build' type: string skipNativeBuild: required: false description: 'whether to skip building native modules' type: string skipForDocsOnly: required: false description: 'skip for docs only changes' type: string skipForRelease: required: false description: 'skip for release' type: string nodeVersion: required: false description: 'version of Node.js to use' type: string needsRust: required: false description: 'if rust is needed' type: string needsNextest: required: false description: 'if nextest rust dep is needed' type: string uploadSwcArtifact: required: false description: 'if swc artifact needs uploading' type: string uploadTestTrace: required: false description: 'if test trace needs uploading' type: string rustCacheKey: required: false description: 'rustCacheKey to cache shared target assets' type: string env: NAPI_CLI_VERSION: 2.14.7 TURBO_VERSION: 1.10.9 NODE_LTS_VERSION: 20 TEST_CONCURRENCY: 8 # disable backtrace for test snapshots RUST_BACKTRACE: 0 TURBO_TEAM: 'vercel' TURBO_REMOTE_ONLY: 'true' 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 DATADOG_API_KEY: ${{ secrets.DATA_DOG_API_KEY }} DATADOG_TRACE_NEXTJS_TEST: 'true' DD_ENV: 'ci' TEST_TIMINGS_TOKEN: ${{ secrets.TEST_TIMINGS_TOKEN }} NEXT_TEST_JOB: 1 jobs: build: timeout-minutes: 15 runs-on: - 'self-hosted' - 'linux' - 'x64' - 'metal' steps: - run: fnm use --install-if-missing ${{ inputs.nodeVersion || env.NODE_LTS_VERSION }} - run: node -v - run: corepack enable - run: pwd - uses: actions/checkout@v3 with: fetch-depth: 25 # local action -> needs to run after checkout - name: Install Rust uses: ./.github/actions/setup-rust if: ${{ inputs.skipNativeBuild != 'yes' || inputs.needsNextest == 'yes' || inputs.needsRust == 'yes' }} with: components: rustfmt, clippy - name: 'Install mold linker' if: ${{ inputs.mold == 'yes' }} run: | sudo apt update sudo apt install -y mold echo RUSTFLAGS=${RUSTFLAGS}\ -C\ link-arg=-fuse-ld=mold >> $GITHUB_ENV - name: Install nextest if: ${{ inputs.needsNextest == 'yes' }} uses: taiki-e/install-action@nextest - run: rustc --version if: ${{ inputs.skipNativeBuild != 'yes' || inputs.needsNextest == 'yes' || inputs.needsRust == 'yes' }} - run: corepack prepare --activate yarn@1.22.19 && npm i -g "turbo@${TURBO_VERSION}" "@napi-rs/cli@${NAPI_CLI_VERSION}" - name: Cache on ${{ github.ref_name }} uses: ijjk/rust-cache@turbo-cache-v1.0.7 if: ${{ inputs.rustCacheKey }} with: cache-provider: 'turbo' save-if: ${{ github.ref_name == 'canary' }} shared-key: ${{ inputs.rustCacheKey }}-x86_64-unknown-linux-gnu-build-${{ hashFiles('.cargo/config.toml') }} # 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 - run: cargo clean if: ${{ inputs.skipNativeBuild != 'yes' || inputs.needsNextest == 'yes' || inputs.needsRust == 'yes' }} - run: echo "DOCS_CHANGE<> $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 - id: is-release run: | if [[ $(node ./scripts/check-is-release.js 2> /dev/null || :) = v* ]]; then echo "IS_RELEASE=yes" >> $GITHUB_OUTPUT else echo "IS_RELEASE=nope" >> $GITHUB_OUTPUT fi # 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 -vvv --remote-cache-timeout 90 --summarize -- --target x86_64-unknown-linux-gnu if: ${{ inputs.skipNativeBuild != 'yes' && steps.docs-change.outputs.DOCS_CHANGE == 'nope' }} - name: Upload next-swc artifact if: ${{ inputs.uploadSwcArtifact == 'yes' && steps.docs-change.outputs.DOCS_CHANGE == 'nope' }} uses: actions/upload-artifact@v3 with: name: next-swc-binary path: packages/next-swc/native/next-swc.linux-x64-gnu.node # 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') && (inputs.skipForRelease != 'yes' || steps.is-release.outputs.IS_RELEASE == 'nope')}} - name: Upload artifact uses: actions/upload-artifact@v3 with: name: turbo run summary path: .turbo/runs - name: Upload test reports artifact uses: actions/upload-artifact@v3 if: ${{ inputs.afterBuild }} with: name: Test trace reports path: | test/test-junit-report test/turbopack-test-junit-report if-no-files-found: ignore - name: Download test reports artifact id: download-test-reports uses: actions/download-artifact@v3 continue-on-error: true if: ${{ inputs.uploadTestTrace == 'yes' && (inputs.skipForDocsOnly != 'yes' || steps.docs-change.outputs.DOCS_CHANGE == 'nope') }} with: name: Test trace reports path: test - name: Upload test trace to datadog if: ${{ inputs.uploadTestTrace == 'yes' && (inputs.skipForDocsOnly != 'yes' || steps.docs-change.outputs.DOCS_CHANGE == 'nope') }} continue-on-error: true run: | ls -al ./test npm install -g junit-report-merger@6.0.2 @datadog/datadog-ci@2.14.0 @aws-sdk/property-provider@3 jrm ./nextjs-test-result-junit.xml "test/test-junit-report/**/*.xml" jrm ./turbopack-test-result-junit.xml "test/turbopack-test-junit-report/**/*.xml" # Put a separate tag for the tests with turbopack to distinguish between same test names DD_ENV=ci datadog-ci junit upload --tags test.type:nextjs --service nextjs ./nextjs-test-result-junit.xml DD_ENV=ci datadog-ci junit upload --tags test.type:turbopack --service nextjs ./turbopack-test-result-junit.xml