From 5cbc517a38a4e66f7c3ca451bc910e82ab34fb45 Mon Sep 17 00:00:00 2001 From: Valentin Lemaire <40760287+28Pollux28@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:07:46 +0200 Subject: [PATCH 1/3] Upgrade Go and golangci-lint actions in CI workflow --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b83c51..d994dde 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version-file: galvanize-instancer/go.mod cache-dependency-path: galvanize-instancer/go.sum @@ -28,13 +28,13 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version-file: galvanize-instancer/go.mod cache-dependency-path: galvanize-instancer/go.sum - name: Run golangci-lint - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v9 with: version: latest working-directory: galvanize-instancer From f2c80885a554be46ebbc2c33823495075c4209b5 Mon Sep 17 00:00:00 2001 From: 28Pollux28 Date: Tue, 2 Jun 2026 17:52:03 +0200 Subject: [PATCH 2/3] Fix golangci-lint issues flagged by upgraded linter Fix 13 linting errors across 8 files: - errcheck (7): explicitly discard error returns with _ in loadtest.go, main.go, and ssh.go - ineffassign (1): remove ineffectual `job = nil` assignment in pool.go - staticcheck S1002 (4): simplify bool comparisons in compose.go, restserver.go, and restserver_admin.go - unused (1): remove unused normalizePublishedPorts function in published_ports.go Co-Authored-By: Claude Opus 4.7 --- .../internal/ansible/published_ports.go | 11 ----------- galvanize-instancer/internal/docker/compose.go | 2 +- galvanize-instancer/internal/loadtest/loadtest.go | 10 +++++----- galvanize-instancer/main.go | 2 +- galvanize-instancer/pkg/restserver.go | 4 ++-- galvanize-instancer/pkg/restserver_admin.go | 2 +- galvanize-instancer/pkg/utils/ssh.go | 2 +- galvanize-instancer/pkg/worker/pool.go | 1 - 8 files changed, 11 insertions(+), 23 deletions(-) diff --git a/galvanize-instancer/internal/ansible/published_ports.go b/galvanize-instancer/internal/ansible/published_ports.go index 135d676..abb8c30 100644 --- a/galvanize-instancer/internal/ansible/published_ports.go +++ b/galvanize-instancer/internal/ansible/published_ports.go @@ -13,17 +13,6 @@ var knownDockerProtocols = map[string]struct{}{ "sctp": {}, } -// normalizePublishedPorts supports optional protocol hints in published_ports, -// e.g. "22/ssh" or "8080:80/http". -// -// It returns: -// - a shallow-copied deploy params map where published_ports entries are made Docker-compatible, -// - a target-port to connection-scheme map used when building connection info. -func normalizePublishedPorts(params map[string]interface{}) (map[string]interface{}, map[int]string) { - normalized, hints, _ := normalizePublishedPortsWithState(params, false, nil, false) - return normalized, hints -} - func randomizableContainerPorts(params map[string]interface{}) []string { rawPorts, ok := params["published_ports"] if !ok { diff --git a/galvanize-instancer/internal/docker/compose.go b/galvanize-instancer/internal/docker/compose.go index 5a5f9f0..6559558 100644 --- a/galvanize-instancer/internal/docker/compose.go +++ b/galvanize-instancer/internal/docker/compose.go @@ -36,7 +36,7 @@ func SanitizeProjectName(name string) string { func BuildComposeProject(unique bool, challengeName, teamID string) string { var composeProject string - if unique == true { + if unique { composeProject = "global-" + challengeName composeProject = SanitizeProjectName(composeProject) } else { diff --git a/galvanize-instancer/internal/loadtest/loadtest.go b/galvanize-instancer/internal/loadtest/loadtest.go index 5b46169..09e4974 100644 --- a/galvanize-instancer/internal/loadtest/loadtest.go +++ b/galvanize-instancer/internal/loadtest/loadtest.go @@ -304,9 +304,9 @@ func (s *stats) report(out io.Writer, phase string, elapsed time.Duration) { minLatency = 0 } - fmt.Fprintf(out, "\nPhase %s\n", phase) - fmt.Fprintf(out, " Duration: %s\n", elapsed) - fmt.Fprintf(out, " Total: %d Success: %d Errors: %d\n", total, success, errors) + _, _ = fmt.Fprintf(out, "\nPhase %s\n", phase) + _, _ = fmt.Fprintf(out, " Duration: %s\n", elapsed) + _, _ = fmt.Fprintf(out, " Total: %d Success: %d Errors: %d\n", total, success, errors) fmt.Fprintf(out, " Latency: min %s avg %s max %s\n", minLatency, avgLatency, maxLatency) s.mu.Lock() @@ -315,10 +315,10 @@ func (s *stats) report(out io.Writer, phase string, elapsed time.Duration) { for code, count := range s.statuses { fmt.Fprintf(out, " %d=%d", code, count) } - fmt.Fprintln(out, "") + _, _ = fmt.Fprintln(out, "") } if len(s.errSamples) > 0 { - fmt.Fprintln(out, " Error samples:") + _, _ = fmt.Fprintln(out, " Error samples:") for _, sample := range s.errSamples { fmt.Fprintf(out, " - %s\n", sample) } diff --git a/galvanize-instancer/main.go b/galvanize-instancer/main.go index d93db49..e0b9a55 100755 --- a/galvanize-instancer/main.go +++ b/galvanize-instancer/main.go @@ -15,7 +15,7 @@ func main() { } else { logger.Init(false) } - defer zap.L().Sync() + defer func() { _ = zap.L().Sync() }() cmd.SetVersion(Version) cmd.Execute() } diff --git a/galvanize-instancer/pkg/restserver.go b/galvanize-instancer/pkg/restserver.go index 06c3757..ec814bc 100755 --- a/galvanize-instancer/pkg/restserver.go +++ b/galvanize-instancer/pkg/restserver.go @@ -152,7 +152,7 @@ func (s *Server) DeployInstance(ctx echo.Context) error { zap.S().Errorf("Failed to get challenge infos: %v", err) return ctx.JSON(400, api.Error{Message: utils.HTTP500Debug(fmt.Sprintf("Failed to get challenge info: %v", err))}) //TODO notify admin } - if chall.Unique == true { + if chall.Unique { zap.S().Errorf("Attempt to deploy unique challenge %s for team %s", req.ChallengeName, claims.TeamID) return ctx.JSON(403, api.Error{Message: utils.Ptr("Unauthorized")}) } @@ -238,7 +238,7 @@ func (s *Server) GetInstanceStatus(ctx echo.Context) error { return ctx.JSON(400, api.Error{Message: utils.Ptr("Invalid challenge")}) } var deployment *models.Deployment - if chall.Unique == true { + if chall.Unique { zap.S().Debugf("Status request received for challenge %s", chall.Name) deployment, err = models.GetUniqueDeployment(s.db, chall.Category, chall.Name, false) } else { diff --git a/galvanize-instancer/pkg/restserver_admin.go b/galvanize-instancer/pkg/restserver_admin.go index 1e5fa9c..9fd871d 100644 --- a/galvanize-instancer/pkg/restserver_admin.go +++ b/galvanize-instancer/pkg/restserver_admin.go @@ -91,7 +91,7 @@ func (s *Server) DeployAdminInstance(ctx echo.Context) error { zap.S().Errorf("Failed to get challenge infos: %v", err) return ctx.JSON(400, api.Error{Message: utils.Ptr(fmt.Sprintf("Failed to get challenge info: %v", err))}) } - if chall.Unique != true { + if !chall.Unique { zap.S().Errorf("Attempt to admin-deploy non-unique challenge %s", req.ChallengeName) return ctx.JSON(400, api.Error{Message: utils.Ptr("Challenge is not unique")}) } diff --git a/galvanize-instancer/pkg/utils/ssh.go b/galvanize-instancer/pkg/utils/ssh.go index ffd19bd..9c86c62 100644 --- a/galvanize-instancer/pkg/utils/ssh.go +++ b/galvanize-instancer/pkg/utils/ssh.go @@ -43,7 +43,7 @@ func RegisterSSHHosts(cfg *config.Config) error { if err != nil { return err } - defer f.Close() + defer func() { _ = f.Close() }() // Register all hosts that need it for _, host := range hostsToRegister { diff --git a/galvanize-instancer/pkg/worker/pool.go b/galvanize-instancer/pkg/worker/pool.go index 6f6dfac..47ffc0f 100644 --- a/galvanize-instancer/pkg/worker/pool.go +++ b/galvanize-instancer/pkg/worker/pool.go @@ -132,7 +132,6 @@ func (p *Pool) runWorker(ctx context.Context, workerID string) { } p.processJob(ctx, workerID, job) - job = nil // Help GC // Aggressively free memory after each job since Ansible processes are memory-heavy runtime.GC() From 49c14890778597d83fa83881193c73ea0baa2246 Mon Sep 17 00:00:00 2001 From: 28Pollux28 Date: Tue, 2 Jun 2026 18:00:30 +0200 Subject: [PATCH 3/3] Fix remaining errcheck issues in loadtest.go Explicitly discard error returns from fmt.Fprintf on lines 310, 314, 316, 323. Co-Authored-By: Claude Opus 4.7 <> --- galvanize-instancer/internal/loadtest/loadtest.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/galvanize-instancer/internal/loadtest/loadtest.go b/galvanize-instancer/internal/loadtest/loadtest.go index 09e4974..c0474f6 100644 --- a/galvanize-instancer/internal/loadtest/loadtest.go +++ b/galvanize-instancer/internal/loadtest/loadtest.go @@ -307,20 +307,20 @@ func (s *stats) report(out io.Writer, phase string, elapsed time.Duration) { _, _ = fmt.Fprintf(out, "\nPhase %s\n", phase) _, _ = fmt.Fprintf(out, " Duration: %s\n", elapsed) _, _ = fmt.Fprintf(out, " Total: %d Success: %d Errors: %d\n", total, success, errors) - fmt.Fprintf(out, " Latency: min %s avg %s max %s\n", minLatency, avgLatency, maxLatency) + _, _ = fmt.Fprintf(out, " Latency: min %s avg %s max %s\n", minLatency, avgLatency, maxLatency) s.mu.Lock() if len(s.statuses) > 0 { - fmt.Fprintf(out, " Status counts:") + _, _ = fmt.Fprintf(out, " Status counts:") for code, count := range s.statuses { - fmt.Fprintf(out, " %d=%d", code, count) + _, _ = fmt.Fprintf(out, " %d=%d", code, count) } _, _ = fmt.Fprintln(out, "") } if len(s.errSamples) > 0 { _, _ = fmt.Fprintln(out, " Error samples:") for _, sample := range s.errSamples { - fmt.Fprintf(out, " - %s\n", sample) + _, _ = fmt.Fprintf(out, " - %s\n", sample) } } s.mu.Unlock()