diff options
| author | David Sherret <dsherret@users.noreply.github.com> | 2023-01-11 13:44:11 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-11 18:44:11 +0000 |
| commit | 6ee5563f6860758a18f35cee412d5fe3e139cf7c (patch) | |
| tree | 0a0bc347c13514ab4fb3bb7895a734f4c493cb21 /.github/workflows/ci.generate.ts | |
| parent | 8c3c02354d6278e06561aff3cc5847407dcc0244 (diff) | |
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.
Diffstat (limited to '.github/workflows/ci.generate.ts')
| -rw-r--r-- | .github/workflows/ci.generate.ts | 1085 |
1 files changed, 570 insertions, 515 deletions
diff --git a/.github/workflows/ci.generate.ts b/.github/workflows/ci.generate.ts index d5807605d..2186902cc 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<string, unknown>[]): 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: "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"), }, - }, - { - 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", + 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: - "18-cargo-home-${{ matrix.os }}-${{ hashFiles('Cargo.lock') }}", + uses: "google-github-actions/setup-gcloud@v0", + with: { + project_id: "denoland", + service_account_key: "${{ secrets.GCP_SA_KEY }}", + export_default_credentials: true, + }, }, - }, - { - // 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", + { + 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"), - key: - "18-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ github.sha }}", + 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, + }, }, - }, - { - // 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", + { + name: "Configure canary build", + if: [ + "matrix.job == 'test' &&", + "matrix.profile == 'release' &&", + "github.repository == 'denoland/deno' &&", + "github.ref == 'refs/heads/main'", ].join("\n"), - key: "never_saved", - "restore-keys": - "18-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-", + shell: "bash", + run: 'echo "DENO_CANARY=true" >> $GITHUB_ENV', }, - }, - { - 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", + { + if: "matrix.use_sysroot", + ...sysRootStep, }, - }, - { - 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", + { + 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"), }, - 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: "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') }}", + }, }, - }, - { - 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, + { + // 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 }}", + }, }, - }, - { - // 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", + { + // 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 }}-", + }, }, - 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", + { + name: "Apply and update mtime cache", + if: "matrix.profile == 'release'", + uses: "./.github/mtime_cache", + with: { "cache-path": "./target" }, }, - 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 }}", + { + // 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"), }, - 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 }}", + { + name: "test_format.js", + if: "matrix.job == 'lint'", + run: + "deno run --unstable --allow-write --allow-read --allow-run ./tools/format.js --check", }, - 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", + { + name: "lint.js", + if: "matrix.job == 'lint'", + run: + "deno run --unstable --allow-write --allow-read --allow-run ./tools/lint.js", }, - 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 }}", + { + name: "Build debug", + if: [ + "(matrix.job == 'test' || matrix.job == 'bench') &&", + "matrix.profile == 'debug'", + ].join("\n"), + run: "cargo build --locked --all-targets", }, - 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: "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"), - body_path: "target/release/release-notes.md", - draft: true, + 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": { |
