diff --git a/.github/workflows/ci.generate.ts b/.github/workflows/ci.generate.ts index 0943d8d9ad..725b36fa1e 100755 --- a/.github/workflows/ci.generate.ts +++ b/.github/workflows/ci.generate.ts @@ -86,6 +86,24 @@ CFLAGS=-flto=thin --sysroot=/sysroot __0`, }; +const cloneRepoStep = [{ + name: "Configure git", + run: [ + "git config --global core.symlinks true", + "git config --global fetch.parallel 32", + ].join("\n"), +}, { + name: "Clone repository", + uses: "actions/checkout@v3", + with: { + // Use depth > 1, because sometimes we need to rebuild main and if + // other commits have landed it will become impossible to rebuild if + // the checkout is too shallow. + "fetch-depth": 5, + submodules: false, + }, +}]; + const submoduleStep = (submodule: string) => ({ name: `Clone submodule ${submodule}`, run: `git submodule update --init --recursive --depth=1 -- ${submodule}`, @@ -131,36 +149,6 @@ const authenticateWithGoogleCloud = { }, }; -function cancelEarlyIfDraftPr( - nextSteps: Record[], -): Record[] { - // Couple issues with GH Actions: - // - // 1. The pull_request event type does not include the commit message, so - // there's no way to override this with a commit message without running - // the workflow. - // 2. Currently no way to early exit in GH Actions, so we need to do all these - // if conditions. Waiting on: https://github.com/actions/runner/issues/662 - // - // The solution below will only occur on draft PRs and only run the CI if the - // commit message contains [ci]. - return [ - { - name: "Cancel if draft PR", - id: "exit_early", - if: "github.event.pull_request.draft == true", - run: [ - "GIT_MESSAGE=$(git log --format=%s -n 1 ${{github.event.after}})", - "echo Commit message: $GIT_MESSAGE", - "echo $GIT_MESSAGE | grep '\\[ci\\]' || (echo 'Exiting due to draft PR. Commit with [ci] to bypass.' ; echo 'EXIT_EARLY=true' >> $GITHUB_OUTPUT)", - ].join("\n"), - }, - ...nextSteps.map((step) => - withCondition(step, "steps.exit_early.outputs.EXIT_EARLY != 'true'") - ), - ]; -} - function skipJobsIfPrAndMarkedSkip( steps: Record[], ): Record[] { @@ -175,6 +163,17 @@ function skipJobsIfPrAndMarkedSkip( ); } +function onlyIfDraftPr( + steps: Record[], +): Record[] { + return steps.map((s) => + withCondition( + s, + "github.event.pull_request.draft == true", + ) + ); +} + function withCondition( step: Record, condition: string, @@ -209,13 +208,36 @@ const ci = { "cancel-in-progress": true, }, jobs: { + // The pre_build step is used to skip running the CI on draft PRs and to not even + // start the build job. This can be overridden by adding [ci] to the commit title + pre_build: { + name: "pre-build", + "runs-on": "ubuntu-latest", + outputs: { + skip_build: "${{ steps.check.outputs.skip_build }}", + }, + steps: onlyIfDraftPr([ + ...cloneRepoStep, + { + id: "check", + run: [ + "GIT_MESSAGE=$(git log --format=%s -n 1 ${{github.event.after}})", + "echo Commit message: $GIT_MESSAGE", + "echo $GIT_MESSAGE | grep '\\[ci\\]' || (echo 'Exiting due to draft PR. Commit with [ci] to bypass.' ; echo 'skip_build=true' >> $GITHUB_OUTPUT)", + ].join("\n"), + }, + ]), + }, build: { name: "${{ matrix.job }} ${{ matrix.profile }} ${{ matrix.os }}", + needs: ["pre_build"], + if: "${{ needs.pre_build.outputs.skip_build != 'true' }}", "runs-on": "${{ matrix.runner || matrix.os }}", "timeout-minutes": 120, defaults: { run: { - // GH actions doesn't use `set -e` by default unless you specify bash + // GH actions does not fail fast by default on + // Windows, so we set bash as the default shell shell: "bash", }, }, @@ -292,570 +314,550 @@ const ci = { RUST_BACKTRACE: "full", }, steps: skipJobsIfPrAndMarkedSkip([ + ...cloneRepoStep, + submoduleStep("./test_util/std"), + submoduleStep("./third_party"), { - name: "Configure git", + ...submoduleStep("./test_util/wpt"), + if: "matrix.wpt", + }, + { + name: "Create source tarballs (release, linux)", + if: [ + "startsWith(matrix.os, 'ubuntu') &&", + "matrix.profile == 'release' &&", + "matrix.job == 'test' &&", + "github.repository == 'denoland/deno' &&", + "startsWith(github.ref, 'refs/tags/')", + ].join("\n"), run: [ - "git config --global core.symlinks true", - "git config --global fetch.parallel 32", + "mkdir -p target/release", + 'tar --exclude=".git*" --exclude=target --exclude=third_party/prebuilt \\', + " -czvf target/release/deno_src.tar.gz -C .. deno", + ].join("\n"), + }, + installRustStep, + { + if: "matrix.job == 'lint' || matrix.job == 'test'", + ...installDenoStep, + }, + ...installPythonSteps.map((s) => + withCondition(s, "matrix.job != 'lint'") + ), + { + // only necessary for benchmarks + if: "matrix.job == 'bench'", + ...installNodeStep, + }, + { + if: [ + "matrix.profile == 'release' &&", + "matrix.job == 'test' &&", + "github.repository == 'denoland/deno' &&", + "(github.ref == 'refs/heads/main' ||", + "startsWith(github.ref, 'refs/tags/'))", + ].join("\n"), + ...authenticateWithGoogleCloud, + }, + { + name: "Setup gcloud (unix)", + if: [ + "runner.os != 'Windows' &&", + "matrix.profile == 'release' &&", + "matrix.job == 'test' &&", + "github.repository == 'denoland/deno' &&", + "(github.ref == 'refs/heads/main' ||", + "startsWith(github.ref, 'refs/tags/'))", + ].join("\n"), + uses: "google-github-actions/setup-gcloud@v1", + with: { + project_id: "denoland", + }, + }, + { + name: "Setup gcloud (windows)", + if: [ + "runner.os == 'Windows' &&", + "matrix.profile == 'release' &&", + "matrix.job == 'test' &&", + "github.repository == 'denoland/deno' &&", + "(github.ref == 'refs/heads/main' ||", + "startsWith(github.ref, 'refs/tags/'))", + ].join("\n"), + uses: "google-github-actions/setup-gcloud@v1", + env: { + CLOUDSDK_PYTHON: "${{env.pythonLocation}}\\python.exe", + }, + with: { + project_id: "denoland", + }, + }, + { + name: "Configure canary build", + if: [ + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "github.ref == 'refs/heads/main'", + ].join("\n"), + run: 'echo "DENO_CANARY=true" >> $GITHUB_ENV', + }, + { + if: "matrix.use_sysroot", + ...sysRootStep, + }, + { + name: "Log versions", + run: [ + "python --version", + "rustc --version", + "cargo --version", + // Deno is installed when linting. + 'if [ "${{ matrix.job }}" == "lint" ]', + "then", + " deno --version", + "fi", + // Node is installed for benchmarks. + 'if [ "${{ matrix.job }}" == "bench" ]', + "then", + " node -v", + "fi", ].join("\n"), }, { - name: "Clone repository", - uses: "actions/checkout@v3", + name: "Cache Cargo home", + uses: "actions/cache@v3", with: { - // Use depth > 1, because sometimes we need to rebuild main and if - // other commits have landed it will become impossible to rebuild if - // the checkout is too shallow. - "fetch-depth": 5, - submodules: false, + // See https://doc.rust-lang.org/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci + path: [ + "~/.cargo/registry/index", + "~/.cargo/registry/cache", + "~/.cargo/git/db", + ].join("\n"), + key: + "20-cargo-home-${{ matrix.os }}-${{ hashFiles('Cargo.lock') }}", }, }, - ...cancelEarlyIfDraftPr([ - submoduleStep("./test_util/std"), - submoduleStep("./third_party"), - { - ...submoduleStep("./test_util/wpt"), - if: "matrix.wpt", - }, - { - name: "Create source tarballs (release, linux)", - if: [ - "startsWith(matrix.os, 'ubuntu') &&", - "matrix.profile == 'release' &&", - "matrix.job == 'test' &&", - "github.repository == 'denoland/deno' &&", - "startsWith(github.ref, 'refs/tags/')", + { + // Restore cache from the latest 'main' branch build. + name: "Restore cache build output (PR)", + uses: "actions/cache/restore@v3", + if: + "github.ref != 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')", + with: { + path: [ + "./target", + "!./target/*/gn_out", + "!./target/*/*.zip", + "!./target/*/*.tar.gz", ].join("\n"), - run: [ - "mkdir -p target/release", - 'tar --exclude=".git*" --exclude=target --exclude=third_party/prebuilt \\', - " -czvf target/release/deno_src.tar.gz -C .. deno", + key: "never_saved", + "restore-keys": prCacheKeyPrefix, + }, + }, + { + name: "Apply and update mtime cache", + if: "!startsWith(github.ref, 'refs/tags/')", + uses: "./.github/mtime_cache", + with: { + "cache-path": "./target", + }, + }, + { + // Shallow the cloning the crates.io index makes CI faster because it + // obviates the need for Cargo to clone the index. If we don't do this + // Cargo will `git clone` the github repository that contains the entire + // history of the crates.io index from github. We don't believe the + // identifier '1ecc6299db9ec823' will ever change, but if it does then this + // command must be updated. + name: "Shallow clone crates.io index", + run: [ + "if [ ! -d ~/.cargo/registry/index/github.com-1ecc6299db9ec823/.git ]", + "then", + " git clone --depth 1 --no-checkout \\", + " https://github.com/rust-lang/crates.io-index \\", + " ~/.cargo/registry/index/github.com-1ecc6299db9ec823", + "fi", + ].join("\n"), + }, + { + name: "test_format.js", + if: "matrix.job == 'lint'", + run: + "deno run --unstable --allow-write --allow-read --allow-run ./tools/format.js --check", + }, + { + name: "Lint PR title", + if: "matrix.job == 'lint' && github.event_name == 'pull_request'", + env: { + PR_TITLE: "${{ github.event.pull_request.title }}", + }, + run: 'deno run ./tools/verify_pr_title.js "$PR_TITLE"', + }, + { + name: "lint.js", + if: "matrix.job == 'lint'", + run: + "deno run --unstable --allow-write --allow-read --allow-run ./tools/lint.js", + }, + { + name: "Build debug", + if: "matrix.job == 'test' && matrix.profile == 'debug'", + run: "cargo build --locked --all-targets", + env: { CARGO_PROFILE_DEV_DEBUG: 0 }, + }, + { + name: "Build release", + if: [ + "(matrix.job == 'test' || matrix.job == 'bench') &&", + "matrix.profile == 'release' && (matrix.use_sysroot ||", + "(github.repository == 'denoland/deno' &&", + "(github.ref == 'refs/heads/main' ||", + "startsWith(github.ref, 'refs/tags/'))))", + ].join("\n"), + run: "cargo build --release --locked --all-targets", + }, + { + name: "Upload PR artifact (linux)", + if: [ + "matrix.job == 'test' &&", + "matrix.profile == 'release' && (matrix.use_sysroot ||", + "(github.repository == 'denoland/deno' &&", + "(github.ref == 'refs/heads/main' ||", + "startsWith(github.ref, 'refs/tags/'))))", + ].join("\n"), + uses: "actions/upload-artifact@v3", + with: { + name: "deno-${{ github.event.number }}", + path: "target/release/deno", + }, + }, + { + name: "Pre-release (linux)", + if: [ + "startsWith(matrix.os, 'ubuntu') &&", + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno'", + ].join("\n"), + run: [ + "cd target/release", + "zip -r deno-x86_64-unknown-linux-gnu.zip deno", + "./deno types > lib.deno.d.ts", + ].join("\n"), + }, + { + name: "Pre-release (mac)", + if: [ + "startsWith(matrix.os, 'macOS') &&", + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "(github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/'))", + ].join("\n"), + run: [ + "cd target/release", + "zip -r deno-x86_64-apple-darwin.zip deno", + ] + .join("\n"), + }, + { + name: "Pre-release (windows)", + if: [ + "startsWith(matrix.os, 'windows') &&", + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "(github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/'))", + ].join("\n"), + shell: "pwsh", + run: + "Compress-Archive -CompressionLevel Optimal -Force -Path target/release/deno.exe -DestinationPath target/release/deno-x86_64-pc-windows-msvc.zip", + }, + { + name: "Upload canary to dl.deno.land (unix)", + if: [ + "runner.os != 'Windows' &&", + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "github.ref == 'refs/heads/main'", + ].join("\n"), + run: + 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/canary/$(git rev-parse HEAD)/', + }, + { + name: "Upload canary to dl.deno.land (windows)", + if: [ + "runner.os == 'Windows' &&", + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "github.ref == 'refs/heads/main'", + ].join("\n"), + env: { + CLOUDSDK_PYTHON: "${{env.pythonLocation}}\\python.exe", + }, + run: + 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/canary/$(git rev-parse HEAD)/', + }, + { + name: "Test debug", + if: [ + "matrix.job == 'test' && matrix.profile == 'debug' &&", + "!startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'ubuntu')", + ].join("\n"), + run: "cargo test --locked", + env: { CARGO_PROFILE_DEV_DEBUG: 0 }, + }, + { + name: "Test debug (fast)", + if: [ + "matrix.job == 'test' && matrix.profile == 'debug' && ", + "!startsWith(matrix.os, 'ubuntu')", + ].join("\n"), + run: [ + // Run unit then integration tests. Skip doc tests here + // since they are sometimes very slow on Mac. + "cargo test --locked --lib", + "cargo test --locked --test '*'", + ].join("\n"), + env: { CARGO_PROFILE_DEV_DEBUG: 0 }, + }, + { + name: "Test release", + if: [ + "matrix.job == 'test' && matrix.profile == 'release' &&", + "(matrix.use_sysroot || (", + "github.repository == 'denoland/deno' &&", + "github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')))", + ].join("\n"), + run: "cargo test --release --locked", + }, + { + // Since all tests are skipped when we're building a tagged commit + // this is a minimal check to ensure that binary is not corrupted + name: "Check deno binary", + if: + "matrix.profile == 'release' && startsWith(github.ref, 'refs/tags/')", + run: 'target/release/deno eval "console.log(1+2)" | grep 3', + env: { + NO_COLOR: 1, + }, + }, + { + // Verify that the binary actually works in the Ubuntu-16.04 sysroot. + name: "Check deno binary (in sysroot)", + if: "matrix.profile == 'release' && matrix.use_sysroot", + run: 'sudo chroot /sysroot "$(pwd)/target/release/deno" --version', + }, + { + name: "Configure hosts file for WPT", + if: "matrix.wpt", + run: "./wpt make-hosts-file | sudo tee -a /etc/hosts", + "working-directory": "test_util/wpt/", + }, + { + name: "Run web platform tests (debug)", + if: "matrix.wpt && matrix.profile == 'debug'", + env: { + DENO_BIN: "./target/debug/deno", + }, + run: [ + "deno run --allow-env --allow-net --allow-read --allow-run \\", + " --allow-write --unstable \\", + " --lock=tools/deno.lock.json \\", + " ./tools/wpt.ts setup", + "deno run --allow-env --allow-net --allow-read --allow-run \\", + " --allow-write --unstable \\", + " --lock=tools/deno.lock.json \\", + ' ./tools/wpt.ts run --quiet --binary="$DENO_BIN"', + ].join("\n"), + }, + { + name: "Run web platform tests (release)", + if: "matrix.wpt && matrix.profile == 'release'", + env: { + DENO_BIN: "./target/release/deno", + }, + run: [ + "deno run --allow-env --allow-net --allow-read --allow-run \\", + " --allow-write --unstable \\", + " --lock=tools/deno.lock.json \\", + " ./tools/wpt.ts setup", + "deno run --allow-env --allow-net --allow-read --allow-run \\", + " --allow-write --unstable \\", + " --lock=tools/deno.lock.json \\", + " ./tools/wpt.ts run --quiet --release \\", + ' --binary="$DENO_BIN" \\', + " --json=wpt.json \\", + " --wptreport=wptreport.json", + ].join("\n"), + }, + { + name: "Upload wpt results to dl.deno.land", + "continue-on-error": true, + if: [ + "matrix.wpt &&", + "runner.os == 'Linux' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')", + ].join("\n"), + run: [ + "gzip ./wptreport.json", + 'gsutil -h "Cache-Control: public, max-age=3600" cp ./wpt.json gs://dl.deno.land/wpt/$(git rev-parse HEAD).json', + 'gsutil -h "Cache-Control: public, max-age=3600" cp ./wptreport.json.gz gs://dl.deno.land/wpt/$(git rev-parse HEAD)-wptreport.json.gz', + "echo $(git rev-parse HEAD) > wpt-latest.txt", + 'gsutil -h "Cache-Control: no-cache" cp wpt-latest.txt gs://dl.deno.land/wpt-latest.txt', + ].join("\n"), + }, + { + name: "Upload wpt results to wpt.fyi", + "continue-on-error": true, + if: [ + "matrix.wpt &&", + "runner.os == 'Linux' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')", + ].join("\n"), + env: { + WPT_FYI_USER: "deno", + WPT_FYI_PW: "${{ secrets.WPT_FYI_PW }}", + GITHUB_TOKEN: "${{ secrets.DENOBOT_PAT }}", + }, + run: [ + "./target/release/deno run --allow-all --lock=tools/deno.lock.json \\", + " ./tools/upload_wptfyi.js $(git rev-parse HEAD) --ghstatus", + ].join("\n"), + }, + { + name: "Run benchmarks", + if: "matrix.job == 'bench' && !startsWith(github.ref, 'refs/tags/')", + run: "cargo bench --locked", + }, + { + name: "Post Benchmarks", + if: [ + "matrix.job == 'bench' &&", + "github.repository == 'denoland/deno' &&", + "github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')", + ].join("\n"), + env: { + DENOBOT_PAT: "${{ secrets.DENOBOT_PAT }}", + }, + run: [ + "git clone --depth 1 --branch gh-pages \\", + " https://${DENOBOT_PAT}@github.com/denoland/benchmark_data.git \\", + " gh-pages", + "./target/release/deno run --allow-all --unstable \\", + " ./tools/build_benchmark_jsons.js --release", + "cd gh-pages", + 'git config user.email "propelml@gmail.com"', + 'git config user.name "denobot"', + "git add .", + 'git commit --message "Update benchmarks"', + "git push origin gh-pages", + ].join("\n"), + }, + { + name: "Build product size info", + if: + "matrix.job != 'lint' && matrix.profile != 'debug' && github.repository == 'denoland/deno' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/'))", + run: [ + 'du -hd1 "./target/${{ matrix.profile }}"', + 'du -ha "./target/${{ matrix.profile }}/deno"', + ].join("\n"), + }, + { + name: "Worker info", + if: "matrix.job == 'bench'", + run: [ + "cat /proc/cpuinfo", + "cat /proc/meminfo", + ].join("\n"), + }, + { + name: "Upload release to dl.deno.land (unix)", + if: [ + "runner.os != 'Windows' &&", + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "startsWith(github.ref, 'refs/tags/')", + ].join("\n"), + run: + 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/release/${GITHUB_REF#refs/*/}/', + }, + { + name: "Upload release to dl.deno.land (windows)", + if: [ + "runner.os == 'Windows' &&", + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "startsWith(github.ref, 'refs/tags/')", + ].join("\n"), + env: { + CLOUDSDK_PYTHON: "${{env.pythonLocation}}\\python.exe", + }, + run: + 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/release/${GITHUB_REF#refs/*/}/', + }, + { + name: "Create release notes", + if: [ + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "startsWith(github.ref, 'refs/tags/')", + ].join("\n"), + run: [ + "export PATH=$PATH:$(pwd)/target/release", + "./tools/release/05_create_release_notes.ts", + ].join("\n"), + }, + { + name: "Upload release to GitHub", + uses: "softprops/action-gh-release@v0.1.15", + if: [ + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "startsWith(github.ref, 'refs/tags/')", + ].join("\n"), + env: { + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}", + }, + with: { + files: [ + "target/release/deno-x86_64-pc-windows-msvc.zip", + "target/release/deno-x86_64-unknown-linux-gnu.zip", + "target/release/deno-x86_64-apple-darwin.zip", + "target/release/deno_src.tar.gz", + "target/release/lib.deno.d.ts", ].join("\n"), + body_path: "target/release/release-notes.md", + draft: true, }, - installRustStep, - { - if: "matrix.job == 'lint' || matrix.job == 'test'", - ...installDenoStep, - }, - ...installPythonSteps.map((s) => - withCondition(s, "matrix.job != 'lint'") - ), - { - // only necessary for benchmarks - if: "matrix.job == 'bench'", - ...installNodeStep, - }, - { - if: [ - "matrix.profile == 'release' &&", - "matrix.job == 'test' &&", - "github.repository == 'denoland/deno' &&", - "(github.ref == 'refs/heads/main' ||", - "startsWith(github.ref, 'refs/tags/'))", + }, + { + // In main branch, always create a fresh cache + name: "Save cache build output (main)", + uses: "actions/cache/save@v3", + if: + "(matrix.job == 'test' || matrix.job == 'lint') && github.ref == 'refs/heads/main'", + with: { + path: [ + "./target", + "!./target/*/gn_out", + "!./target/*/*.zip", + "!./target/*/*.tar.gz", ].join("\n"), - ...authenticateWithGoogleCloud, + key: prCacheKeyPrefix + "${{ github.sha }}", }, - { - name: "Setup gcloud (unix)", - if: [ - "runner.os != 'Windows' &&", - "matrix.profile == 'release' &&", - "matrix.job == 'test' &&", - "github.repository == 'denoland/deno' &&", - "(github.ref == 'refs/heads/main' ||", - "startsWith(github.ref, 'refs/tags/'))", - ].join("\n"), - uses: "google-github-actions/setup-gcloud@v1", - with: { - project_id: "denoland", - }, - }, - { - name: "Setup gcloud (windows)", - if: [ - "runner.os == 'Windows' &&", - "matrix.profile == 'release' &&", - "matrix.job == 'test' &&", - "github.repository == 'denoland/deno' &&", - "(github.ref == 'refs/heads/main' ||", - "startsWith(github.ref, 'refs/tags/'))", - ].join("\n"), - uses: "google-github-actions/setup-gcloud@v1", - env: { - CLOUDSDK_PYTHON: "${{env.pythonLocation}}\\python.exe", - }, - with: { - project_id: "denoland", - }, - }, - { - name: "Configure canary build", - if: [ - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "github.ref == 'refs/heads/main'", - ].join("\n"), - run: 'echo "DENO_CANARY=true" >> $GITHUB_ENV', - }, - { - if: "matrix.use_sysroot", - ...sysRootStep, - }, - { - name: "Log versions", - run: [ - "python --version", - "rustc --version", - "cargo --version", - // Deno is installed when linting. - 'if [ "${{ matrix.job }}" == "lint" ]', - "then", - " deno --version", - "fi", - // Node is installed for benchmarks. - 'if [ "${{ matrix.job }}" == "bench" ]', - "then", - " node -v", - "fi", - ].join("\n"), - }, - { - name: "Cache Cargo home", - uses: "actions/cache@v3", - with: { - // See https://doc.rust-lang.org/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci - path: [ - "~/.cargo/registry/index", - "~/.cargo/registry/cache", - "~/.cargo/git/db", - ].join("\n"), - key: - "20-cargo-home-${{ matrix.os }}-${{ hashFiles('Cargo.lock') }}", - }, - }, - { - // Restore cache from the latest 'main' branch build. - name: "Restore cache build output (PR)", - uses: "actions/cache/restore@v3", - if: - "github.ref != 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')", - with: { - path: [ - "./target", - "!./target/*/gn_out", - "!./target/*/*.zip", - "!./target/*/*.tar.gz", - ].join("\n"), - key: "never_saved", - "restore-keys": prCacheKeyPrefix, - }, - }, - { - name: "Apply and update mtime cache", - if: "!startsWith(github.ref, 'refs/tags/')", - uses: "./.github/mtime_cache", - with: { - "cache-path": "./target", - }, - }, - { - // Shallow the cloning the crates.io index makes CI faster because it - // obviates the need for Cargo to clone the index. If we don't do this - // Cargo will `git clone` the github repository that contains the entire - // history of the crates.io index from github. We don't believe the - // identifier '1ecc6299db9ec823' will ever change, but if it does then this - // command must be updated. - name: "Shallow clone crates.io index", - run: [ - "if [ ! -d ~/.cargo/registry/index/github.com-1ecc6299db9ec823/.git ]", - "then", - " git clone --depth 1 --no-checkout \\", - " https://github.com/rust-lang/crates.io-index \\", - " ~/.cargo/registry/index/github.com-1ecc6299db9ec823", - "fi", - ].join("\n"), - }, - { - name: "test_format.js", - if: "matrix.job == 'lint'", - run: - "deno run --unstable --allow-write --allow-read --allow-run ./tools/format.js --check", - }, - { - name: "Lint PR title", - if: "matrix.job == 'lint' && github.event_name == 'pull_request'", - env: { - PR_TITLE: "${{ github.event.pull_request.title }}", - }, - run: 'deno run ./tools/verify_pr_title.js "$PR_TITLE"', - }, - { - name: "lint.js", - if: "matrix.job == 'lint'", - run: - "deno run --unstable --allow-write --allow-read --allow-run ./tools/lint.js", - }, - { - name: "Build debug", - if: "matrix.job == 'test' && matrix.profile == 'debug'", - run: "cargo build --locked --all-targets", - env: { CARGO_PROFILE_DEV_DEBUG: 0 }, - }, - { - name: "Build release", - if: [ - "(matrix.job == 'test' || matrix.job == 'bench') &&", - "matrix.profile == 'release' && (matrix.use_sysroot ||", - "(github.repository == 'denoland/deno' &&", - "(github.ref == 'refs/heads/main' ||", - "startsWith(github.ref, 'refs/tags/'))))", - ].join("\n"), - run: "cargo build --release --locked --all-targets", - }, - { - name: "Upload PR artifact (linux)", - if: [ - "matrix.job == 'test' &&", - "matrix.profile == 'release' && (matrix.use_sysroot ||", - "(github.repository == 'denoland/deno' &&", - "(github.ref == 'refs/heads/main' ||", - "startsWith(github.ref, 'refs/tags/'))))", - ].join("\n"), - uses: "actions/upload-artifact@v3", - with: { - name: "deno-${{ github.event.number }}", - path: "target/release/deno", - }, - }, - { - name: "Pre-release (linux)", - if: [ - "startsWith(matrix.os, 'ubuntu') &&", - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno'", - ].join("\n"), - run: [ - "cd target/release", - "zip -r deno-x86_64-unknown-linux-gnu.zip deno", - "./deno types > lib.deno.d.ts", - ].join("\n"), - }, - { - name: "Pre-release (mac)", - if: [ - "startsWith(matrix.os, 'macOS') &&", - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "(github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/'))", - ].join("\n"), - run: [ - "cd target/release", - "zip -r deno-x86_64-apple-darwin.zip deno", - ] - .join("\n"), - }, - { - name: "Pre-release (windows)", - if: [ - "startsWith(matrix.os, 'windows') &&", - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "(github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/'))", - ].join("\n"), - shell: "pwsh", - run: - "Compress-Archive -CompressionLevel Optimal -Force -Path target/release/deno.exe -DestinationPath target/release/deno-x86_64-pc-windows-msvc.zip", - }, - { - name: "Upload canary to dl.deno.land (unix)", - if: [ - "runner.os != 'Windows' &&", - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "github.ref == 'refs/heads/main'", - ].join("\n"), - run: - 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/canary/$(git rev-parse HEAD)/', - }, - { - name: "Upload canary to dl.deno.land (windows)", - if: [ - "runner.os == 'Windows' &&", - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "github.ref == 'refs/heads/main'", - ].join("\n"), - env: { - CLOUDSDK_PYTHON: "${{env.pythonLocation}}\\python.exe", - }, - run: - 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/canary/$(git rev-parse HEAD)/', - }, - { - name: "Test debug", - if: [ - "matrix.job == 'test' && matrix.profile == 'debug' &&", - "!startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'ubuntu')", - ].join("\n"), - run: "cargo test --locked", - env: { CARGO_PROFILE_DEV_DEBUG: 0 }, - }, - { - name: "Test debug (fast)", - if: [ - "matrix.job == 'test' && matrix.profile == 'debug' && ", - "!startsWith(matrix.os, 'ubuntu')", - ].join("\n"), - run: [ - // Run unit then integration tests. Skip doc tests here - // since they are sometimes very slow on Mac. - "cargo test --locked --lib", - "cargo test --locked --test '*'", - ].join("\n"), - env: { CARGO_PROFILE_DEV_DEBUG: 0 }, - }, - { - name: "Test release", - if: [ - "matrix.job == 'test' && matrix.profile == 'release' &&", - "(matrix.use_sysroot || (", - "github.repository == 'denoland/deno' &&", - "github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')))", - ].join("\n"), - run: "cargo test --release --locked", - }, - { - // Since all tests are skipped when we're building a tagged commit - // this is a minimal check to ensure that binary is not corrupted - name: "Check deno binary", - if: - "matrix.profile == 'release' && startsWith(github.ref, 'refs/tags/')", - run: 'target/release/deno eval "console.log(1+2)" | grep 3', - env: { - NO_COLOR: 1, - }, - }, - { - // Verify that the binary actually works in the Ubuntu-16.04 sysroot. - name: "Check deno binary (in sysroot)", - if: "matrix.profile == 'release' && matrix.use_sysroot", - run: 'sudo chroot /sysroot "$(pwd)/target/release/deno" --version', - }, - { - name: "Configure hosts file for WPT", - if: "matrix.wpt", - run: "./wpt make-hosts-file | sudo tee -a /etc/hosts", - "working-directory": "test_util/wpt/", - }, - { - name: "Run web platform tests (debug)", - if: "matrix.wpt && matrix.profile == 'debug'", - env: { - DENO_BIN: "./target/debug/deno", - }, - run: [ - "deno run --allow-env --allow-net --allow-read --allow-run \\", - " --allow-write --unstable \\", - " --lock=tools/deno.lock.json \\", - " ./tools/wpt.ts setup", - "deno run --allow-env --allow-net --allow-read --allow-run \\", - " --allow-write --unstable \\", - " --lock=tools/deno.lock.json \\", - ' ./tools/wpt.ts run --quiet --binary="$DENO_BIN"', - ].join("\n"), - }, - { - name: "Run web platform tests (release)", - if: "matrix.wpt && matrix.profile == 'release'", - env: { - DENO_BIN: "./target/release/deno", - }, - run: [ - "deno run --allow-env --allow-net --allow-read --allow-run \\", - " --allow-write --unstable \\", - " --lock=tools/deno.lock.json \\", - " ./tools/wpt.ts setup", - "deno run --allow-env --allow-net --allow-read --allow-run \\", - " --allow-write --unstable \\", - " --lock=tools/deno.lock.json \\", - " ./tools/wpt.ts run --quiet --release \\", - ' --binary="$DENO_BIN" \\', - " --json=wpt.json \\", - " --wptreport=wptreport.json", - ].join("\n"), - }, - { - name: "Upload wpt results to dl.deno.land", - "continue-on-error": true, - if: [ - "matrix.wpt &&", - "runner.os == 'Linux' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')", - ].join("\n"), - run: [ - "gzip ./wptreport.json", - 'gsutil -h "Cache-Control: public, max-age=3600" cp ./wpt.json gs://dl.deno.land/wpt/$(git rev-parse HEAD).json', - 'gsutil -h "Cache-Control: public, max-age=3600" cp ./wptreport.json.gz gs://dl.deno.land/wpt/$(git rev-parse HEAD)-wptreport.json.gz', - "echo $(git rev-parse HEAD) > wpt-latest.txt", - 'gsutil -h "Cache-Control: no-cache" cp wpt-latest.txt gs://dl.deno.land/wpt-latest.txt', - ].join("\n"), - }, - { - name: "Upload wpt results to wpt.fyi", - "continue-on-error": true, - if: [ - "matrix.wpt &&", - "runner.os == 'Linux' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')", - ].join("\n"), - env: { - WPT_FYI_USER: "deno", - WPT_FYI_PW: "${{ secrets.WPT_FYI_PW }}", - GITHUB_TOKEN: "${{ secrets.DENOBOT_PAT }}", - }, - run: [ - "./target/release/deno run --allow-all --lock=tools/deno.lock.json \\", - " ./tools/upload_wptfyi.js $(git rev-parse HEAD) --ghstatus", - ].join("\n"), - }, - { - name: "Run benchmarks", - if: - "matrix.job == 'bench' && !startsWith(github.ref, 'refs/tags/')", - run: "cargo bench --locked", - }, - { - name: "Post Benchmarks", - if: [ - "matrix.job == 'bench' &&", - "github.repository == 'denoland/deno' &&", - "github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')", - ].join("\n"), - env: { - DENOBOT_PAT: "${{ secrets.DENOBOT_PAT }}", - }, - run: [ - "git clone --depth 1 --branch gh-pages \\", - " https://${DENOBOT_PAT}@github.com/denoland/benchmark_data.git \\", - " gh-pages", - "./target/release/deno run --allow-all --unstable \\", - " ./tools/build_benchmark_jsons.js --release", - "cd gh-pages", - 'git config user.email "propelml@gmail.com"', - 'git config user.name "denobot"', - "git add .", - 'git commit --message "Update benchmarks"', - "git push origin gh-pages", - ].join("\n"), - }, - { - name: "Build product size info", - if: - "matrix.job != 'lint' && matrix.profile != 'debug' && github.repository == 'denoland/deno' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/'))", - run: [ - 'du -hd1 "./target/${{ matrix.profile }}"', - 'du -ha "./target/${{ matrix.profile }}/deno"', - ].join("\n"), - }, - { - name: "Worker info", - if: "matrix.job == 'bench'", - run: [ - "cat /proc/cpuinfo", - "cat /proc/meminfo", - ].join("\n"), - }, - { - name: "Upload release to dl.deno.land (unix)", - if: [ - "runner.os != 'Windows' &&", - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "startsWith(github.ref, 'refs/tags/')", - ].join("\n"), - run: - 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/release/${GITHUB_REF#refs/*/}/', - }, - { - name: "Upload release to dl.deno.land (windows)", - if: [ - "runner.os == 'Windows' &&", - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "startsWith(github.ref, 'refs/tags/')", - ].join("\n"), - env: { - CLOUDSDK_PYTHON: "${{env.pythonLocation}}\\python.exe", - }, - run: - 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/release/${GITHUB_REF#refs/*/}/', - }, - { - name: "Create release notes", - if: [ - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "startsWith(github.ref, 'refs/tags/')", - ].join("\n"), - run: [ - "export PATH=$PATH:$(pwd)/target/release", - "./tools/release/05_create_release_notes.ts", - ].join("\n"), - }, - { - name: "Upload release to GitHub", - uses: "softprops/action-gh-release@v0.1.15", - if: [ - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "startsWith(github.ref, 'refs/tags/')", - ].join("\n"), - env: { - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}", - }, - with: { - files: [ - "target/release/deno-x86_64-pc-windows-msvc.zip", - "target/release/deno-x86_64-unknown-linux-gnu.zip", - "target/release/deno-x86_64-apple-darwin.zip", - "target/release/deno_src.tar.gz", - "target/release/lib.deno.d.ts", - ].join("\n"), - body_path: "target/release/release-notes.md", - draft: true, - }, - }, - { - // In main branch, always create a fresh cache - name: "Save cache build output (main)", - uses: "actions/cache/save@v3", - if: - "(matrix.job == 'test' || matrix.job == 'lint') && github.ref == 'refs/heads/main'", - with: { - path: [ - "./target", - "!./target/*/gn_out", - "!./target/*/*.zip", - "!./target/*/*.tar.gz", - ].join("\n"), - key: prCacheKeyPrefix + "${{ github.sha }}", - }, - }, - ]), + }, ]), }, "publish-canary": { diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eca9aa3aef..357bb100a6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,8 +17,34 @@ concurrency: group: '${{ github.workflow }}-${{ !contains(github.event.pull_request.labels.*.name, ''ci-test-flaky'') && github.head_ref || github.run_id }}' cancel-in-progress: true jobs: + pre_build: + name: pre-build + runs-on: ubuntu-latest + outputs: + skip_build: '${{ steps.check.outputs.skip_build }}' + steps: + - name: Configure git + run: |- + git config --global core.symlinks true + git config --global fetch.parallel 32 + if: github.event.pull_request.draft == true + - name: Clone repository + uses: actions/checkout@v3 + with: + fetch-depth: 5 + submodules: false + if: github.event.pull_request.draft == true + - id: check + run: |- + GIT_MESSAGE=$(git log --format=%s -n 1 ${{github.event.after}}) + echo Commit message: $GIT_MESSAGE + echo $GIT_MESSAGE | grep '\[ci\]' || (echo 'Exiting due to draft PR. Commit with [ci] to bypass.' ; echo 'skip_build=true' >> $GITHUB_OUTPUT) + if: github.event.pull_request.draft == true build: name: '${{ matrix.job }} ${{ matrix.profile }} ${{ matrix.os }}' + needs: + - pre_build + if: '${{ needs.pre_build.outputs.skip_build != ''true'' }}' runs-on: '${{ matrix.runner || matrix.os }}' timeout-minutes: 120 defaults: @@ -76,36 +102,29 @@ jobs: fetch-depth: 5 submodules: false if: '!(github.event_name == ''pull_request'' && matrix.skip_pr)' - - name: Cancel if draft PR - id: exit_early - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (github.event.pull_request.draft == true)' - run: |- - GIT_MESSAGE=$(git log --format=%s -n 1 ${{github.event.after}}) - echo Commit message: $GIT_MESSAGE - echo $GIT_MESSAGE | grep '\[ci\]' || (echo 'Exiting due to draft PR. Commit with [ci] to bypass.' ; echo 'EXIT_EARLY=true' >> $GITHUB_OUTPUT) - name: Clone submodule ./test_util/std run: git submodule update --init --recursive --depth=1 -- ./test_util/std - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'')' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr)' - name: Clone submodule ./third_party run: git submodule update --init --recursive --depth=1 -- ./third_party - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'')' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr)' - name: Clone submodule ./test_util/wpt run: git submodule update --init --recursive --depth=1 -- ./test_util/wpt - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.wpt))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.wpt)' - name: 'Create source tarballs (release, linux)' if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (startsWith(matrix.os, 'ubuntu') && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (startsWith(matrix.os, 'ubuntu') && matrix.profile == 'release' && matrix.job == 'test' && github.repository == 'denoland/deno' && - startsWith(github.ref, 'refs/tags/'))) + startsWith(github.ref, 'refs/tags/')) run: |- mkdir -p target/release tar --exclude=".git*" --exclude=target --exclude=third_party/prebuilt \ -czvf target/release/deno_src.tar.gz -C .. deno - uses: dsherret/rust-toolchain-file@v1 - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'')' - - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''lint'' || matrix.job == ''test''))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr)' + - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.job == ''lint'' || matrix.job == ''test'')' name: Install Deno uses: denoland/setup-deno@v1 with: @@ -114,26 +133,26 @@ jobs: uses: actions/setup-python@v4 with: python-version: 3.11 - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job != ''lint''))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.job != ''lint'')' - name: Remove unused versions of Python - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job != ''lint'' && (startsWith(matrix.os, ''windows''))))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.job != ''lint'' && (startsWith(matrix.os, ''windows'')))' shell: pwsh run: |- $env:PATH -split ";" | Where-Object { Test-Path "$_\python.exe" } | Select-Object -Skip 1 | ForEach-Object { Move-Item "$_" "$_.disabled" } - - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''bench''))' + - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.job == ''bench'')' name: Install Node uses: actions/setup-node@v3 with: node-version: 18 - if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.profile == 'release' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.profile == 'release' && matrix.job == 'test' && github.repository == 'denoland/deno' && (github.ref == 'refs/heads/main' || - startsWith(github.ref, 'refs/tags/')))) + startsWith(github.ref, 'refs/tags/'))) name: Authenticate with Google Cloud uses: google-github-actions/auth@v1 with: @@ -143,23 +162,23 @@ jobs: create_credentials_file: true - name: Setup gcloud (unix) if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (runner.os != 'Windows' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (runner.os != 'Windows' && matrix.profile == 'release' && matrix.job == 'test' && github.repository == 'denoland/deno' && (github.ref == 'refs/heads/main' || - startsWith(github.ref, 'refs/tags/')))) + startsWith(github.ref, 'refs/tags/'))) uses: google-github-actions/setup-gcloud@v1 with: project_id: denoland - name: Setup gcloud (windows) if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (runner.os == 'Windows' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (runner.os == 'Windows' && matrix.profile == 'release' && matrix.job == 'test' && github.repository == 'denoland/deno' && (github.ref == 'refs/heads/main' || - startsWith(github.ref, 'refs/tags/')))) + startsWith(github.ref, 'refs/tags/'))) uses: google-github-actions/setup-gcloud@v1 env: CLOUDSDK_PYTHON: '${{env.pythonLocation}}\python.exe' @@ -167,12 +186,12 @@ jobs: project_id: denoland - name: Configure canary build if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'test' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - github.ref == 'refs/heads/main')) + github.ref == 'refs/heads/main') run: echo "DENO_CANARY=true" >> $GITHUB_ENV - - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.use_sysroot))' + - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.use_sysroot)' name: Set up incremental LTO and sysroot build run: |- # Avoid running man-db triggers, which sometimes takes several minutes @@ -254,7 +273,7 @@ jobs: then node -v fi - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'')' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr)' - name: Cache Cargo home uses: actions/cache@v3 with: @@ -263,10 +282,10 @@ jobs: ~/.cargo/registry/cache ~/.cargo/git/db key: '20-cargo-home-${{ matrix.os }}-${{ hashFiles(''Cargo.lock'') }}' - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'')' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr)' - name: Restore cache build output (PR) uses: actions/cache/restore@v3 - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (github.ref != ''refs/heads/main'' && !startsWith(github.ref, ''refs/tags/'')))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (github.ref != ''refs/heads/main'' && !startsWith(github.ref, ''refs/tags/''))' with: path: |- ./target @@ -276,7 +295,7 @@ jobs: key: never_saved restore-keys: '18-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ matrix.job }}-' - name: Apply and update mtime cache - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (!startsWith(github.ref, ''refs/tags/'')))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (!startsWith(github.ref, ''refs/tags/''))' uses: ./.github/mtime_cache with: cache-path: ./target @@ -288,100 +307,100 @@ jobs: https://github.com/rust-lang/crates.io-index \ ~/.cargo/registry/index/github.com-1ecc6299db9ec823 fi - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'')' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr)' - name: test_format.js - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''lint''))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.job == ''lint'')' run: deno run --unstable --allow-write --allow-read --allow-run ./tools/format.js --check - name: Lint PR title - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''lint'' && github.event_name == ''pull_request''))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.job == ''lint'' && github.event_name == ''pull_request'')' env: PR_TITLE: '${{ github.event.pull_request.title }}' run: deno run ./tools/verify_pr_title.js "$PR_TITLE" - name: lint.js - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''lint''))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.job == ''lint'')' run: deno run --unstable --allow-write --allow-read --allow-run ./tools/lint.js - name: Build debug - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''test'' && matrix.profile == ''debug''))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.job == ''test'' && matrix.profile == ''debug'')' run: cargo build --locked --all-targets env: CARGO_PROFILE_DEV_DEBUG: 0 - name: Build release if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && ((matrix.job == 'test' || matrix.job == 'bench') && + !(github.event_name == 'pull_request' && matrix.skip_pr) && ((matrix.job == 'test' || matrix.job == 'bench') && matrix.profile == 'release' && (matrix.use_sysroot || (github.repository == 'denoland/deno' && (github.ref == 'refs/heads/main' || - startsWith(github.ref, 'refs/tags/')))))) + startsWith(github.ref, 'refs/tags/'))))) run: cargo build --release --locked --all-targets - name: Upload PR artifact (linux) if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'test' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.job == 'test' && matrix.profile == 'release' && (matrix.use_sysroot || (github.repository == 'denoland/deno' && (github.ref == 'refs/heads/main' || - startsWith(github.ref, 'refs/tags/')))))) + startsWith(github.ref, 'refs/tags/'))))) uses: actions/upload-artifact@v3 with: name: 'deno-${{ github.event.number }}' path: target/release/deno - name: Pre-release (linux) if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (startsWith(matrix.os, 'ubuntu') && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' && matrix.profile == 'release' && - github.repository == 'denoland/deno')) + github.repository == 'denoland/deno') run: |- cd target/release zip -r deno-x86_64-unknown-linux-gnu.zip deno ./deno types > lib.deno.d.ts - name: Pre-release (mac) if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (startsWith(matrix.os, 'macOS') && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (startsWith(matrix.os, 'macOS') && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')))) + (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/'))) run: |- cd target/release zip -r deno-x86_64-apple-darwin.zip deno - name: Pre-release (windows) if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (startsWith(matrix.os, 'windows') && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (startsWith(matrix.os, 'windows') && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')))) + (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/'))) shell: pwsh run: Compress-Archive -CompressionLevel Optimal -Force -Path target/release/deno.exe -DestinationPath target/release/deno-x86_64-pc-windows-msvc.zip - name: Upload canary to dl.deno.land (unix) if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (runner.os != 'Windows' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (runner.os != 'Windows' && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - github.ref == 'refs/heads/main')) + github.ref == 'refs/heads/main') run: 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/canary/$(git rev-parse HEAD)/' - name: Upload canary to dl.deno.land (windows) if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (runner.os == 'Windows' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (runner.os == 'Windows' && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - github.ref == 'refs/heads/main')) + github.ref == 'refs/heads/main') env: CLOUDSDK_PYTHON: '${{env.pythonLocation}}\python.exe' run: 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/canary/$(git rev-parse HEAD)/' - name: Test debug if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'test' && matrix.profile == 'debug' && - !startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'ubuntu'))) + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.job == 'test' && matrix.profile == 'debug' && + !startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'ubuntu')) run: cargo test --locked env: CARGO_PROFILE_DEV_DEBUG: 0 - name: Test debug (fast) if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'test' && matrix.profile == 'debug' && - !startsWith(matrix.os, 'ubuntu'))) + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.job == 'test' && matrix.profile == 'debug' && + !startsWith(matrix.os, 'ubuntu')) run: |- cargo test --locked --lib cargo test --locked --test '*' @@ -389,25 +408,25 @@ jobs: CARGO_PROFILE_DEV_DEBUG: 0 - name: Test release if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'test' && matrix.profile == 'release' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.job == 'test' && matrix.profile == 'release' && (matrix.use_sysroot || ( github.repository == 'denoland/deno' && - github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/'))))) + github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')))) run: cargo test --release --locked - name: Check deno binary - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.profile == ''release'' && startsWith(github.ref, ''refs/tags/'')))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.profile == ''release'' && startsWith(github.ref, ''refs/tags/''))' run: target/release/deno eval "console.log(1+2)" | grep 3 env: NO_COLOR: 1 - name: Check deno binary (in sysroot) - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.profile == ''release'' && matrix.use_sysroot))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.profile == ''release'' && matrix.use_sysroot)' run: sudo chroot /sysroot "$(pwd)/target/release/deno" --version - name: Configure hosts file for WPT - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.wpt))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.wpt)' run: ./wpt make-hosts-file | sudo tee -a /etc/hosts working-directory: test_util/wpt/ - name: Run web platform tests (debug) - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.wpt && matrix.profile == ''debug''))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.wpt && matrix.profile == ''debug'')' env: DENO_BIN: ./target/debug/deno run: |- @@ -420,7 +439,7 @@ jobs: --lock=tools/deno.lock.json \ ./tools/wpt.ts run --quiet --binary="$DENO_BIN" - name: Run web platform tests (release) - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.wpt && matrix.profile == ''release''))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.wpt && matrix.profile == ''release'')' env: DENO_BIN: ./target/release/deno run: |- @@ -438,11 +457,11 @@ jobs: - name: Upload wpt results to dl.deno.land continue-on-error: true if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.wpt && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.wpt && runner.os == 'Linux' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/'))) + github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')) run: |- gzip ./wptreport.json gsutil -h "Cache-Control: public, max-age=3600" cp ./wpt.json gs://dl.deno.land/wpt/$(git rev-parse HEAD).json @@ -452,11 +471,11 @@ jobs: - name: Upload wpt results to wpt.fyi continue-on-error: true if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.wpt && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.wpt && runner.os == 'Linux' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/'))) + github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')) env: WPT_FYI_USER: deno WPT_FYI_PW: '${{ secrets.WPT_FYI_PW }}' @@ -465,13 +484,13 @@ jobs: ./target/release/deno run --allow-all --lock=tools/deno.lock.json \ ./tools/upload_wptfyi.js $(git rev-parse HEAD) --ghstatus - name: Run benchmarks - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''bench'' && !startsWith(github.ref, ''refs/tags/'')))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.job == ''bench'' && !startsWith(github.ref, ''refs/tags/''))' run: cargo bench --locked - name: Post Benchmarks if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'bench' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.job == 'bench' && github.repository == 'denoland/deno' && - github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/'))) + github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')) env: DENOBOT_PAT: '${{ secrets.DENOBOT_PAT }}' run: |- @@ -487,49 +506,49 @@ jobs: git commit --message "Update benchmarks" git push origin gh-pages - name: Build product size info - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job != ''lint'' && matrix.profile != ''debug'' && github.repository == ''denoland/deno'' && (github.ref == ''refs/heads/main'' || startsWith(github.ref, ''refs/tags/''))))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.job != ''lint'' && matrix.profile != ''debug'' && github.repository == ''denoland/deno'' && (github.ref == ''refs/heads/main'' || startsWith(github.ref, ''refs/tags/'')))' run: |- du -hd1 "./target/${{ matrix.profile }}" du -ha "./target/${{ matrix.profile }}/deno" - name: Worker info - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''bench''))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (matrix.job == ''bench'')' run: |- cat /proc/cpuinfo cat /proc/meminfo - name: Upload release to dl.deno.land (unix) if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (runner.os != 'Windows' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (runner.os != 'Windows' && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - startsWith(github.ref, 'refs/tags/'))) + startsWith(github.ref, 'refs/tags/')) run: 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/release/${GITHUB_REF#refs/*/}/' - name: Upload release to dl.deno.land (windows) if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (runner.os == 'Windows' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (runner.os == 'Windows' && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - startsWith(github.ref, 'refs/tags/'))) + startsWith(github.ref, 'refs/tags/')) env: CLOUDSDK_PYTHON: '${{env.pythonLocation}}\python.exe' run: 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/release/${GITHUB_REF#refs/*/}/' - name: Create release notes if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'test' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - startsWith(github.ref, 'refs/tags/'))) + startsWith(github.ref, 'refs/tags/')) run: |- export PATH=$PATH:$(pwd)/target/release ./tools/release/05_create_release_notes.ts - name: Upload release to GitHub uses: softprops/action-gh-release@v0.1.15 if: |- - !(github.event_name == 'pull_request' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'test' && + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - startsWith(github.ref, 'refs/tags/'))) + startsWith(github.ref, 'refs/tags/')) env: GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' with: @@ -543,7 +562,7 @@ jobs: draft: true - name: Save cache build output (main) uses: actions/cache/save@v3 - if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && ((matrix.job == ''test'' || matrix.job == ''lint'') && github.ref == ''refs/heads/main''))' + if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && ((matrix.job == ''test'' || matrix.job == ''lint'') && github.ref == ''refs/heads/main'')' with: path: |- ./target