Skip to content

feat(ci): add comprehensive GitHub Actions workflows for CI/CD#1

Merged
tomkabel merged 9 commits intomainfrom
ci-cd-workflows
Apr 6, 2026
Merged

feat(ci): add comprehensive GitHub Actions workflows for CI/CD#1
tomkabel merged 9 commits intomainfrom
ci-cd-workflows

Conversation

@tomkabel
Copy link
Copy Markdown
Owner

@tomkabel tomkabel commented Apr 6, 2026

  • CI workflow: build, test, coverage with race detector
  • Lint workflow: golangci-lint, govet, staticcheck, actionlint
  • Security workflow: govulncheck, gosec, CodeQL, dependency review
  • Release workflow: GoReleaser integration for multi-platform builds
  • Dependencies workflow: automated weekly dependency updates
  • Add .goreleaser.yaml for release configuration

Fixes #0

Summary by CodeRabbit

  • Chores
    • Added CI workflows for build/test, coverage, cross-platform artifact builds, linting, and security scans
    • Added scheduled and manual dependency-update workflow that opens draft PRs for updates
    • Added release packaging configuration for cross-platform builds via automation
    • Bumped Go toolchain requirement to 1.25.0

- CI workflow: build, test, coverage with race detector
- Lint workflow: golangci-lint, govet, staticcheck, actionlint
- Security workflow: govulncheck, gosec, CodeQL, dependency review
- Release workflow: GoReleaser integration for multi-platform builds
- Dependencies workflow: automated weekly dependency updates
- Add .goreleaser.yaml for release configuration

Fixes #0
@tomkabel tomkabel added the enhancement New feature or request label Apr 6, 2026
@github-advanced-security
Copy link
Copy Markdown

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

Critical fixes:
- go.mod: update to Go 1.25.0 with proper module checksums (go mod tidy)
- golangci-lint: pin to v2.1.0 to support Go 1.25+ (not 'latest')
- actionlint: use 'shell: bash' and proper Go setup step
- gosec: remove invalid -exit-code=0 flag
- govulncheck: pin to v1.1.0 (not bare v1)
- ci.yml: replace 'go mod tidy + git diff' with 'go mod verify + go build'

Fixes #0
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 6, 2026

Warning

Rate limit exceeded

@tomkabel has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 18 minutes and 5 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 18 minutes and 5 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9ff901f4-a35f-48a2-bc2f-ff1b44310d3e

📥 Commits

Reviewing files that changed from the base of the PR and between ce1d80b and cd2e746.

📒 Files selected for processing (1)
  • .github/workflows/lint.yml
📝 Walkthrough

Walkthrough

Adds CI/CD infra: five GitHub Actions workflows (CI, lint, security, dependencies, release); a GoReleaser config for multi-platform releases; Go toolchain bumped to 1.25.0 with an indirect dependency change; and minor code/test edits to explicitly handle/discard returned errors. (50 words)

Changes

Cohort / File(s) Summary
CI Workflow
\.github/workflows/ci.yml
New CI workflow (runs on push/PR to main/master/develop) using Go 1.25 matrix, optional race-enabled tests producing coverage.out, module verification, and a cross-platform build job that uploads OS/arch-specific artifacts.
Linting Workflows
\.github/workflows/lint.yml
New lint pipeline with jobs: golangci-lint, gofmt, govet, staticcheck, and actionlint, each running on pushes and PRs with job-level timeouts.
Security Workflows
\.github/workflows/security.yml
New security pipeline: govulncheck, gosec, dependency-review (PR-only), CodeQL (Go, security-extended), and actionlint; runs on push/PR, weekly cron, and manual dispatch.
Dependency Automation
\.github/workflows/dependencies.yml
Scheduled and manual dependency updater that runs go get -u ./... and go mod tidy, then opens a draft PR via peter-evans/create-pull-request@v6 with labels and automated branch management.
Release Workflow
\.github/workflows/release.yml
Tag-triggered and manual release workflow that runs GoReleaser (goreleaser/goreleaser-action@v7) with full fetch, Go 1.25, and GITHUB_TOKEN to publish GitHub Releases.
GoReleaser Config
\.goreleaser.yaml
New GoReleaser config: single build fingerprintproxy for linux/darwin/windows (amd64, arm64), CGO_ENABLED=0, -s -w ldflags, embed version/commit/date, archives as tar.gz (zip for Windows), checksums enabled, GitHub Releases publishing enabled (social integrations disabled).
Go Module
go.mod
Bumped go directive from 1.24.1 to 1.25.0; removed indirect github.com/google/uuid and github.com/stretchr/testify; added indirect github.com/tomkabel/tls-client v1.7.7-barnius-4.
Source / Tests
main.go, main_test.go
Minor code/test hygiene: explicitly discard certain Close/Fprintln return values (_ = ...) and update tests to close response bodies via defer func() { _ = resp.Body.Close() }() and to check/handle errors from cache.GetOrCreate(...).

