Nightly #35
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |