diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bff3a3c..1fa4ce4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,17 +26,19 @@ jobs: os: [ubuntu-latest, macos-latest, windows-latest] go: ['1.27.x'] runs-on: ${{ matrix.os }} + timeout-minutes: 15 defaults: run: shell: bash steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 + persist-credentials: false - name: Setup Go - uses: actions/setup-go@v7 + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 with: go-version: ${{ matrix.go }} cache: true @@ -51,7 +53,7 @@ jobs: run: go test -race -coverprofile=coverage.out -covermode=atomic ./... - name: Upload coverage to Codecov - uses: codecov/codecov-action@v7 + uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 continue-on-error: true with: files: ./coverage.out @@ -61,18 +63,21 @@ jobs: lint: name: golangci-lint runs-on: ubuntu-latest + timeout-minutes: 10 steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Setup Go - uses: actions/setup-go@v7 + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 with: go-version: '1.27.x' cache: true - name: golangci-lint - uses: golangci/golangci-lint-action@v9 + uses: golangci/golangci-lint-action@ba0d7d2ec06a0ea1cb5fa41b2e4a3ab91d21278a # v9.3.0 with: version: latest args: --timeout=5m @@ -80,12 +85,15 @@ jobs: vuln: name: govulncheck runs-on: ubuntu-latest + timeout-minutes: 10 steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Setup Go - uses: actions/setup-go@v7 + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 with: go-version: '1.27.x' cache: true @@ -99,14 +107,16 @@ jobs: build: name: build binary runs-on: ubuntu-latest + timeout-minutes: 10 steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 + persist-credentials: false - name: Setup Go - uses: actions/setup-go@v7 + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 with: go-version: '1.27.x' cache: true @@ -115,7 +125,7 @@ jobs: run: make build - name: Upload artifact - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: okf-linux-amd64 path: bin/okf diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c48f73b..ec220ca 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,40 +8,47 @@ on: tags: - 'v*.*.*' -permissions: - contents: write - packages: write - id-token: write +# Least-privilege default; the goreleaser job grants itself the write scopes +# it needs. +permissions: {} jobs: goreleaser: name: goreleaser runs-on: ubuntu-latest + timeout-minutes: 30 + # Protected environment gating the tap-push secret (TAP_APP_PRIVATE_KEY); + # its deployment policy only allows v*.*.* tags. + environment: release + permissions: + contents: write # create the GitHub Release + upload assets + id-token: write # cosign keyless signing (OIDC) steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 fetch-tags: true + persist-credentials: false - name: Setup Go - uses: actions/setup-go@v7 + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 with: go-version: '1.27.x' cache: true - name: Install Syft (SBOM generator) - uses: anchore/sbom-action/download-syft@v0 + uses: anchore/sbom-action/download-syft@3ad7283483fc7af8ff2b4ea19663c2d5ca935e26 # v0.24.2 - name: Install Cosign - uses: sigstore/cosign-installer@v4.1.2 + uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2 # Short-lived installation token for pushing the cask to homebrew-okf. # The App has Contents read/write on that one repository only; the # token expires after an hour and is revoked when the job ends. - name: Mint tap push token id: tap-token - uses: actions/create-github-app-token@v3 + uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 with: client-id: ${{ vars.TAP_APP_CLIENT_ID }} private-key: ${{ secrets.TAP_APP_PRIVATE_KEY }} @@ -49,7 +56,7 @@ jobs: repositories: homebrew-okf - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v7 + uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94 # v7.2.3 with: distribution: goreleaser version: latest