Sequence Diagram(s)

sequenceDiagram
  participant Dev as Developer
  participant GH as GitHub Actions
  participant Runner as Runner (ubuntu/macos/windows)
  participant Artifact as Artifact Store (Actions artifacts / Releases)
  participant Codecov as Codecov
  participant GoReleaser as GoReleaser

  Dev->>GH: push / pull_request / tag / schedule / dispatch
  GH->>Runner: start job (ci / lint / security / deps / release)
  Runner->>Codecov: upload coverage (test-coverage job)
  Runner->>Artifact: upload artifacts / coverage
  GH->>GoReleaser: run release job (on tag)
  GoReleaser->>Artifact: publish GitHub Release artifacts
  Artifact->>Dev: artifacts & release available
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰
Workflows burrow, tests take flight,
Linters hum from morn to night.
Security sniffs each hidden seam,
Releaser packs the release-day dream.
I hop with joy — CI's a gleam!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: adding comprehensive GitHub Actions workflows for CI/CD to the project.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ci-cd-workflows

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

- golangci-lint: upgrade action v6→v7 for golangci-lint v2 support
- govulncheck: fix action path golang/vuln-action@v1.1.0
- coverage: make codecov upload non-failing, add coverage summary step
- fix shellcheck issues in coverage summary step

Fixes #0
@codecov-commenter
Copy link
Copy Markdown

Welcome to Codecov 🎉

Once you merge this PR into your default branch, you're all set! Codecov will compare coverage reports and display results in all future pull requests.

ℹ️ You can also turn on project coverage checks and project coverage reporting on Pull Request comment

Thanks for integrating Codecov - We've got you covered ☂️

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 24-29: Remove the outdated Go 1.24 matrix lane: edit the CI
`strategy.matrix` so the `go-version` array no longer contains '1.24' and only
lists '1.25', and ensure the `include` entry that sets `race: true` references
the remaining '1.25' lane; update the `go-version` values in the matrix and any
`include` entries accordingly so the matrix and `go-version` entries are
consistent with the module's `go` directive.
- Around line 107-131: The macOS artifact is mislabeled as '-darwin-amd64' and
the Build step doesn't set GOARCH; update the matrix entry for macos-latest to
use '-darwin-arm64' (replace the include item that sets artifact_suffix) and
ensure the Build step sets GOARCH appropriately (e.g., export GOARCH=arm64 when
matrix.os == 'macos-latest' or derive GOARCH from runner architecture) before
running the go build command so the produced binary and matrix.artifact_suffix
(used by the go build -o fingerprintproxy${{ matrix.artifact_suffix }}) match
the actual architecture.

In @.github/workflows/release.yml:
- Around line 39-45: The release workflow fails because GoReleaser is configured
to sign artifacts but the workflow never supplies the required GPG environment
variables; update the release job that runs goreleaser/goreleaser-action@v7 to
export the GPG signing material (at minimum GPG_FINGERPRINT and any required
GPG_PRIVATE_KEY and GPG_PASSPHRASE) so GoReleaser can call gpg2 with {{
.Env.GPG_FINGERPRINT }}; add these env entries under the Run GoReleaser step (or
load them from repository/organization secrets) and ensure the action receives
the private key in a form the action expects (e.g., base64-encoded
GPG_PRIVATE_KEY) and any passphrase as GPG_PASSPHRASE.
- Around line 7-12: Remove the unused workflow_dispatch input named "version":
delete the "version" entry under workflow_dispatch inputs so the workflow only
exposes dispatching without a misleading version parameter; update any
references to workflow_dispatch in the file if present to confirm there's no
reliance on the "version" input and leave GoReleaser to derive the release from
the Git tag as intended.

In @.github/workflows/security.yml:
- Around line 71-86: The dependency-review job ("dependency-review") currently
runs regardless of event type but actions/dependency-review-action@v4 requires
pull request context; update the workflow trigger so this job only runs for
pull_request events (or add a job-level conditional like checking
github.event_name == 'pull_request') so that actions/dependency-review-action@v4
executes only on PR diffs and not on push/schedule/workflow_dispatch events.

