diff --git a/.github/workflows/benchmarks.yaml b/.github/workflows/benchmarks.yaml index c80a582..de5fd45 100644 --- a/.github/workflows/benchmarks.yaml +++ b/.github/workflows/benchmarks.yaml @@ -37,12 +37,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false - name: Setup .NET - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: | 10.0.x diff --git a/.github/workflows/build-all-versions.yaml b/.github/workflows/build-all-versions.yaml index 9e77141..150c67f 100644 --- a/.github/workflows/build-all-versions.yaml +++ b/.github/workflows/build-all-versions.yaml @@ -25,13 +25,13 @@ jobs: steps: - name: Checkout repository (full history + all tags) - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-depth: 0 # Full history so all tags are reachable persist-credentials: false - name: Setup .NET - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: | 5.0.x diff --git a/.github/workflows/codeql.yaml b/.github/workflows/codeql.yaml index 0b2b6f9..29a43fc 100644 --- a/.github/workflows/codeql.yaml +++ b/.github/workflows/codeql.yaml @@ -31,7 +31,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false @@ -77,7 +77,7 @@ jobs: - name: Initialize CodeQL if: steps.check-csharp.outputs.has-csharp == 'true' - uses: github/codeql-action/init@v4 + uses: github/codeql-action/init@e0647621c2984b5ed2f768cb892365bf2a616ad1 # v4 with: languages: ${{ matrix.language }} # security-extended adds the broader security query pack on top of the @@ -86,7 +86,7 @@ jobs: - name: Setup .NET if: steps.check-csharp.outputs.has-csharp == 'true' - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: '10.0.x' @@ -159,7 +159,7 @@ jobs: - name: Perform CodeQL Analysis id: perform-codeql-analysis if: steps.check-csharp.outputs.has-csharp == 'true' - uses: github/codeql-action/analyze@v4 + uses: github/codeql-action/analyze@e0647621c2984b5ed2f768cb892365bf2a616ad1 # v4 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/docfx.yaml b/.github/workflows/docfx.yaml index 4f08c31..c0279e9 100644 --- a/.github/workflows/docfx.yaml +++ b/.github/workflows/docfx.yaml @@ -60,7 +60,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-depth: 0 # Full history needed to enumerate all v* tags persist-credentials: false @@ -127,7 +127,7 @@ jobs: } - name: Setup .NET - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: | 5.0.x diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index f062a57..4e59bf4 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -42,7 +42,7 @@ jobs: if: github.repository != 'Chris-Wolfgang/repo-template' steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: ref: refs/pull/${{ github.event.pull_request.number }}/head persist-credentials: false @@ -96,7 +96,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: ref: refs/pull/${{ github.event.pull_request.number }}/head persist-credentials: false @@ -251,7 +251,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: ref: refs/pull/${{ github.event.pull_request.number }}/head persist-credentials: false @@ -338,7 +338,7 @@ jobs: sudo rm /etc/apt/sources.list.d/focal-security.list - name: Setup .NET - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: | 3.1.x @@ -626,7 +626,7 @@ jobs: - name: Upload Linux coverage results if: always() - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: coverage-linux path: | @@ -634,7 +634,7 @@ jobs: CoverageReport/ - name: Upload build artifacts - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: build-output path: | @@ -652,7 +652,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: ref: refs/pull/${{ github.event.pull_request.number }}/head persist-credentials: false @@ -720,7 +720,7 @@ jobs: Write-Host "✅ Configuration files secured - using versions from main branch" - name: Setup .NET - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: | 3.1.x @@ -958,7 +958,7 @@ jobs: - name: Upload Windows coverage results if: always() - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: coverage-windows path: | @@ -976,7 +976,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: ref: refs/pull/${{ github.event.pull_request.number }}/head persist-credentials: false @@ -1048,7 +1048,7 @@ jobs: echo "✅ Configuration files secured - using versions from main branch" - name: Setup .NET - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: | 6.0.x @@ -1313,7 +1313,7 @@ jobs: - name: Upload macOS coverage results if: always() - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: coverage-macos path: | @@ -1363,7 +1363,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: ref: refs/pull/${{ github.event.pull_request.number }}/head persist-credentials: false @@ -1468,7 +1468,7 @@ jobs: - name: Upload security scan results if: always() - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: devskim-results path: devskim-results.txt diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index d6c43d4..ad50826 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -26,7 +26,7 @@ jobs: if: github.repository != 'Chris-Wolfgang/repo-template' steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false @@ -85,7 +85,7 @@ jobs: } - name: Setup .NET - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: | 3.1.x @@ -340,7 +340,7 @@ jobs: - name: Upload coverage report if: always() - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: release-coverage path: CoverageReport/ @@ -354,12 +354,12 @@ jobs: has-packages: ${{ steps.check-packages.outputs.has-packages }} steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false - name: Setup .NET - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: | 3.1.x @@ -562,7 +562,7 @@ jobs: - name: Upload NuGet packages - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: nuget-packages path: ./nuget-packages/ @@ -581,7 +581,7 @@ jobs: if: github.repository != 'Chris-Wolfgang/repo-template' steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false @@ -598,7 +598,7 @@ jobs: - name: Setup .NET if: steps.check.outputs.found == 'true' - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: # Install the same SDK set as validate-release so dotnet build can # compile every TFM the solution targets (some test projects span @@ -674,7 +674,7 @@ jobs: runs-on: windows-latest steps: - name: Setup .NET - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: | 3.1.x @@ -686,7 +686,7 @@ jobs: 10.0.x - name: Download packages - uses: actions/download-artifact@v8.0.1 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: nuget-packages path: ./packages @@ -758,13 +758,13 @@ jobs: contents: write # Required to upload assets to the GitHub Release steps: - name: Download NuGet packages artifact - uses: actions/download-artifact@v8.0.1 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: nuget-packages path: ./nuget-packages - name: Download coverage report artifact - uses: actions/download-artifact@v8.0.1 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: release-coverage path: ./release-coverage diff --git a/.github/workflows/sourcelink-stepinto.yaml b/.github/workflows/sourcelink-stepinto.yaml index 593867d..8b9ecff 100644 --- a/.github/workflows/sourcelink-stepinto.yaml +++ b/.github/workflows/sourcelink-stepinto.yaml @@ -47,7 +47,7 @@ jobs: timeout-minutes: 20 steps: - name: Checkout code - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false @@ -63,7 +63,7 @@ jobs: - name: Setup .NET if: steps.detect.outputs.found == 'true' - uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: '10.0.x' diff --git a/.github/workflows/sourcelink.yaml b/.github/workflows/sourcelink.yaml index 1ffd5df..abbc94b 100644 --- a/.github/workflows/sourcelink.yaml +++ b/.github/workflows/sourcelink.yaml @@ -40,7 +40,7 @@ jobs: timeout-minutes: 10 steps: - name: Checkout code - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false @@ -56,7 +56,7 @@ jobs: - name: Setup .NET if: steps.detect.outputs.found == 'true' - uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: '10.0.x' diff --git a/.github/workflows/stryker.yaml b/.github/workflows/stryker.yaml index 576059c..5eafc46 100644 --- a/.github/workflows/stryker.yaml +++ b/.github/workflows/stryker.yaml @@ -43,7 +43,7 @@ jobs: timeout-minutes: 120 steps: - name: Check out repo - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false @@ -52,7 +52,7 @@ jobs: # through .NET 10.0). Stryker has to be able to build whichever # TFM each test project targets; pinning to a subset would # silently fail repos that target older runtimes. - uses: actions/setup-dotnet@v6 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: dotnet-version: | 3.1.x @@ -123,7 +123,7 @@ jobs: - name: Upload Stryker report if: always() - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: stryker-report-${{ github.run_id }} path: | diff --git a/.zizmor.yml b/.zizmor.yml new file mode 100644 index 0000000..f9d2374 --- /dev/null +++ b/.zizmor.yml @@ -0,0 +1,14 @@ +# zizmor configuration (#143 follow-up). +# +# NOTE: zizmor does NOT auto-discover this file — it must be passed explicitly +# with `--config .zizmor.yml` on every invocation (see actions-audit.yaml). +# +# Every action in .github/workflows/** is pinned to a full commit SHA with a +# `# vX` version comment (fleet SHA-pin convention). Enforce that: require a +# hash pin for all actions, so a future tag-pin (`@v7`) or unpinned ref is +# flagged by the `unpinned-uses` rule. +rules: + unpinned-uses: + config: + policies: + "*": hash-pin