Skip to content

Nightly

Nightly #35

Workflow file for this run

name: Nightly
on:
workflow_call:
schedule:
- cron: "0 6 * * *"
workflow_dispatch:
permissions:
contents: read
env:
# mise-action hashes the sorted tool arguments into its cache key.
# https://github.com/jdx/mise-action/blob/3c2e0cf82a5b2e5249f0d3635a4d83d0ae861518/src/index.ts#L1079-L1127
MUTATION_TOOLS: >-
just jq uv cargo:cargo-mutants github:nextest-rs/nextest
github:Shopify/toxiproxy
concurrency:
group: nightly-${{ github.ref }}
cancel-in-progress: false
jobs:
analysis:
name: ${{ matrix.recipe }}
strategy:
fail-fast: false
matrix:
recipe: [features, direct-minimum, miri, loom]
runs-on: ubuntu-24.04
timeout-minutes: 180
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: ./.github/actions/setup
with:
toolchain: nightly
components: miri,rust-src
tools: just cargo:cargo-hack
- run: just "$RECIPE"
env:
RECIPE: ${{ matrix.recipe }}
sanitizer-build:
name: sanitizer-address build
runs-on: ubuntu-24.04
timeout-minutes: 180
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: ./.github/actions/setup
with:
toolchain: nightly
components: rust-src
tools: just github:nextest-rs/nextest
- run: just sanitizer-archive .tox/sanitizer-address.tar.zst
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: sanitizer-address
path: .tox/sanitizer-address.tar.zst
if-no-files-found: error
compression-level: 0
retention-days: 1
sanitizer:
name: sanitizer-address (${{ matrix.partition }}/8)
needs: sanitizer-build
strategy:
fail-fast: false
matrix:
partition: [1, 2, 3, 4, 5, 6, 7, 8]
runs-on: ubuntu-24.04
timeout-minutes: 120
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: ./.github/actions/setup
with:
toolchain: nightly
tools: >-
just uv github:nextest-rs/nextest github:Shopify/toxiproxy
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: sanitizer-address
path: .tox/sanitizer
- run: just sanitizer-run .tox/sanitizer/sanitizer-address.tar.zst "slice:$PARTITION/8"
env:
PARTITION: ${{ matrix.partition }}
mutation-baseline-build:
runs-on: ubuntu-24.04
timeout-minutes: 180
outputs:
shard_count: ${{ steps.shards.outputs.count }}
shards: ${{ steps.shards.outputs.indices }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: ./.github/actions/setup
with:
tools: ${{ env.MUTATION_TOOLS }}
- run: just mutation-baseline-archive .tox/mutation-baseline.tar.zst
- id: shards
run: |
mutants=$(just mutation-count)
shards=$(just mutation-shard-count "$mutants" 128)
echo "Planning $mutants mutants across $shards shards"
echo "count=$shards" >> "$GITHUB_OUTPUT"
echo "indices=$(jq --null-input --compact-output --argjson count "$shards" '[range(0; $count)]')" >> "$GITHUB_OUTPUT"
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: mutation-baseline
path: .tox/mutation-baseline.tar.zst
if-no-files-found: error
compression-level: 0
retention-days: 1
mutation-baseline:
name: mutation baseline (${{ matrix.partition }}/8)
needs: mutation-baseline-build
strategy:
fail-fast: false
matrix:
partition: [1, 2, 3, 4, 5, 6, 7, 8]
runs-on: ubuntu-24.04
timeout-minutes: 60
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: ./.github/actions/setup
with:
tools: >-
just uv github:nextest-rs/nextest github:Shopify/toxiproxy
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: mutation-baseline
path: .tox/mutation-baseline
- run: just mutation-baseline-run .tox/mutation-baseline/mutation-baseline.tar.zst "slice:$PARTITION/8"
env:
PARTITION: ${{ matrix.partition }}
mutation:
name: mutation (${{ matrix.shard }}/${{ needs.mutation-baseline-build.outputs.shard_count }})
needs: [mutation-baseline-build, mutation-baseline]
strategy:
fail-fast: false
# GitHub Team runs at most 60 standard hosted jobs concurrently.
# https://docs.github.com/en/actions/reference/limits#job-concurrency-limits-for-github-hosted-runners
max-parallel: 60
matrix:
shard: ${{ fromJSON(needs.mutation-baseline-build.outputs.shards) }}
runs-on: ubuntu-24.04
timeout-minutes: 180
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: ./.github/actions/setup
with:
tools: ${{ env.MUTATION_TOOLS }}
- run: just mutation-observed "$SHARD/$SHARD_COUNT" true 1 skip 500 round-robin
env:
SHARD: ${{ matrix.shard }}
SHARD_COUNT: ${{ needs.mutation-baseline-build.outputs.shard_count }}
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always()
with:
name: mutation-${{ matrix.shard }}-${{ needs.mutation-baseline-build.outputs.shard_count }}
path: .tox/mutants
if-no-files-found: error
fuzz:
name: fuzz (${{ matrix.target }})
strategy:
fail-fast: false
matrix:
include:
- package: peryx-ecosystem-pypi
target: pypi_filename
- package: peryx-ecosystem-oci
target: oci_reference
- package: peryx-ecosystem-oci
target: oci_manifest
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: ./.github/actions/setup
with:
toolchain: nightly
tools: just cargo:cargo-fuzz
- run: just fuzz "$PACKAGE" "$TARGET" 60
env:
PACKAGE: ${{ matrix.package }}
TARGET: ${{ matrix.target }}
live-client:
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: ./.github/actions/setup
with:
tools: just uv github:nextest-rs/nextest
- run: just e2e-live