In @.goreleaser.yaml:
- Around line 68-72: The release.github.name is currently using the full
GITHUB_REPOSITORY (owner/repo); change it to use only the repo name by
extracting the part after the slash. Update the value for release.github.name to
use a Go template that splits GITHUB_REPOSITORY and takes the last segment
(e.g., replace "{{ .Env.GITHUB_REPOSITORY }}" with a template that does split
"/" and last) so release.github.name contains only the repository name.
- Around line 31-57: The GoReleaser v2 config mixes incompatible fields: remove
checksum, signature, and fingerprint from the archives entry and instead define
a single top-level checksum section named checksum with proper fields (e.g.,
algorithm, ids) replacing checksums, and update the signs entry to use artifacts
(plural) not artifact and point it at checksum; ensure any fingerprint
references ({{ .Env.GPG_FINGERPRINT }}) are moved into the checksum and signs
entries as needed (e.g., fingerprint/ids in checksum and -u value in signs args)
and keep archives only with format/format_overrides/fingerprint removed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9e806d89-cd7e-4427-a6ba-8185ebb63b6b

📥 Commits

Reviewing files that changed from the base of the PR and between ff1eb48 and a3bb89c.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (7)
  • .github/workflows/ci.yml
  • .github/workflows/dependencies.yml
  • .github/workflows/lint.yml
  • .github/workflows/release.yml
  • .github/workflows/security.yml
  • .goreleaser.yaml
  • go.mod

Comment thread .github/workflows/ci.yml
Comment thread .github/workflows/ci.yml
Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/release.yml
Comment thread .github/workflows/security.yml
Comment thread .goreleaser.yaml
Comment on lines +31 to +57
archives:
- id: default
format: tar.gz
format_overrides:
- goos: windows
format: zip
checksum: true
signature: true
fingerprint: {{ .Env.GPG_FINGERPRINT }}

checksums:
- algorithm: sha256
signature: true
fingerprint: {{ .Env.GPG_FINGERPRINT }}

signs:
- artifact: checksum
cmd: gpg2
args:
- "--batch"
- "-u"
- "{{ .Env.GPG_FINGERPRINT }}"
- "--output"
- "${signature}"
- "--detach-sign"
- "${artifact}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

GoReleaser v2 archives checksum signature configuration schema

💡 Result:

GoReleaser v2 config schema (JSON Schema)

  • Default (OSS): https://goreleaser.com/static/schema.json (goreleaser.com)
  • Pin to a specific GoReleaser tag (example shown in docs): https://raw.githubusercontent.com/goreleaser/goreleaser/v2.15.2/www/docs/static/schema.json (goreleaser.com)
  • Or generate for your installed version: goreleaser jsonschema -o schema.json (goreleaser.com)

Add to your config for editor validation:

# yaml-language-server: $schema=https://goreleaser.com/static/schema.json

(goreleaser.com)

Relevant configuration sections

archives (archives configuration)

archives is a list where you customize archive output (name/files/format, etc.). (goreleaser.com)

checksum (checksums file)

Key fields in checksum include:

  • name_template
  • algorithm (sha256/sha512/… including sha3-, blake2, blake3)
  • split (one checksum file per artifact)
  • ids (which artifacts to include)
  • disable
  • extra_files / templated_extra_files (templated is Pro) (goreleaser.com)

signs (signatures)

Signing is configured with a signs: list; commonly you sign the checksum artifact:

signs:
  - artifacts: checksum

(goreleaser.com)

Per-sign entry fields include:

  • id
  • signature (output signature filename template; default ${artifact}.sig)
  • cmd (default gpg)
  • args (default includes --output ${signature} --detach-sign ${artifact})
  • artifacts (e.g., checksum, archive, all, etc.)
  • ids (filter by artifact IDs)
  • stdin / stdin_file
  • certificate (useful for keyless/cosign flows)
  • env
  • output (show signer stdout/stderr; since v2.13) (goreleaser.com)

Citations:


🌐 Web query:

GoReleaser v2 signs artifacts configuration reference

💡 Result:

GoReleaser v2: signs (signing artifacts) — config reference

Configure in .goreleaser.yaml under signs:. The minimal (recommended) setup is signing the checksum file(s):

signs:
  - artifacts: checksum

[1]

All signs fields (v2):

  • id (string, unique; default default) [1]
  • signature (string; default ${artifact}.sig; templates allowed) [1]
  • cmd (string; default gpg) [1]
  • args (list of strings; default ["--output","${signature}","--detach-sign","${artifact}"]; templates allowed) [1]
  • artifacts (what to sign; default none) — valid values: none, all, checksum, source, package, installer (Pro), diskimage (Pro), archive, sbom, binary (only when archives.format: binary; otherwise use binary_signs) [1]
  • ids (list of artifact IDs to include; no effect for checksum/source) [1]
  • if (artifact filter expression; Pro; since v2.2; templates allowed) [1]
  • stdin (string; templates allowed) [1]
  • stdin_file (path) [1]
  • certificate (string name; templates allowed; useful for keyless cosign flows) [1]
  • env (list of KEY=value passed to the signing command; templates available) [1]
  • output (bool; show signer stdout/stderr; templates allowed; since v2.13) [1]

