diff --git a/.github/workflows/ci.generate.ts b/.github/workflows/ci.generate.ts new file mode 100644 index 0000000000..38120bc650 --- /dev/null +++ b/.github/workflows/ci.generate.ts @@ -0,0 +1,726 @@ +#!/usr/bin/env -S deno run --allow-write=. --lock=./tools/deno.lock.json +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +import * as yaml from "https://deno.land/std@0.171.0/encoding/yaml.ts"; + +const ci = { + name: "ci", + on: ["push", "pull_request"], + concurrency: { + group: + "${{ github.workflow }}-${{ !contains(github.event.pull_request.labels.*.name, 'test-flaky-ci') && github.head_ref || github.run_id }}", + "cancel-in-progress": true, + }, + jobs: { + build: { + name: "${{ matrix.job }} ${{ matrix.profile }} ${{ matrix.os }}", + if: [ + "github.event_name == 'push' ||", + "!startsWith(github.event.pull_request.head.label, 'denoland:')", + ].join("\n"), + "runs-on": "${{ matrix.os }}", + "timeout-minutes": 120, + strategy: { + matrix: { + include: [ + { + os: "macos-12", + job: "test", + profile: "fastci", + }, + { + os: "macos-12", + job: "test", + profile: "release", + }, + { + os: + "${{ github.repository == 'denoland/deno' && 'windows-2019-xl' || 'windows-2019' }}", + job: "test", + profile: "fastci", + }, + { + os: + "${{ github.repository == 'denoland/deno' && 'windows-2019-xl' || 'windows-2019' }}", + job: "test", + profile: "release", + }, + { + os: + "${{ github.repository == 'denoland/deno' && 'ubuntu-20.04-xl' || 'ubuntu-20.04' }}", + job: "test", + profile: "release", + use_sysroot: true, + }, + { + os: + "${{ github.repository == 'denoland/deno' && 'ubuntu-20.04-xl' || 'ubuntu-20.04' }}", + job: "bench", + profile: "release", + use_sysroot: true, + }, + { + os: + "${{ github.repository == 'denoland/deno' && 'ubuntu-20.04-xl' || 'ubuntu-20.04' }}", + job: "test", + profile: "debug", + use_sysroot: true, + }, + { + os: + "${{ github.repository == 'denoland/deno' && 'ubuntu-20.04-xl' || 'ubuntu-20.04' }}", + job: "lint", + profile: "debug", + }, + ], + }, + // Always run main branch builds to completion. This allows the cache to + // stay mostly up-to-date in situations where a single job fails due to + // e.g. a flaky test. + // Don't fast-fail on tag build because publishing binaries shouldn't be + // prevented if any of the stages fail (which can be a false negative). + "fail-fast": + "${{ github.event_name == 'pull_request' || (github.ref != 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')) }}", + }, + env: { + CARGO_TERM_COLOR: "always", + RUST_BACKTRACE: "full", + }, + steps: [ + { + 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: "recursive", + }, + }, + { + 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"), + }, + { uses: "dtolnay/rust-toolchain@stable" }, + { + name: "Install Deno", + if: "matrix.job == 'lint' || matrix.job == 'test'", + uses: "denoland/setup-deno@v1", + with: { "deno-version": "v1.x" }, + }, + { + name: "Install Python", + uses: "actions/setup-python@v4", + with: { "python-version": 3.8 }, + }, + { + name: "Install Node", + uses: "actions/setup-node@v3", + with: { "node-version": 17 }, + }, + { + name: "Remove unused versions of Python", + if: "startsWith(matrix.os, 'windows')", + run: [ + '$env:PATH -split ";" |', + ' Where-Object { Test-Path "$_\\python.exe" } |', + " Select-Object -Skip 1 |", + ' ForEach-Object { Move-Item "$_" "$_.disabled" }', + ].join("\n"), + }, + { + 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, + }, + }, + { + 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" }, + 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', + }, + { + name: "Set up incremental LTO and sysroot build", + if: "matrix.use_sysroot", + run: [ + "# Avoid running man-db triggers, which sometimes takes several minutes", + "# to complete.", + "sudo apt-get remove --purge -y man-db", + "", + "# Install clang-15, lld-15, and debootstrap.", + 'echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-15 main" |', + " sudo dd of=/etc/apt/sources.list.d/llvm-toolchain-focal-15.list", + "curl https://apt.llvm.org/llvm-snapshot.gpg.key |", + " gpg --dearmor |", + "sudo dd of=/etc/apt/trusted.gpg.d/llvm-snapshot.gpg", + "sudo apt-get update", + "sudo apt-get install --no-install-recommends debootstrap \\", + " clang-15 lld-15", + "", + "# Create ubuntu-16.04 sysroot environment, which is used to avoid", + "# depending on a very recent version of glibc.", + "# `libc6-dev` is required for building any C source files.", + "# `file` and `make` are needed to build libffi-sys.", + "# `curl` is needed to build rusty_v8.", + "sudo debootstrap \\", + " --include=ca-certificates,curl,file,libc6-dev,make \\", + " --no-merged-usr --variant=minbase xenial /sysroot \\", + " http://azure.archive.ubuntu.com/ubuntu", + "sudo mount --rbind /dev /sysroot/dev", + "sudo mount --rbind /sys /sysroot/sys", + "sudo mount --rbind /home /sysroot/home", + "sudo mount -t proc /proc /sysroot/proc", + "", + "# Configure the build environment. Both Rust and Clang will produce", + "# llvm bitcode only, so we can use lld's incremental LTO support.", + "cat >> $GITHUB_ENV << __0", + "CARGO_PROFILE_BENCH_INCREMENTAL=false", + "CARGO_PROFILE_BENCH_LTO=false", + "CARGO_PROFILE_RELEASE_INCREMENTAL=false", + "CARGO_PROFILE_RELEASE_LTO=false", + "RUSTFLAGS<<__1", + " -C linker-plugin-lto=true", + " -C linker=clang-15", + " -C link-arg=-fuse-ld=lld-15", + " -C link-arg=--sysroot=/sysroot", + " -C link-arg=-Wl,--allow-shlib-undefined", + " -C link-arg=-Wl,--thinlto-cache-dir=$(pwd)/target/release/lto-cache", + " -C link-arg=-Wl,--thinlto-cache-policy,cache_size_bytes=700m", + " ${{ env.RUSTFLAGS }}", + "__1", + "RUSTDOCFLAGS<<__1", + " -C linker-plugin-lto=true", + " -C linker=clang-15", + " -C link-arg=-fuse-ld=lld-15", + " -C link-arg=--sysroot=/sysroot", + " -C link-arg=-Wl,--allow-shlib-undefined", + " -C link-arg=-Wl,--thinlto-cache-dir=$(pwd)/target/release/lto-cache", + " -C link-arg=-Wl,--thinlto-cache-policy,cache_size_bytes=700m", + " ${{ env.RUSTFLAGS }}", + "__1", + "CC=clang-15", + "CFLAGS=-flto=thin --sysroot=/sysroot", + "__0", + ].join("\n"), + }, + { + 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": { + name: "publish canary", + "runs-on": "ubuntu-20.04", + needs: ["build"], + if: + "github.repository == 'denoland/deno' && github.ref == 'refs/heads/main'", + steps: [{ + name: "Setup gcloud", + uses: "google-github-actions/setup-gcloud@v0", + with: { + project_id: "denoland", + service_account_key: "${{ secrets.GCP_SA_KEY }}", + export_default_credentials: true, + }, + }, { + name: "Upload canary version file to dl.deno.land", + run: [ + "echo ${{ github.sha }} > canary-latest.txt", + 'gsutil -h "Cache-Control: no-cache" cp canary-latest.txt gs://dl.deno.land/canary-latest.txt', + ].join("\n"), + }], + }, + }, +}; + +let finalText = `# GENERATED BY ./ci.generate.ts -- DO NOT DIRECTLY EDIT\n\n`; +finalText += yaml.stringify(ci, { + noRefs: true, + lineWidth: 10_000, + noCompatMode: true, +}); + +Deno.writeTextFileSync(new URL("./ci.yml", import.meta.url), finalText); diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec85c3cb55..9861e53ea8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,18 +1,19 @@ +# GENERATED BY ./ci.generate.ts -- DO NOT DIRECTLY EDIT + name: ci - -on: [push, pull_request] - +on: + - push + - pull_request concurrency: - group: ${{ github.workflow }}-${{ !contains(github.event.pull_request.labels.*.name, 'test-flaky-ci') && github.head_ref || github.run_id }} + group: '${{ github.workflow }}-${{ !contains(github.event.pull_request.labels.*.name, ''test-flaky-ci'') && github.head_ref || github.run_id }}' cancel-in-progress: true - jobs: build: - name: ${{ matrix.job }} ${{ matrix.profile }} ${{ matrix.os }} - if: | + name: '${{ matrix.job }} ${{ matrix.profile }} ${{ matrix.os }}' + if: |- github.event_name == 'push' || !startsWith(github.event.pull_request.head.label, 'denoland:') - runs-on: ${{ matrix.os }} + runs-on: '${{ matrix.os }}' timeout-minutes: 120 strategy: matrix: @@ -23,96 +24,75 @@ jobs: - os: macos-12 job: test profile: release - - os: ${{ github.repository == 'denoland/deno' && 'windows-2019-xl' || 'windows-2019' }} + - os: '${{ github.repository == ''denoland/deno'' && ''windows-2019-xl'' || ''windows-2019'' }}' job: test profile: fastci - - os: ${{ github.repository == 'denoland/deno' && 'windows-2019-xl' || 'windows-2019' }} + - os: '${{ github.repository == ''denoland/deno'' && ''windows-2019-xl'' || ''windows-2019'' }}' job: test profile: release - - os: ${{ github.repository == 'denoland/deno' && 'ubuntu-20.04-xl' || 'ubuntu-20.04' }} + - os: '${{ github.repository == ''denoland/deno'' && ''ubuntu-20.04-xl'' || ''ubuntu-20.04'' }}' job: test profile: release use_sysroot: true - - os: ${{ github.repository == 'denoland/deno' && 'ubuntu-20.04-xl' || 'ubuntu-20.04' }} + - os: '${{ github.repository == ''denoland/deno'' && ''ubuntu-20.04-xl'' || ''ubuntu-20.04'' }}' job: bench profile: release use_sysroot: true - - os: ${{ github.repository == 'denoland/deno' && 'ubuntu-20.04-xl' || 'ubuntu-20.04' }} + - os: '${{ github.repository == ''denoland/deno'' && ''ubuntu-20.04-xl'' || ''ubuntu-20.04'' }}' job: test profile: debug use_sysroot: true - - os: ${{ github.repository == 'denoland/deno' && 'ubuntu-20.04-xl' || 'ubuntu-20.04' }} + - os: '${{ github.repository == ''denoland/deno'' && ''ubuntu-20.04-xl'' || ''ubuntu-20.04'' }}' job: lint profile: debug - - # Always run main branch builds to completion. This allows the cache to - # stay mostly up-to-date in situations where a single job fails due to - # e.g. a flaky test. - # Don't fast-fail on tag build because publishing binaries shouldn't be - # prevented if any of the stages fail (which can be a false negative). - fail-fast: ${{ github.event_name == 'pull_request' || - (github.ref != 'refs/heads/main' && - !startsWith(github.ref, 'refs/tags/')) }} - + fail-fast: '${{ github.event_name == ''pull_request'' || (github.ref != ''refs/heads/main'' && !startsWith(github.ref, ''refs/tags/'')) }}' env: CARGO_TERM_COLOR: always RUST_BACKTRACE: full - steps: - name: Configure git - run: | + run: |- git config --global core.symlinks true git config --global fetch.parallel 32 - - 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: recursive - - - name: Create source tarballs (release, linux) - if: | + - 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/') - run: | + 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 - - name: Install Deno if: matrix.job == 'lint' || matrix.job == 'test' uses: denoland/setup-deno@v1 with: deno-version: v1.x - - name: Install Python uses: actions/setup-python@v4 with: python-version: 3.8 - - name: Install Node uses: actions/setup-node@v3 with: node-version: 17 - - name: Remove unused versions of Python - if: startsWith(matrix.os, 'windows') + if: 'startsWith(matrix.os, ''windows'')' run: |- $env:PATH -split ";" | Where-Object { Test-Path "$_\python.exe" } | Select-Object -Skip 1 | ForEach-Object { Move-Item "$_" "$_.disabled" } - - name: Setup gcloud (unix) - if: | + if: |- runner.os != 'Windows' && matrix.profile == 'release' && matrix.job == 'test' && @@ -122,11 +102,10 @@ jobs: uses: google-github-actions/setup-gcloud@v0 with: project_id: denoland - service_account_key: ${{ secrets.GCP_SA_KEY }} + service_account_key: '${{ secrets.GCP_SA_KEY }}' export_default_credentials: true - - name: Setup gcloud (windows) - if: | + if: |- runner.os == 'Windows' && matrix.job == 'test' && matrix.profile == 'release' && @@ -135,24 +114,22 @@ jobs: startsWith(github.ref, 'refs/tags/')) uses: google-github-actions/setup-gcloud@v0 env: - CLOUDSDK_PYTHON: ${{env.pythonLocation}}\python.exe + CLOUDSDK_PYTHON: '${{env.pythonLocation}}\python.exe' with: project_id: denoland - service_account_key: ${{ secrets.GCP_SA_KEY }} + service_account_key: '${{ secrets.GCP_SA_KEY }}' export_default_credentials: true - - name: Configure canary build - if: | + if: |- matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && github.ref == 'refs/heads/main' shell: bash run: echo "DENO_CANARY=true" >> $GITHUB_ENV - - name: Set up incremental LTO and sysroot build if: matrix.use_sysroot - run: | + run: |- # Avoid running man-db triggers, which sometimes takes several minutes # to complete. sudo apt-get remove --purge -y man-db @@ -211,10 +188,9 @@ jobs: CC=clang-15 CFLAGS=-flto=thin --sysroot=/sysroot __0 - - name: Log versions shell: bash - run: | + run: |- node -v python --version rustc --version @@ -224,99 +200,75 @@ jobs: then deno --version fi - - 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: | + path: |- ~/.cargo/registry/index ~/.cargo/registry/cache ~/.cargo/git/db - key: 18-cargo-home-${{ matrix.os }}-${{ hashFiles('Cargo.lock') }} - - # In main branch, always creates fresh cache + key: '18-cargo-home-${{ matrix.os }}-${{ hashFiles(''Cargo.lock'') }}' - name: Cache build output (main) uses: actions/cache/save@v3 - if: (matrix.profile == 'release' || matrix.profile == 'fastci') && - github.ref == 'refs/heads/main' + if: (matrix.profile == 'release' || matrix.profile == 'fastci') && github.ref == 'refs/heads/main' with: - path: | + path: |- ./target !./target/*/gn_out !./target/*/*.zip !./target/*/*.tar.gz - key: | - 18-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ github.sha }} - - # Restore cache from the latest 'main' branch build. + 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: 'github.ref != ''refs/heads/main'' && !startsWith(github.ref, ''refs/tags/'')' with: - path: | + path: |- ./target !./target/*/gn_out !./target/*/*.zip !./target/*/*.tar.gz key: never_saved - restore-keys: | - 18-cargo-target-${{ matrix.os }}-${{ matrix.profile }}- - + 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: | + 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 - - 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' - # TODO(ry) assert matrix.profile == "debug" run: deno run --unstable --allow-write --allow-read --allow-run ./tools/lint.js - - name: Build debug - if: | + if: |- (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') run: cargo build --locked --all-targets env: CARGO_PROFILE_DEV_DEBUG: 0 - - name: Build release - if: | + 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/')))) run: cargo build --release --locked --all-targets - - name: Upload PR artifact (linux) - if: | + if: |- matrix.job == 'test' && matrix.profile == 'release' && (matrix.use_sysroot || (github.repository == 'denoland/deno' && @@ -324,115 +276,95 @@ jobs: startsWith(github.ref, 'refs/tags/')))) uses: actions/upload-artifact@v3 with: - name: deno-${{ github.event.number }} + name: 'deno-${{ github.event.number }}' path: target/release/deno - - name: Pre-release (linux) - if: | + if: |- startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' - run: | + 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: | + 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/')) - run: | + run: |- cd target/release zip -r deno-x86_64-apple-darwin.zip deno - - name: Pre-release (windows) - if: | + 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/')) - run: | - Compress-Archive -CompressionLevel Optimal -Force -Path target/release/deno.exe -DestinationPath target/release/deno-x86_64-pc-windows-msvc.zip - + 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: | + if: |- runner.os != 'Windows' && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && 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)/ - + 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: | + if: |- runner.os == 'Windows' && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && github.ref == 'refs/heads/main' env: - CLOUDSDK_PYTHON: ${{env.pythonLocation}}\python.exe + 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)/ - + 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: | + if: |- matrix.job == 'test' && matrix.profile == 'debug' && !startsWith(github.ref, 'refs/tags/') - run: | + run: |- cargo test --locked --doc cargo test --locked - - name: Test fastci if: (matrix.job == 'test' && matrix.profile == 'fastci') run: cargo test --locked env: CARGO_PROFILE_DEV_DEBUG: 0 - - name: Test release - if: | + if: |- matrix.job == 'test' && matrix.profile == 'release' && (matrix.use_sysroot || ( github.repository == 'denoland/deno' && github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/'))) 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/') + 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' + 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: | + if: |- startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' && matrix.profile == 'debug' && github.ref == 'refs/heads/main' env: DENO_BIN: ./target/debug/deno - run: | + run: |- deno run --allow-env --allow-net --allow-read --allow-run \ --allow-write --unstable \ --lock=tools/deno.lock.json \ @@ -441,14 +373,13 @@ jobs: --allow-write --unstable \ --lock=tools/deno.lock.json \ ./tools/wpt.ts run --quiet --binary="$DENO_BIN" - - name: Run web platform tests (release) - if: | + if: |- startsWith(matrix.os, 'ubuntu') && matrix.job == 'test' && matrix.profile == 'release' && !startsWith(github.ref, 'refs/tags/') env: DENO_BIN: ./target/release/deno - run: | + run: |- deno run --allow-env --allow-net --allow-read --allow-run \ --allow-write --unstable \ --lock=tools/deno.lock.json \ @@ -460,25 +391,23 @@ jobs: --binary="$DENO_BIN" \ --json=wpt.json \ --wptreport=wptreport.json - - name: Upload wpt results to dl.deno.land continue-on-error: true - if: | + if: |- runner.os == 'Linux' && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/') - run: | + 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 - - name: Upload wpt results to wpt.fyi continue-on-error: true - if: | + if: |- runner.os == 'Linux' && matrix.job == 'test' && matrix.profile == 'release' && @@ -486,24 +415,22 @@ jobs: github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/') env: WPT_FYI_USER: deno - WPT_FYI_PW: ${{ secrets.WPT_FYI_PW }} - GITHUB_TOKEN: ${{ secrets.DENOBOT_PAT }} - run: | + 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 - - name: Run benchmarks - if: matrix.job == 'bench' && !startsWith(github.ref, 'refs/tags/') + if: 'matrix.job == ''bench'' && !startsWith(github.ref, ''refs/tags/'')' run: cargo bench --locked - - name: Post Benchmarks - if: | + if: |- matrix.job == 'bench' && github.repository == 'denoland/deno' && github.ref == 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/') env: - DENOBOT_PAT: ${{ secrets.DENOBOT_PAT }} - run: | + DENOBOT_PAT: '${{ secrets.DENOBOT_PAT }}' + run: |- git clone --depth 1 --branch gh-pages \ https://${DENOBOT_PAT}@github.com/denoland/benchmark_data.git \ gh-pages @@ -515,66 +442,56 @@ jobs: git add . 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/')) - run: | + 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" - - name: Worker info if: matrix.job == 'bench' - run: | + run: |- cat /proc/cpuinfo cat /proc/meminfo - - name: Upload release to dl.deno.land (unix) - if: | + if: |- runner.os != 'Windows' && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && 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/*/}/ - + 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: | + if: |- runner.os == 'Windows' && matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && startsWith(github.ref, 'refs/tags/') env: - CLOUDSDK_PYTHON: ${{env.pythonLocation}}\python.exe + 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/*/}/ - + 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: | + if: |- matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && startsWith(github.ref, 'refs/tags/') - run: | + 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: | + if: |- matrix.job == 'test' && matrix.profile == 'release' && github.repository == 'denoland/deno' && startsWith(github.ref, 'refs/tags/') env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' with: - files: | + 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 @@ -582,21 +499,20 @@ jobs: target/release/lib.deno.d.ts body_path: target/release/release-notes.md draft: true - publish-canary: name: publish canary runs-on: ubuntu-20.04 - needs: ["build"] + needs: + - build if: github.repository == 'denoland/deno' && github.ref == 'refs/heads/main' steps: - name: Setup gcloud uses: google-github-actions/setup-gcloud@v0 with: project_id: denoland - service_account_key: ${{ secrets.GCP_SA_KEY }} + service_account_key: '${{ secrets.GCP_SA_KEY }}' export_default_credentials: true - - name: Upload canary version file to dl.deno.land - run: | + run: |- echo ${{ github.sha }} > canary-latest.txt gsutil -h "Cache-Control: no-cache" cp canary-latest.txt gs://dl.deno.land/canary-latest.txt diff --git a/tools/deno.lock.json b/tools/deno.lock.json index 94fbf22c81..0117c5ed4f 100644 --- a/tools/deno.lock.json +++ b/tools/deno.lock.json @@ -124,5 +124,52 @@ "https://raw.githubusercontent.com/denoland/automation/0.16.0/helpers.ts": "5e6f51b15b94db597162f4bcea7e275ef0e0eccbaec940393d8dbabf44c195d7", "https://raw.githubusercontent.com/denoland/automation/0.16.0/mod.ts": "a5a905605448b872bb5671a3c36f6f022a32509f9bff8a932c68b7db9e1d5cd5", "https://raw.githubusercontent.com/denoland/automation/0.16.0/releases_md.ts": "b30eb02a3ea3da70807c491dc4fe5b8185b91b84fc33bb27a6f2cd8a2aa09c7c", - "https://raw.githubusercontent.com/denoland/automation/0.16.0/repo.ts": "5185c18effbddda1caa21e1353ab57e56a2bf03a918769b98202da8ef9a25811" + "https://raw.githubusercontent.com/denoland/automation/0.16.0/repo.ts": "5185c18effbddda1caa21e1353ab57e56a2bf03a918769b98202da8ef9a25811", + "https://deno.land/std@0.171.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", + "https://deno.land/std@0.171.0/bytes/bytes_list.ts": "b4cbdfd2c263a13e8a904b12d082f6177ea97d9297274a4be134e989450dfa6a", + "https://deno.land/std@0.171.0/bytes/concat.ts": "d26d6f3d7922e6d663dacfcd357563b7bf4a380ce5b9c2bbe0c8586662f25ce2", + "https://deno.land/std@0.171.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219", + "https://deno.land/std@0.171.0/encoding/_yaml/dumper/dumper.ts": "49053c293a2250b33f2efc0ce3973280c6dc3bc0b41397af3863b5f03340e01b", + "https://deno.land/std@0.171.0/encoding/_yaml/dumper/dumper_state.ts": "975a3702752a29251c5746206507dfebbfede60dd2c0dec161dc22633fbc6085", + "https://deno.land/std@0.171.0/encoding/_yaml/error.ts": "e60ab51d7c0253cf0d1cf7d445202e8e3da5c77aae0032071ba7400121c281b4", + "https://deno.land/std@0.171.0/encoding/_yaml/loader/loader.ts": "6c59f60faaf78d73db0e016293f4bfed19e6356d7064230d07d6b68a65a1df5d", + "https://deno.land/std@0.171.0/encoding/_yaml/loader/loader_state.ts": "fcc82fcdf167acb0e9e5e32b32682e58b45f2d44210bf685794797ccb5621232", + "https://deno.land/std@0.171.0/encoding/_yaml/mark.ts": "0027d6f62a70a6c64b85bd1751ddf1646ea97edcefbf5bea1706d5e519f4e34f", + "https://deno.land/std@0.171.0/encoding/_yaml/parse.ts": "63e79582e07145ca1d3205d1ac72b82bf5ce14159dabae195abe7e36de8111bd", + "https://deno.land/std@0.171.0/encoding/_yaml/schema.ts": "0833c75c59bf72c8a8f96f6c0615bcd98d23fdd9b076657f42b5c1a4f9d972b0", + "https://deno.land/std@0.171.0/encoding/_yaml/schema/core.ts": "366f56673336ba24f5723c04319efcc7471be5f55d5f8d95c9b4a38ec233d4c6", + "https://deno.land/std@0.171.0/encoding/_yaml/schema/default.ts": "96e9ed6ead36f53a0832c542fc9b8cca7f8b4a67c1c8424e1423a39ee7154db7", + "https://deno.land/std@0.171.0/encoding/_yaml/schema/extended.ts": "f9bd75c79ebdfb92a8e167488b6bde7113a31b8fabe20ad7eed0904fba11bcd2", + "https://deno.land/std@0.171.0/encoding/_yaml/schema/failsafe.ts": "cddcbf0258bbe0cd77ca10e2f5aec13439f50d4068f96aab08ca2d64496dabe8", + "https://deno.land/std@0.171.0/encoding/_yaml/schema/json.ts": "c86905dfb1b6c4633750bfbb5bd529a30be5c08287ab7eb6694390b40e276487", + "https://deno.land/std@0.171.0/encoding/_yaml/schema/mod.ts": "051f93dd97a15aaad2da62bd24627e8fd2f02fb026d21567d924b720d606f078", + "https://deno.land/std@0.171.0/encoding/_yaml/state.ts": "ef03d55ec235d48dcfbecc0ab3ade90bfae69a61094846e08003421c2cf5cfc6", + "https://deno.land/std@0.171.0/encoding/_yaml/stringify.ts": "426b73e4dbaeed26ed855add3862786d7e374bd4c59e5e1bd9a6fcd5082be3c7", + "https://deno.land/std@0.171.0/encoding/_yaml/type.ts": "5ded5472a0f17a219ac3b0e90d96dc8472a68654a40258a31e03a6c6297b6788", + "https://deno.land/std@0.171.0/encoding/_yaml/type/binary.ts": "935d39794420ac3718d26716192239de6a53566c6f2ba5010e8ed26936b94a89", + "https://deno.land/std@0.171.0/encoding/_yaml/type/bool.ts": "1c99cfbaa94b022575b636a73e1549569b26fc6bbff2cd5e539aa77b49bdf303", + "https://deno.land/std@0.171.0/encoding/_yaml/type/float.ts": "f60ad19b27050add694bfc255b7efef27103f047861aa657823ff3f6853bad11", + "https://deno.land/std@0.171.0/encoding/_yaml/type/function.ts": "65a37f6bef43ef141854ee48a1058d9c9c4c80ed6eed6cd35608329a6957e27a", + "https://deno.land/std@0.171.0/encoding/_yaml/type/int.ts": "892f59bb7b2dbd64dd9b643c17441af95c0b962ad027e454cb84a68864787b86", + "https://deno.land/std@0.171.0/encoding/_yaml/type/map.ts": "92e647a6aec0dc184ea4b039a77a15883b54da754311189c595b43f6aaa50030", + "https://deno.land/std@0.171.0/encoding/_yaml/type/merge.ts": "8192bf3e4d637f32567917f48bb276043da9cf729cf594e5ec191f7cd229337e", + "https://deno.land/std@0.171.0/encoding/_yaml/type/mod.ts": "060e2b3d38725094b77ea3a3f05fc7e671fced8e67ca18e525be98c4aa8f4bbb", + "https://deno.land/std@0.171.0/encoding/_yaml/type/nil.ts": "606e8f0c44d73117c81abec822f89ef81e40f712258c74f186baa1af659b8887", + "https://deno.land/std@0.171.0/encoding/_yaml/type/omap.ts": "fbd5da9970c211335ff7c8fa11e9c5e9256e568d52418ac237d1538c5cb0d5e6", + "https://deno.land/std@0.171.0/encoding/_yaml/type/pairs.ts": "ea487a44c0ae64d8d952779fa1cb5fa0a12f32a0b5d3d1e8c1f06f446448427c", + "https://deno.land/std@0.171.0/encoding/_yaml/type/regexp.ts": "672000d22a1062d61577d30b218c28f5cb1d039a7a60079fdde6a4e558d5ca51", + "https://deno.land/std@0.171.0/encoding/_yaml/type/seq.ts": "39b28f7c7aa41263c5c42cab9d184f03555e9ba19493766afc0c0c325a9ac49f", + "https://deno.land/std@0.171.0/encoding/_yaml/type/set.ts": "0e30a9f750306b514c8ae9869d1ac2548d57beab55b33e85ea9673ca0a08264c", + "https://deno.land/std@0.171.0/encoding/_yaml/type/str.ts": "a67a3c6e429d95041399e964015511779b1130ea5889fa257c48457bd3446e31", + "https://deno.land/std@0.171.0/encoding/_yaml/type/timestamp.ts": "706ea80a76a73e48efaeb400ace087da1f927647b53ad6f754f4e06d51af087f", + "https://deno.land/std@0.171.0/encoding/_yaml/type/undefined.ts": "94a316ca450597ccbc6750cbd79097ad0d5f3a019797eed3c841a040c29540ba", + "https://deno.land/std@0.171.0/encoding/_yaml/utils.ts": "26b311f0d42a7ce025060bd6320a68b50e52fd24a839581eb31734cd48e20393", + "https://deno.land/std@0.171.0/encoding/yaml.ts": "02571d1bbbcfd7c5647789cee872ecf9c1c470e1b1a40948ed219fb661e19d87", + "https://deno.land/std@0.171.0/io/buf_reader.ts": "90a7adcb3638d8e1361695cdf844d58bcd97c41711dc6f9f8acc0626ebe097f5", + "https://deno.land/std@0.171.0/io/buf_writer.ts": "759c69d304b04d2909976f2a03a24a107276fbd81ed13593c5c2d43d104b52f3", + "https://deno.land/std@0.171.0/io/buffer.ts": "24abd4a65403ca3fdffcb6d3f985b0285adfd785f1311ce681708a21126776ad", + "https://deno.land/std@0.171.0/io/read_delim.ts": "7e102c66f00a118fa1e1ccd4abb080496f43766686907fd8b9522fdf85443586", + "https://deno.land/std@0.171.0/io/read_lines.ts": "baee9e35034f2fdfccf63bc24b7e3cb45aa1c1c5de26d178f7bcbc572e87772f", + "https://deno.land/std@0.171.0/io/read_string_delim.ts": "46eb0c9db3547caf8c759631effa200bbe48924f9b34f41edc627bde36cee52d", + "https://deno.land/std@0.171.0/types.d.ts": "220ed56662a0bd393ba5d124aa6ae2ad36a00d2fcbc0e8666a65f4606aaa9784" }