Skip to content

Avoid updating too many gists each time #188

Avoid updating too many gists each time

Avoid updating too many gists each time #188

Workflow file for this run

name: CI
on:
push:
branches:
- '**'
jobs:
test-rust:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
rust: [stable, nightly]
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ matrix.rust }}
- uses: Homebrew/actions/setup-homebrew@master
- name: Install protobuf
run: brew install protobuf
- name: Test and check (stable)
run: |
make COUNT_ALLOCATIONS=1 check
if: matrix.rust == 'stable'
- name: Test and check (nightly)
run: |
rustup component add clippy rustfmt --toolchain nightly
make NIGHTLY=1 check
make check-simd
if: matrix.rust == 'nightly'
continue-on-error: true
test-webgpu:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: install swiftshader
shell: bash
run: |
set -e
mkdir -p swiftshader
curl -LsSf https://github.com/gfx-rs/ci-build/releases/latest/download/swiftshader-linux-x86_64.tar.xz | tar -xf - -C swiftshader
echo "VK_ICD_FILENAMES=$PWD/swiftshader/vk_swiftshader_icd.json" >> "$GITHUB_ENV"
- name: install llvmpipe, vulkan sdk
shell: bash
run: |
set -e
sudo apt-get update -y -qq
wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list
sudo apt-get update
sudo apt install -y libegl1-mesa libgl1-mesa-dri libxcb-xfixes0-dev vulkan-sdk
- run: cargo test --features webgpu-compute
working-directory: crates/core
test-rust-wasi:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-wasi
- run: rustc --version
- uses: Homebrew/actions/setup-homebrew@master
- run: brew install wasmtime
- run: cargo install cargo-wasi
- run: cargo wasi test -- --nocapture
working-directory: crates/core
test-c-and-cxx-bindings:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- if: ${{ matrix.os == 'ubuntu-latest' }}
uses: Homebrew/actions/setup-homebrew@master
- if: ${{ matrix.os == 'ubuntu-latest' }}
run: sudo apt-get update && sudo apt-get -y install libc6-dbg && brew install valgrind
- run: make test-c-and-cxx-bindings
test-python:
runs-on: ubuntu-latest
strategy:
matrix:
# Await https://github.com/python/cpython/pull/112253 before 3.12
python-version: ['3.9', '3.11']
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Test with Python ${{ matrix.python-version }}
run: make test-python
test-wasm:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [ '14.x', 'latest' ]
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
registry-url: 'https://registry.npmjs.org'
- uses: Homebrew/actions/setup-homebrew@master
- name: Install wasm-opt
run: brew update && brew install binaryen
- run: curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash
- run: cargo binstall --no-confirm wasm-bindgen-cli
- name: Test with Node ${{ matrix.node-version }}
run: make node-package
benchmark:
strategy:
matrix:
tested-commit: [new, old]
runs-on: ubuntu-latest
steps:
- name: Checkout current commit
uses: actions/checkout@v4
with:
fetch-depth: 2
if: matrix.tested-commit == 'new' || github.event_name != 'pull_request'
- name: Checkout base branch (${{ github.base_ref }} of pull request
uses: actions/checkout@v4
with:
ref: ${{ github.base_ref }}
if: matrix.tested-commit == 'old' && github.event_name == 'pull_request'
- name: Checkout previous commit
run: git checkout HEAD~1
if: matrix.tested-commit == 'old' && github.ref == 'refs/heads/main'
- uses: dtolnay/rust-toolchain@stable
- uses: Homebrew/actions/setup-homebrew@master
- run: brew install valgrind
- name: Run benchmark on ${{ matrix.tested-commit }} commit
run: ./run-iai-benchmark.py > ${{ matrix.tested-commit }}-baseline.json
working-directory: crates/core
- name: Upload benchmark
uses: actions/upload-artifact@v3
with:
name: ${{ matrix.tested-commit }}-benchmark
path: crates/core/${{ matrix.tested-commit }}-baseline.json
compare-benchmarks:
needs: [benchmark]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download new benchmark
uses: actions/download-artifact@v3
with:
name: new-benchmark
- name: Download old benchmark
uses: actions/download-artifact@v3
with:
name: old-benchmark
- uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Format commit comment
id: get-comment-body
run: |
body=$(./.github/workflows/compare-iai.py old-baseline.json new-baseline.json)
delimiter="$(openssl rand -hex 8)"
{ echo "body<<$delimiter"; echo "$body"; echo "$delimiter"; } >> "$GITHUB_OUTPUT"
- name: Post commit comment
uses: peter-evans/commit-comment@v3
with:
body: ${{ steps.get-comment-body.outputs.body }}
fuzz-afl:
runs-on: ubuntu-latest
# Allow failures as LLVM is not always available for installation:
continue-on-error: true
steps:
- name: Check out source code
uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- run: sudo apt-get install llvm
- name: Fuzz with AFL
run: AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1 AFL_BENCH_UNTIL_CRASH=1 make fuzz-afl
- name: Upload crashes found by fuzzing
uses: actions/upload-artifact@v3
with:
path: ./crates/fuzzing-afl/target/fuzz-findings/default/crashes
name: fuzzing-crashes-afl
fuzz-libfuzzer:
runs-on: ubuntu-latest
steps:
- name: Check out source code
uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: nightly
- name: Fuzz with libfuzzer
run: timeout 1800s make fuzz-libfuzzer
continue-on-error: true
- name: Upload crashes found by fuzzing
uses: actions/upload-artifact@v3
with:
path: crates/fuzzing-libfuzzer/fuzz/artifacts/fuzz_target/
name: fuzzing-crashes-libfuzzer
fuzz-honggfuzz:
runs-on: ubuntu-latest
steps:
- name: Check out source code
uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Install honggfuzz dependencies
run: sudo apt-get update && sudo apt-get -y install build-essential binutils-dev libunwind-dev libblocksruntime-dev liblzma-dev
- name: Fuzz with honggfuzz
run: make fuzz-hfuzz
env:
# See https://github.com/google/honggfuzz/blob/master/docs/USAGE.md
HFUZZ_RUN_ARGS: "--timeout 10 --run_time 1800 --exit_upon_crash"
- name: Upload crashes found by fuzzing
uses: actions/upload-artifact@v3
with:
path: crates/fuzzing-hfuzz/hfuzz_workspace/advent-of-code-fuzzing-hfuzz/*.fuzz
name: fuzzing-crashes-honggfuzz
coverage:
runs-on: ubuntu-latest
container:
image: xd009642/tarpaulin
options: --security-opt seccomp=unconfined
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Generate code coverage
run: cargo tarpaulin --verbose --timeout 720 --out xml
working-directory: crates/core
- name: Upload to codecov.io
uses: codecov/codecov-action@v3
with:
directory: crates/core
actionlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download actionlint
id: get_actionlint
run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
- name: Check workflow files
run: ${{ steps.get_actionlint.outputs.executable }} -color
check-js:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 'lts/*'
- name: Check js
run: npm install && npm run check
working-directory: crates/wasm
gist-mapping:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install requests
run: pip install requests
- name: Update gist mapping
run: ./update-gists.py && git add gist-mapping.json
working-directory: crates/wasm/site
env:
GIST_API_TOKEN: ${{ secrets.GIST_API_TOKEN }}
- name: Tests gists
run: ./validate-gists.py
working-directory: crates/wasm/site
- name: Commit and push gist mapping if updated
run: |
if [ -n "$(git status --untracked-files=no --porcelain)" ]; then
git config --global user.name 'Gist Mapping Updater'
git config --global user.email '[email protected]'
git commit -m 'Update gist-mapping'
git push
fi
- name: Upload new gist-mapping.json
uses: actions/upload-artifact@v3
with:
name: gist-mapping
path: crates/wasm/site/gist-mapping.json
deploy-site:
if: github.ref == 'refs/heads/main'
needs: [benchmark, gist-mapping]
runs-on: ubuntu-latest
# Permissions necessary for ${{ secrets.GITHUB_TOKEN }}
# to allow cloudflare/pages-action to create deployment:
# https://developers.cloudflare.com/pages/how-to/use-direct-upload-with-continuous-integration/
permissions:
contents: read
deployments: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.x'
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: nightly
targets: wasm32-unknown-unknown
- uses: actions/setup-node@v4
with:
node-version: 'lts/*'
registry-url: 'https://registry.npmjs.org'
- uses: Homebrew/actions/setup-homebrew@master
- name: Install wasm-opt
run: brew update && brew install binaryen
- run: curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash
- run: cargo binstall --no-confirm wasm-bindgen-cli
- name: Download new gist-mapping.json
uses: actions/download-artifact@v3
with:
name: gist-mapping
path: crates/wasm/site
- name: Download new benchmark
uses: actions/download-artifact@v3
with:
name: new-benchmark
path: crates/wasm/site/benchmark
- name: Setup site to deploy
run: make deploy-site
- name: Deploy site to cloudflare
uses: cloudflare/pages-action@1
with:
apiToken: ${{ secrets.CLOUDFLARE_PAGES_EDIT_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: aoc-fornwall-net
directory: crates/wasm/aoc.fornwall.net
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
- name: Install the Netlify CLI
run: npm install netlify-cli -g
- name: Deploy to Netlify
run: make netlify
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_API_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
deploy-cloudflare-worker:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-node@v4
with:
node-version: 'lts/*'
registry-url: 'https://registry.npmjs.org'
- uses: Homebrew/actions/setup-homebrew@master
- name: Install wasm-opt
run: brew update && brew install binaryen
- name: Work around https://github.com/rustwasm/wasm-pack/issues/1263
run: |
mkdir /home/linuxbrew/.linuxbrew/bin/bin
cp /home/linuxbrew/.linuxbrew/bin/wasm-opt /home/linuxbrew/.linuxbrew/bin/bin/wasm-opt
- name: Deploy to Cloudflare
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: c494646a87f38a82ce35ea24edaada52
working-directory: crates/worker
run: npx wrangler publish
build-and-deploy-http-server:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- run: cargo install cross
- uses: superfly/flyctl-actions/setup-flyctl@master
- name: Build and deploy docker image
working-directory: crates/http-server
env:
DOCKER_IMAGE_NAME: fredrikfornwall/advent-of-code-http-server
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
FLY_PROJECT_PATH: crates/grpc-server
run: |
cross build --release --target x86_64-unknown-linux-musl
strip -s ../../target/x86_64-unknown-linux-musl/release/advent-of-code-server
IMAGE_WITH_VERSION=${DOCKER_IMAGE_NAME}:${GITHUB_SHA}
mkdir -p target/linux/amd64
cp ../../target/x86_64-unknown-linux-musl/release/advent-of-code-server target/linux/amd64/
docker buildx build --tag "${IMAGE_WITH_VERSION}" .
flyctl deploy --image "${IMAGE_WITH_VERSION}"
if: github.ref == 'refs/heads/main'
build-and-deploy-grpc-server:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- run: cargo install cross
- uses: superfly/flyctl-actions/setup-flyctl@master
- name: Build and deploy docker image
working-directory: crates/grpc-server
env:
DOCKER_IMAGE_NAME: fredrikfornwall/advent-of-code-grpc-server
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
FLY_PROJECT_PATH: crates/grpc-server
run: |
cross build --release --target x86_64-unknown-linux-musl
strip -s ../../target/x86_64-unknown-linux-musl/release/advent-of-code-grpc-server
IMAGE_WITH_VERSION=${DOCKER_IMAGE_NAME}:${GITHUB_SHA}
mkdir -p target/linux/amd64
cp ../../target/x86_64-unknown-linux-musl/release/advent-of-code-grpc-server target/linux/amd64/
docker buildx build --tag "${IMAGE_WITH_VERSION}" .
flyctl deploy --image "${IMAGE_WITH_VERSION}"
if: github.ref == 'refs/heads/main'