Template variables available in templated fields: ${artifact}, ${artifactID}, ${certificate}, ${signature}. [1]


GoReleaser v2: binary_signs (sign binaries before archiving)

Since v2.2, use binary_signs to sign binaries directly (works regardless of archive format):

binary_signs:
  - {}

It supports similar fields (e.g., cmd, args, artifacts: binary, ids, env, output) and the same ${artifact}/${signature}-style variables. [2]


🌐 Web query:

GoReleaser v2 checksums singular vs plural configuration

💡 Result:

In GoReleaser v2, the configuration block is singular:

checksum:
  name_template: "{{ .ProjectName }}_{{ .Version }}_checksums.txt"
  algorithm: sha256
  split: false
  ids: []

That’s the only supported top-level key—checksums: (plural) is not a valid config section and will be treated as an unknown/unused field (e.g., goreleaser check should complain). The official docs and the v2 config schema both define it as checksum. [1], [2]

Sources:
[1] GoReleaser “Checksums” docs (shows checksum:) (goreleaser.com)
[2] GoReleaser v2 config model (Project.Checksum tagged yaml:"checksum,omitempty") (pkg.go.dev)

Citations:


Fix the GoReleaser v2 checksum and signing configuration schema.

The current configuration mixes incompatible fields: archives should not contain checksum, signature, or fingerprint fields; the top-level section must be singular checksum: (not checksums:); and the signs section must use artifacts: (not artifact:). These schema mismatches will cause config validation failures. Per GoReleaser v2 documentation:

  • archives defines archive format and output, not checksums or signing
  • checksum: (singular) is the valid top-level section with fields like algorithm, ids, etc.
  • signs: entries use artifacts: to specify what to sign (e.g., artifacts: checksum)
Suggested fix
 archives:
   - id: default
     format: tar.gz
     format_overrides:
       - goos: windows
         format: zip
-    checksum: true
-    signature: true
-    fingerprint: {{ .Env.GPG_FINGERPRINT }}

-checksums:
-  - algorithm: sha256
-    signature: true
-    fingerprint: {{ .Env.GPG_FINGERPRINT }}
+checksum:
+  algorithm: sha256

 signs:
-  - artifact: checksum
+  - artifacts: checksum
     cmd: gpg2
     args:
       - "--batch"
       - "-u"
       - "{{ .Env.GPG_FINGERPRINT }}"
       - "--output"
       - "${signature}"
       - "--detach-sign"
       - "${artifact}"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.goreleaser.yaml around lines 31 - 57, The GoReleaser v2 config mixes
incompatible fields: remove checksum, signature, and fingerprint from the
archives entry and instead define a single top-level checksum section named
checksum with proper fields (e.g., algorithm, ids) replacing checksums, and
update the signs entry to use artifacts (plural) not artifact and point it at
checksum; ensure any fingerprint references ({{ .Env.GPG_FINGERPRINT }}) are
moved into the checksum and signs entries as needed (e.g., fingerprint/ids in
checksum and -u value in signs args) and keep archives only with
format/format_overrides/fingerprint removed.

Comment thread .goreleaser.yaml Outdated
Comment on lines +68 to +72
release:
github:
enabled: true
owner: "{{ .Env.GITHUB_REPOSITORY_OWNER }}"
name: "{{ .Env.GITHUB_REPOSITORY }}"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

find . -name ".goreleaser.yaml" -o -name "goreleaser.yml" | head -5

Repository: tomkabel/fingerprintproxy

Length of output: 87


🏁 Script executed:

cat -n .goreleaser.yaml | sed -n '60,80p'

Repository: tomkabel/fingerprintproxy

Length of output: 377


🌐 Web query:

goreleaser release.github.name owner/repo format GITHUB_REPOSITORY environment variable

💡 Result:

In GoReleaser, release.github.name is just the repository name (e.g., repo), and the owner/org goes in release.github.owner (e.g., owner). It is not an owner/repo combined field. [1]

In GitHub Actions, GITHUB_REPOSITORY is in owner/repo format (example: octocat/Hello-World). [3]

So if you want to derive owner and name from GITHUB_REPOSITORY, split it:

release:
  github:
    owner: '{{ index (split .Env.GITHUB_REPOSITORY "/") 0 }}'
    name:  '{{ index (split .Env.GITHUB_REPOSITORY "/") 1 }}'

GoReleaser templates can read environment variables via .Env and provide a split function for this. [2]


release.github.name should be the repository name only, not owner/repo.

The environment variable GITHUB_REPOSITORY is in owner/repo format (e.g., tomkabel/fingerprintproxy). GoReleaser's release.github.name field expects only the repository name. Passing the full value results in an incorrect release slug.

🛠️ Suggested fix
 release:
   github:
     enabled: true
     owner: "{{ .Env.GITHUB_REPOSITORY_OWNER }}"
-    name: "{{ .Env.GITHUB_REPOSITORY }}"
+    name: "fingerprintproxy"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.goreleaser.yaml around lines 68 - 72, The release.github.name is currently
using the full GITHUB_REPOSITORY (owner/repo); change it to use only the repo
name by extracting the part after the slash. Update the value for
release.github.name to use a Go template that splits GITHUB_REPOSITORY and takes
the last segment (e.g., replace "{{ .Env.GITHUB_REPOSITORY }}" with a template
that does split "/" and last) so release.github.name contains only the
repository name.

Your Name added 5 commits April 7, 2026 01:11
- golangci-lint: v2.1.0 → v2.11.4 (supports Go 1.25)
- govulncheck: use golang/govulncheck-action@v1 (correct repo)

Fixes #0
- main.go: add _ to fmt.Fprintln, ln.Close(), c.Close()
- main_test.go: fix unchecked resp.Body.Close() in two integration tests
- main_test.go: handle GetOrCreate return values in TestCacheLength

These changes satisfy errcheck linter requirements.

Fixes #0
CI workflow:
- Remove Go 1.24 from matrix (only test 1.25)
- Fix macOS artifact: darwin-amd64 → darwin-arm64
- Add GOARCH environment variable based on OS

Release workflow:
- Remove unused workflow_dispatch version input
- Disable signing in GoReleaser config (no GPG material)

Security workflow:
- Add if: github.event_name == 'pull_request' to dependency-review

GoReleaser config:
- Remove checksum/signature/fingerprint from archives (incompatible in v2)
- Remove signs section (no GPG configured)
- Simplify release config to just github.enabled: true

Fixes #0
- Add goarch to matrix include entries for each OS
- Replace shell case statement with matrix.goarch variable
- Use direct GOARCH=${{ matrix.goarch }} before go build

The shell case statement caused syntax errors on macOS and Windows runners.

Fixes #0
- Move GOARCH from inline bash syntax to YAML env block
- Prevents PowerShell syntax errors on Windows runners
- Works consistently across Linux, macOS, and Windows

Fixes #0
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/lint.yml:
- Around line 101-105: The workflow uses unpinned tool installs for the "Install
staticcheck" (run: go install honnef.co/go/tools/cmd/staticcheck@latest) and the
related "Run staticcheck" step, so change the "Install staticcheck" step to
install a specific version (use an environment variable like STATICCHECK_VERSION
and replace `@latest` with that variable) and update any other similar tool
installation steps (e.g., actionlint installation) to use pinned version
variables; ensure the workflow defines these version environment variables at
the top or in the job and reference them in the run commands so builds are
reproducible and not tied to `@latest`.
- Around line 52-58: The workflow job that runs gofmt ("Check formatting") does
not install a specific Go version, causing nondeterministic checks; add the
actions/setup-go@v5 step (set to 1.25) before running gofmt in that job so the
runner uses the same Go 1.25 toolchain as the other lint jobs and ensures
consistent formatting results.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 915a5fa1-57b2-4d92-b18e-912060035414

📥 Commits

Reviewing files that changed from the base of the PR and between c5e4dc6 and ce1d80b.

📒 Files selected for processing (7)
  • .github/workflows/ci.yml
  • .github/workflows/lint.yml
  • .github/workflows/release.yml
  • .github/workflows/security.yml
  • .goreleaser.yaml
  • main.go
  • main_test.go
✅ Files skipped from review due to trivial changes (4)
  • main.go
  • .github/workflows/security.yml
  • .github/workflows/release.yml
  • .github/workflows/ci.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .goreleaser.yaml

Comment thread .github/workflows/lint.yml
Comment thread .github/workflows/lint.yml
- Add STATICCHECK_VERSION and ACTIONLINT_VERSION env vars
- Pin staticcheck and actionlint to specific versions
- Add Set up Go step before running gofmt check
- Ensure consistent, reproducible CI builds
@tomkabel tomkabel merged commit cede207 into main Apr 6, 2026
18 checks passed
@tomkabel tomkabel deleted the ci-cd-workflows branch April 6, 2026 22:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants