From f74c44efd6bed5d325bd782dbda91f34452ab097 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Wed, 11 Jan 2023 13:44:11 -0500 Subject: [PATCH] chore(ci): do not run CI on draft PRs unless explicitly run via commit message (#17350) This will help us reduce CI time during development. The CI can be explicitly run on draft PRs by adding `[ci]` to the commit message. --- .github/PULL_REQUEST_TEMPLATE.md | 2 + .github/workflows/ci.generate.ts | 1109 ++++++++++++++++-------------- .github/workflows/ci.yml | 157 +++-- 3 files changed, 675 insertions(+), 593 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a75ff44f7e..567f73c07a 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,4 +18,6 @@ Before submitting a PR, please read http://deno.land/manual/contributing 4. Ensure `cargo test` passes. 5. Ensure `./tools/format.js` passes without changing files. 6. Ensure `./tools/lint.js` passes. +7. Open as a draft PR if your work is still in progress. The CI won't run + all steps, but you can add '[ci]' to a commit message to force it to. --> diff --git a/.github/workflows/ci.generate.ts b/.github/workflows/ci.generate.ts index d5807605df..2186902cc0 100644 --- a/.github/workflows/ci.generate.ts +++ b/.github/workflows/ci.generate.ts @@ -87,6 +87,7 @@ const installPythonSteps = [{ }, { name: "Remove unused versions of Python", if: "startsWith(matrix.os, 'windows')", + shell: "pwsh", run: [ '$env:PATH -split ";" |', ' Where-Object { Test-Path "$_\\python.exe" } |', @@ -105,9 +106,55 @@ const installDenoStep = { with: { "deno-version": "v1.x" }, }; +function cancelEarlyIfDraftPr(nextSteps: Record[]): unknown[] { + // 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", + shell: "bash", + 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) => { + const condition = "steps.exit_early.outputs.EXIT_EARLY != 'true'"; + step.if = "if" in step ? `${condition} && (${step.if})` : condition; + return step; + }), + ]; +} + const ci = { name: "ci", - on: ["push", "pull_request"], + on: { + push: { + branches: ["main"], + tags: ["*"], + }, + pull_request: { + types: [ + "opened", + "reopened", + "synchronize", + // need to re-run the action when converting from draft because + // draft PRs will not necessarily run all the steps + "ready_for_review", + ], + }, + }, concurrency: { group: "${{ github.workflow }}-${{ !contains(github.event.pull_request.labels.*.name, 'test-flaky-ci') && github.head_ref || github.run_id }}", @@ -201,541 +248,549 @@ const ci = { submodules: false, }, }, - submoduleStep("./test_util/std"), - { - ...submoduleStep("./test_util/wpt"), - if: "matrix.job == 'test'", - }, - { - ...submoduleStep("./third_party"), - if: "matrix.job == 'lint' || matrix.job == 'bench'", - }, - { - 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: [ - "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, - installNodeStep, - { - 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@v0", - with: { - project_id: "denoland", - service_account_key: "${{ secrets.GCP_SA_KEY }}", - export_default_credentials: true, + ...cancelEarlyIfDraftPr([ + submoduleStep("./test_util/std"), + { + ...submoduleStep("./test_util/wpt"), + if: "matrix.job == 'test'", }, - }, - { - name: "Setup gcloud (windows)", - if: [ - "runner.os == 'Windows' &&", - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "(github.ref == 'refs/heads/main' ||", - "startsWith(github.ref, 'refs/tags/'))", - ].join("\n"), - uses: "google-github-actions/setup-gcloud@v0", - env: { - CLOUDSDK_PYTHON: "${{env.pythonLocation}}\\python.exe", + { + ...submoduleStep("./third_party"), + if: "matrix.job == 'lint' || matrix.job == 'bench'", }, - with: { - project_id: "denoland", - service_account_key: "${{ secrets.GCP_SA_KEY }}", - export_default_credentials: true, - }, - }, - { - name: "Configure canary build", - if: [ - "matrix.job == 'test' &&", - "matrix.profile == 'release' &&", - "github.repository == 'denoland/deno' &&", - "github.ref == 'refs/heads/main'", - ].join("\n"), - shell: "bash", - run: 'echo "DENO_CANARY=true" >> $GITHUB_ENV', - }, - { - if: "matrix.use_sysroot", - ...sysRootStep, - }, - { - name: "Log versions", - shell: "bash", - run: [ - "node -v", - "python --version", - "rustc --version", - "cargo --version", - "# Deno is installed when linting.", - 'if [ "${{ matrix.job }}" == "lint" ]', - "then", - " deno --version", - "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", + { + 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"), - key: - "18-cargo-home-${{ matrix.os }}-${{ hashFiles('Cargo.lock') }}", - }, - }, - { - // In main branch, always creates fresh cache - name: "Cache build output (main)", - uses: "actions/cache/save@v3", - if: - "(matrix.profile == 'release' || matrix.profile == 'fastci') && github.ref == 'refs/heads/main'", - with: { - path: [ - "./target", - "!./target/*/gn_out", - "!./target/*/*.zip", - "!./target/*/*.tar.gz", + run: [ + "mkdir -p target/release", + 'tar --exclude=".git*" --exclude=target --exclude=third_party/prebuilt \\', + " -czvf target/release/deno_src.tar.gz -C .. deno", ].join("\n"), - key: - "18-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ github.sha }}", }, - }, - { - // Restore cache from the latest 'main' branch build. - name: "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", + installRustStep, + { + if: "matrix.job == 'lint' || matrix.job == 'test'", + ...installDenoStep, + }, + ...installPythonSteps, + installNodeStep, + { + 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"), - key: "never_saved", - "restore-keys": - "18-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-", + uses: "google-github-actions/setup-gcloud@v0", + with: { + project_id: "denoland", + service_account_key: "${{ secrets.GCP_SA_KEY }}", + export_default_credentials: true, + }, }, - }, - { - name: "Apply and update mtime cache", - if: "matrix.profile == 'release'", - 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", - shell: "bash", - 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.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.job == 'bench') &&", - "matrix.profile == 'debug'", - ].join("\n"), - run: "cargo build --locked --all-targets", - }, - { - name: "Build fastci", - if: "(matrix.job == 'test' && matrix.profile == 'fastci')", - 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"), - 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", - }, - shell: "bash", - 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/')", - ].join("\n"), - run: ["cargo test --locked --doc", "cargo test --locked"].join("\n"), - }, - { - name: "Test fastci", - if: "(matrix.job == 'test' && matrix.profile == 'fastci')", - run: "cargo test --locked", - 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/')", - shell: "bash", - 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', - }, - { - // TODO(ry): Because CI is so slow on for OSX and Windows, we currently - // run the Web Platform tests only on Linux. - name: "Configure hosts file for WPT", - if: "startsWith(matrix.os, 'ubuntu') && matrix.job == 'test'", - run: "./wpt make-hosts-file | sudo tee -a /etc/hosts", - "working-directory": "test_util/wpt/", - }, - { - name: "Run web platform tests (debug)", - if: [ - "startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' &&", - "matrix.profile == 'debug' &&", - "github.ref == 'refs/heads/main'", - ].join("\n"), - 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: [ - "startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' &&", - "matrix.profile == 'release' && !startsWith(github.ref, 'refs/tags/')", - ].join("\n"), - 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: [ - "runner.os == 'Linux' &&", - "matrix.job == 'test' &&", - "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: [ - "runner.os == 'Linux' &&", - "matrix.job == 'test' &&", - "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 != 'fastci' && 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", - }, - shell: "bash", - 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", - shell: "bash", - 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", + { + name: "Setup gcloud (windows)", + if: [ + "runner.os == 'Windows' &&", + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "(github.ref == 'refs/heads/main' ||", + "startsWith(github.ref, 'refs/tags/'))", ].join("\n"), - body_path: "target/release/release-notes.md", - draft: true, + uses: "google-github-actions/setup-gcloud@v0", + env: { + CLOUDSDK_PYTHON: "${{env.pythonLocation}}\\python.exe", + }, + with: { + project_id: "denoland", + service_account_key: "${{ secrets.GCP_SA_KEY }}", + export_default_credentials: true, + }, }, - }, + { + name: "Configure canary build", + if: [ + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "github.ref == 'refs/heads/main'", + ].join("\n"), + shell: "bash", + run: 'echo "DENO_CANARY=true" >> $GITHUB_ENV', + }, + { + if: "matrix.use_sysroot", + ...sysRootStep, + }, + { + name: "Log versions", + shell: "bash", + run: [ + "node -v", + "python --version", + "rustc --version", + "cargo --version", + "# Deno is installed when linting.", + 'if [ "${{ matrix.job }}" == "lint" ]', + "then", + " deno --version", + "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: + "18-cargo-home-${{ matrix.os }}-${{ hashFiles('Cargo.lock') }}", + }, + }, + { + // In main branch, always creates fresh cache + name: "Cache build output (main)", + uses: "actions/cache/save@v3", + if: + "(matrix.profile == 'release' || matrix.profile == 'fastci') && github.ref == 'refs/heads/main'", + with: { + path: [ + "./target", + "!./target/*/gn_out", + "!./target/*/*.zip", + "!./target/*/*.tar.gz", + ].join("\n"), + key: + "18-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ github.sha }}", + }, + }, + { + // Restore cache from the latest 'main' branch build. + name: "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": + "18-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-", + }, + }, + { + name: "Apply and update mtime cache", + if: "matrix.profile == 'release'", + 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", + shell: "bash", + 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.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.job == 'bench') &&", + "matrix.profile == 'debug'", + ].join("\n"), + run: "cargo build --locked --all-targets", + }, + { + name: "Build fastci", + if: "(matrix.job == 'test' && matrix.profile == 'fastci')", + 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"), + 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", + }, + shell: "bash", + 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/')", + ].join("\n"), + run: ["cargo test --locked --doc", "cargo test --locked"].join( + "\n", + ), + }, + { + name: "Test fastci", + if: "(matrix.job == 'test' && matrix.profile == 'fastci')", + run: "cargo test --locked", + 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/')", + shell: "bash", + 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', + }, + { + // TODO(ry): Because CI is so slow on for OSX and Windows, we currently + // run the Web Platform tests only on Linux. + name: "Configure hosts file for WPT", + if: "startsWith(matrix.os, 'ubuntu') && matrix.job == 'test'", + run: "./wpt make-hosts-file | sudo tee -a /etc/hosts", + "working-directory": "test_util/wpt/", + }, + { + name: "Run web platform tests (debug)", + if: [ + "startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' &&", + "matrix.profile == 'debug' &&", + "github.ref == 'refs/heads/main'", + ].join("\n"), + 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: [ + "startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' &&", + "matrix.profile == 'release' && !startsWith(github.ref, 'refs/tags/')", + ].join("\n"), + 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: [ + "runner.os == 'Linux' &&", + "matrix.job == 'test' &&", + "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: [ + "runner.os == 'Linux' &&", + "matrix.job == 'test' &&", + "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 != 'fastci' && 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", + }, + shell: "bash", + 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", + shell: "bash", + 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, + }, + }, + ]), ], }, "publish-canary": { diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4548a7fc21..fb18722d63 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,8 +2,17 @@ name: ci on: - - push - - pull_request + push: + branches: + - main + tags: + - '*' + pull_request: + types: + - opened + - reopened + - synchronize + - ready_for_review concurrency: group: '${{ github.workflow }}-${{ !contains(github.event.pull_request.labels.*.name, ''test-flaky-ci'') && github.head_ref || github.run_id }}' cancel-in-progress: true @@ -59,27 +68,37 @@ jobs: with: fetch-depth: 5 submodules: false + - name: Cancel if draft PR + id: exit_early + if: github.event.pull_request.draft == true + shell: bash + 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: steps.exit_early.outputs.EXIT_EARLY != 'true' - name: Clone submodule ./test_util/wpt run: git submodule update --init --recursive --depth=1 -- ./test_util/wpt - if: matrix.job == 'test' + if: steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'test') - name: Clone submodule ./third_party run: git submodule update --init --recursive --depth=1 -- ./third_party - if: matrix.job == 'lint' || matrix.job == 'bench' + if: steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'lint' || matrix.job == 'bench') - name: 'Create source tarballs (release, linux)' if: |- - startsWith(matrix.os, 'ubuntu') && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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: dtolnay/rust-toolchain@stable - - if: matrix.job == 'lint' || matrix.job == 'test' + if: steps.exit_early.outputs.EXIT_EARLY != 'true' + - if: steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'lint' || matrix.job == 'test') name: Install Deno uses: denoland/setup-deno@v1 with: @@ -88,8 +107,10 @@ jobs: uses: actions/setup-python@v4 with: python-version: 3.8 + if: steps.exit_early.outputs.EXIT_EARLY != 'true' - name: Remove unused versions of Python - if: 'startsWith(matrix.os, ''windows'')' + if: 'steps.exit_early.outputs.EXIT_EARLY != ''true'' && (startsWith(matrix.os, ''windows''))' + shell: pwsh run: |- $env:PATH -split ";" | Where-Object { Test-Path "$_\python.exe" } | @@ -99,14 +120,15 @@ jobs: uses: actions/setup-node@v3 with: node-version: 17 + if: steps.exit_early.outputs.EXIT_EARLY != 'true' - name: Setup gcloud (unix) if: |- - runner.os != 'Windows' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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@v0 with: project_id: denoland @@ -114,12 +136,12 @@ jobs: export_default_credentials: true - name: Setup gcloud (windows) if: |- - runner.os == 'Windows' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (runner.os == 'Windows' && matrix.job == 'test' && matrix.profile == 'release' && 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@v0 env: CLOUDSDK_PYTHON: '${{env.pythonLocation}}\python.exe' @@ -129,13 +151,13 @@ jobs: export_default_credentials: true - name: Configure canary build if: |- - matrix.job == 'test' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && - github.ref == 'refs/heads/main' + github.ref == 'refs/heads/main') shell: bash run: echo "DENO_CANARY=true" >> $GITHUB_ENV - - if: matrix.use_sysroot + - if: steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.use_sysroot) name: Set up incremental LTO and sysroot build run: |- # Avoid running man-db triggers, which sometimes takes several minutes @@ -208,6 +230,7 @@ jobs: then deno --version fi + if: steps.exit_early.outputs.EXIT_EARLY != 'true' - name: Cache Cargo home uses: actions/cache@v3 with: @@ -216,9 +239,10 @@ jobs: ~/.cargo/registry/cache ~/.cargo/git/db key: '18-cargo-home-${{ matrix.os }}-${{ hashFiles(''Cargo.lock'') }}' + if: steps.exit_early.outputs.EXIT_EARLY != 'true' - name: Cache build output (main) uses: actions/cache/save@v3 - if: (matrix.profile == 'release' || matrix.profile == 'fastci') && github.ref == 'refs/heads/main' + if: steps.exit_early.outputs.EXIT_EARLY != 'true' && ((matrix.profile == 'release' || matrix.profile == 'fastci') && github.ref == 'refs/heads/main') with: path: |- ./target @@ -228,7 +252,7 @@ jobs: key: '18-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ github.sha }}' - name: Cache build output (PR) uses: actions/cache/restore@v3 - if: 'github.ref != ''refs/heads/main'' && !startsWith(github.ref, ''refs/tags/'')' + if: 'steps.exit_early.outputs.EXIT_EARLY != ''true'' && (github.ref != ''refs/heads/main'' && !startsWith(github.ref, ''refs/tags/''))' with: path: |- ./target @@ -238,7 +262,7 @@ jobs: key: never_saved restore-keys: '18-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-' - name: Apply and update mtime cache - if: matrix.profile == 'release' + if: steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.profile == 'release') uses: ./.github/mtime_cache with: cache-path: ./target @@ -251,125 +275,126 @@ jobs: https://github.com/rust-lang/crates.io-index \ ~/.cargo/registry/index/github.com-1ecc6299db9ec823 fi + if: steps.exit_early.outputs.EXIT_EARLY != 'true' - name: test_format.js - if: matrix.job == 'lint' + if: steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'lint') run: deno run --unstable --allow-write --allow-read --allow-run ./tools/format.js --check - name: lint.js - if: matrix.job == 'lint' + if: steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'lint') run: deno run --unstable --allow-write --allow-read --allow-run ./tools/lint.js - name: Build debug if: |- - (matrix.job == 'test' || matrix.job == 'bench') && - matrix.profile == 'debug' + steps.exit_early.outputs.EXIT_EARLY != 'true' && ((matrix.job == 'test' || matrix.job == 'bench') && + matrix.profile == 'debug') run: cargo build --locked --all-targets - name: Build fastci - if: (matrix.job == 'test' && matrix.profile == 'fastci') + if: steps.exit_early.outputs.EXIT_EARLY != 'true' && ((matrix.job == 'test' && matrix.profile == 'fastci')) run: cargo build --locked --all-targets env: CARGO_PROFILE_DEV_DEBUG: 0 - name: Build release if: |- - (matrix.job == 'test' || matrix.job == 'bench') && + steps.exit_early.outputs.EXIT_EARLY != 'true' && ((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: |- - matrix.job == 'test' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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: |- - startsWith(matrix.os, 'ubuntu') && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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: |- - startsWith(matrix.os, 'macOS') && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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: |- - startsWith(matrix.os, 'windows') && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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/'))) 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' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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: |- - runner.os == 'Windows' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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' shell: bash 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/') + steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'test' && matrix.profile == 'debug' && + !startsWith(github.ref, 'refs/tags/')) run: |- cargo test --locked --doc cargo test --locked - name: Test fastci - if: (matrix.job == 'test' && matrix.profile == 'fastci') + if: steps.exit_early.outputs.EXIT_EARLY != 'true' && ((matrix.job == 'test' && matrix.profile == 'fastci')) run: cargo test --locked env: CARGO_PROFILE_DEV_DEBUG: 0 - name: Test release if: |- - matrix.job == 'test' && matrix.profile == 'release' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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: 'matrix.profile == ''release'' && startsWith(github.ref, ''refs/tags/'')' + if: 'steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.profile == ''release'' && startsWith(github.ref, ''refs/tags/''))' shell: bash run: target/release/deno eval "console.log(1+2)" | grep 3 env: NO_COLOR: 1 - name: Check deno binary (in sysroot) - if: matrix.profile == 'release' && matrix.use_sysroot + if: steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.profile == 'release' && matrix.use_sysroot) run: sudo chroot /sysroot "$(pwd)/target/release/deno" --version - name: Configure hosts file for WPT - if: 'startsWith(matrix.os, ''ubuntu'') && matrix.job == ''test''' + if: 'steps.exit_early.outputs.EXIT_EARLY != ''true'' && (startsWith(matrix.os, ''ubuntu'') && matrix.job == ''test'')' run: ./wpt make-hosts-file | sudo tee -a /etc/hosts working-directory: test_util/wpt/ - name: Run web platform tests (debug) if: |- - startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' && matrix.profile == 'debug' && - github.ref == 'refs/heads/main' + github.ref == 'refs/heads/main') env: DENO_BIN: ./target/debug/deno run: |- @@ -383,8 +408,8 @@ jobs: ./tools/wpt.ts run --quiet --binary="$DENO_BIN" - name: Run web platform tests (release) if: |- - startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' && - matrix.profile == 'release' && !startsWith(github.ref, 'refs/tags/') + steps.exit_early.outputs.EXIT_EARLY != 'true' && (startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' && + matrix.profile == 'release' && !startsWith(github.ref, 'refs/tags/')) env: DENO_BIN: ./target/release/deno run: |- @@ -402,11 +427,11 @@ jobs: - name: Upload wpt results to dl.deno.land continue-on-error: true if: |- - runner.os == 'Linux' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (runner.os == 'Linux' && 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: |- gzip ./wptreport.json gsutil -h "Cache-Control: public, max-age=3600" cp ./wpt.json gs://dl.deno.land/wpt/$(git rev-parse HEAD).json @@ -416,11 +441,11 @@ jobs: - name: Upload wpt results to wpt.fyi continue-on-error: true if: |- - runner.os == 'Linux' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (runner.os == 'Linux' && 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/')) env: WPT_FYI_USER: deno WPT_FYI_PW: '${{ secrets.WPT_FYI_PW }}' @@ -429,13 +454,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: 'matrix.job == ''bench'' && !startsWith(github.ref, ''refs/tags/'')' + if: 'steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''bench'' && !startsWith(github.ref, ''refs/tags/''))' run: cargo bench --locked - name: Post Benchmarks if: |- - matrix.job == 'bench' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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: |- @@ -451,30 +476,30 @@ jobs: git commit --message "Update benchmarks" git push origin gh-pages - name: Build product size info - if: 'matrix.job != ''lint'' && matrix.profile != ''fastci'' && github.repository == ''denoland/deno'' && (github.ref == ''refs/heads/main'' || startsWith(github.ref, ''refs/tags/''))' + if: 'steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job != ''lint'' && matrix.profile != ''fastci'' && 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: matrix.job == 'bench' + if: steps.exit_early.outputs.EXIT_EARLY != 'true' && (matrix.job == 'bench') run: |- cat /proc/cpuinfo cat /proc/meminfo - name: Upload release to dl.deno.land (unix) if: |- - runner.os != 'Windows' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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: |- - runner.os == 'Windows' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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' shell: bash @@ -482,20 +507,20 @@ jobs: - name: Create release notes shell: bash if: |- - matrix.job == 'test' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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: |- - matrix.job == 'test' && + steps.exit_early.outputs.EXIT_EARLY != 'true' && (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: