From 19818a1493d465f81f1b2a03fffffe502bcbf716 Mon Sep 17 00:00:00 2001 From: Karol Szwaj Date: Fri, 20 Mar 2026 20:01:56 +0100 Subject: [PATCH 1/6] Bump Go to 1.25.8 Signed-off-by: Karol Szwaj On-behalf-of: @SAP karol.szwaj@sap.com --- .github/workflows/ci.yaml | 10 +++++----- .github/workflows/docs-gen-and-push.yaml | 2 +- .github/workflows/goreleaser.yaml | 4 ++-- .github/workflows/image.yaml | 18 +++++++++--------- .ko.yaml | 2 +- Dockerfile | 6 +++--- Dockerfile.konnector | 4 ++-- cli/go.mod | 2 +- contrib/kcp/go.mod | 2 +- docs/generators/cli-doc/go.mod | 2 +- go.mod | 4 ++-- sdk/go.mod | 2 +- web/go.mod | 2 +- 13 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 77021021a..c8e5ae50c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -30,7 +30,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.4 + go-version: v1.25.8 - uses: actions/setup-node@v4 with: node-version: '20' @@ -45,7 +45,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.4 + go-version: v1.25.8 - uses: actions/setup-node@v4 with: node-version: '20' @@ -60,7 +60,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.4 + go-version: v1.25.8 - run: make test lint: @@ -70,7 +70,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.4 + go-version: v1.25.8 - run: make lint verify: @@ -80,5 +80,5 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.4 + go-version: v1.25.8 - run: make verify diff --git a/.github/workflows/docs-gen-and-push.yaml b/.github/workflows/docs-gen-and-push.yaml index 30247e79b..a3c6f62a0 100644 --- a/.github/workflows/docs-gen-and-push.yaml +++ b/.github/workflows/docs-gen-and-push.yaml @@ -34,7 +34,7 @@ jobs: - uses: actions/setup-go@v5 with: - go-version: v1.25.4 + go-version: v1.25.8 cache: true - uses: actions/setup-python@v5 diff --git a/.github/workflows/goreleaser.yaml b/.github/workflows/goreleaser.yaml index 70020f9e2..3706b9638 100644 --- a/.github/workflows/goreleaser.yaml +++ b/.github/workflows/goreleaser.yaml @@ -22,7 +22,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-go@v5 with: - go-version: v1.25.4 + go-version: v1.25.8 - name: Delete non-semver tags run: 'git tag -d $(git tag -l | grep -v "^v")' - name: Set LDFLAGS @@ -51,4 +51,4 @@ jobs: if: ${{ always() }} with: name: binaries - path: dist/*.tar.gz \ No newline at end of file + path: dist/*.tar.gz diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 3bb07909a..6829ef77f 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.4 + go-version: v1.25.8 check-latest: true # We need this to remove local tags that are not semver so goreleaser doesn't get confused. @@ -33,7 +33,7 @@ jobs: # If you notice signing errors, you may need to update the cosign version. - uses: sigstore/cosign-installer@v3.7.0 - + - name: Install Helm uses: azure/setup-helm@v3 with: @@ -43,7 +43,7 @@ jobs: run: echo LDFLAGS="$(make ldflags)" | tee -a >> $GITHUB_ENV # Login to GitHub Container Registry (used by both ko and Docker) - - name: Login to GitHub Container Registry + - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io @@ -134,7 +134,7 @@ jobs: run: | # Login to GitHub Container Registry for Helm echo "${{ github.token }}" | helm registry login ghcr.io --username ${{ github.actor }} --password-stdin - + # Set chart version - use tag name if available, otherwise use semver format if [[ "${{ github.ref_type }}" == "tag" ]]; then CHART_VERSION="${{ github.ref_name }}" @@ -143,23 +143,23 @@ jobs: else CHART_VERSION="0.0.0-${{ github.sha }}" fi - + # Package and push each chart in deploy/charts/ for chart_dir in deploy/charts/*/; do if [ -f "${chart_dir}Chart.yaml" ]; then chart_name=$(basename "$chart_dir") echo "Processing chart: $chart_name" - + # Update chart version and appVersion in Chart.yaml sed -i "s/^version:.*/version: ${CHART_VERSION}/" "${chart_dir}Chart.yaml" sed -i "s/^appVersion:.*/appVersion: ${CHART_VERSION}/" "${chart_dir}Chart.yaml" - + # Package the chart helm package "$chart_dir" --version "${CHART_VERSION}" - + # Push to GitHub Container Registry helm push "${chart_name}-${CHART_VERSION}.tgz" "oci://ghcr.io/${{ github.repository_owner }}/charts" - + echo "Helm chart pushed to oci://ghcr.io/${{ github.repository_owner }}/charts/${chart_name}:${CHART_VERSION}" fi done diff --git a/.ko.yaml b/.ko.yaml index f7e63ddc7..0e427d049 100644 --- a/.ko.yaml +++ b/.ko.yaml @@ -1,5 +1,5 @@ baseImageOverrides: - github.com/google/ko: golang:1.25.4 + github.com/google/ko: golang:1.25.8 builds: - id: konnector diff --git a/Dockerfile b/Dockerfile index fdb417f99..bcd5d73fe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,7 @@ FROM node:20.18.0-alpine3.20 AS ui-build-env WORKDIR /app # Install build dependencies needed for native modules -RUN apk add --no-cache python3 make g++ +RUN apk add --no-cache python3 make g++ # Copy package files COPY ./web/package*.json ./ @@ -39,7 +39,7 @@ ENV VITE_BUILD_TARGET=docker RUN npm run build # Build Go binary with embedded UI assets -FROM golang:1.25.4 AS go-build-env +FROM golang:1.25.8 AS go-build-env WORKDIR /app # Accept build arguments for multi-arch support @@ -75,4 +75,4 @@ COPY --from=ui-build-env /app/dist /www -ENTRYPOINT ["/bin/backend"] \ No newline at end of file +ENTRYPOINT ["/bin/backend"] diff --git a/Dockerfile.konnector b/Dockerfile.konnector index 1d39f8231..ad37f2962 100644 --- a/Dockerfile.konnector +++ b/Dockerfile.konnector @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM golang:1.25.4 AS builder +FROM golang:1.25.8 AS builder WORKDIR /app # Accept build arguments for multi-arch support @@ -32,4 +32,4 @@ RUN apk --update add ca-certificates COPY --from=builder /app/bin/konnector /bin/konnector -ENTRYPOINT ["/bin/konnector"] \ No newline at end of file +ENTRYPOINT ["/bin/konnector"] diff --git a/cli/go.mod b/cli/go.mod index 2f9b359e3..0800cdb7a 100644 --- a/cli/go.mod +++ b/cli/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/cli -go 1.24.0 +go 1.25.8 replace ( github.com/kube-bind/kube-bind => ../ diff --git a/contrib/kcp/go.mod b/contrib/kcp/go.mod index edf9b430f..5d97bee1f 100644 --- a/contrib/kcp/go.mod +++ b/contrib/kcp/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/contrib/kcp -go 1.24.0 +go 1.25.8 replace ( github.com/kube-bind/kube-bind => ../../ diff --git a/docs/generators/cli-doc/go.mod b/docs/generators/cli-doc/go.mod index 5ad32cf2a..5b3495ab6 100644 --- a/docs/generators/cli-doc/go.mod +++ b/docs/generators/cli-doc/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/docs/generators/cli-doc -go 1.24.0 +go 1.25.8 replace ( github.com/kube-bind/kube-bind => ../../../ diff --git a/go.mod b/go.mod index f80daa423..516a96709 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ module github.com/kube-bind/kube-bind // The script hack/verify-go-versions.sh checks that all version // references across the codebase are consistent with the versions // maintained here. -// go-build-version 1.25.4 -go 1.24.0 +// go-build-version 1.25.8 +go 1.25.8 replace ( github.com/kube-bind/kube-bind => ./ diff --git a/sdk/go.mod b/sdk/go.mod index 8fab528f1..a16d4388f 100644 --- a/sdk/go.mod +++ b/sdk/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/sdk -go 1.24.0 +go 1.25.8 require ( github.com/google/go-cmp v0.7.0 diff --git a/web/go.mod b/web/go.mod index 566894671..322b0fa4a 100644 --- a/web/go.mod +++ b/web/go.mod @@ -1,3 +1,3 @@ module github.com/kube-bind/kube-bind/web -go 1.24.0 +go 1.25.8 From dd9328afc24d5a670fdba9f509bb521671d21efb Mon Sep 17 00:00:00 2001 From: Karol Szwaj Date: Mon, 30 Mar 2026 14:30:04 +0200 Subject: [PATCH 2/6] Bump Go to 1.26.1, update golangci-lint and fix all linter issues Signed-off-by: Karol Szwaj On-behalf-of: @SAP karol.szwaj@sap.com --- .github/workflows/ci.yaml | 10 +++---- .github/workflows/docs-gen-and-push.yaml | 2 +- .github/workflows/goreleaser.yaml | 2 +- .github/workflows/image.yaml | 2 +- .golangci.yaml | 4 +++ .ko.yaml | 2 +- Dockerfile | 2 +- Dockerfile.konnector | 2 +- Makefile | 2 +- backend/auth/handler.go | 3 ++ .../serviceexportrequest_reconcile.go | 2 +- backend/oidc/oidc_test.go | 13 ++++++-- backend/options/serve.go | 4 ++- cli/go.mod | 2 +- cli/pkg/kubectl/base/browser.go | 30 +++++-------------- .../kubectl/bind-apiservice/plugin/binder.go | 6 ++-- cli/pkg/kubectl/bind-login/plugin/login.go | 6 ++-- cli/pkg/kubectl/bind/plugin/bind.go | 6 ++-- cli/pkg/kubectl/dev/plugin/create.go | 4 +-- contrib/kcp/go.mod | 2 +- docs/generators/cli-doc/go.mod | 2 +- go.mod | 4 +-- hack/tools.checksums | 6 ++-- .../serviceexport/multinsinformer/informer.go | 4 +-- .../serviceexport/serviceexport_reconcile.go | 8 ++--- pkg/konnector/konnector_reconcile.go | 10 +++---- pkg/konnector/server/server.go | 6 +++- .../conditions/util/conditions/matcher.go | 2 +- .../conditions/util/conditions/merge_test.go | 2 +- sdk/go.mod | 2 +- test/e2e/bind/happy-case_test.go | 2 +- test/e2e/framework/backend.go | 3 +- test/e2e/framework/dex.go | 4 ++- test/e2e/framework/kcp.go | 6 ++-- web/go.mod | 2 +- 35 files changed, 88 insertions(+), 81 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c8e5ae50c..48e24a113 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -30,7 +30,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.8 + go-version: v1.26.1 - uses: actions/setup-node@v4 with: node-version: '20' @@ -45,7 +45,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.8 + go-version: v1.26.1 - uses: actions/setup-node@v4 with: node-version: '20' @@ -60,7 +60,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.8 + go-version: v1.26.1 - run: make test lint: @@ -70,7 +70,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.8 + go-version: v1.26.1 - run: make lint verify: @@ -80,5 +80,5 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.8 + go-version: v1.26.1 - run: make verify diff --git a/.github/workflows/docs-gen-and-push.yaml b/.github/workflows/docs-gen-and-push.yaml index a3c6f62a0..595ec249c 100644 --- a/.github/workflows/docs-gen-and-push.yaml +++ b/.github/workflows/docs-gen-and-push.yaml @@ -34,7 +34,7 @@ jobs: - uses: actions/setup-go@v5 with: - go-version: v1.25.8 + go-version: v1.26.1 cache: true - uses: actions/setup-python@v5 diff --git a/.github/workflows/goreleaser.yaml b/.github/workflows/goreleaser.yaml index 3706b9638..9ff1cf57f 100644 --- a/.github/workflows/goreleaser.yaml +++ b/.github/workflows/goreleaser.yaml @@ -22,7 +22,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-go@v5 with: - go-version: v1.25.8 + go-version: v1.26.1 - name: Delete non-semver tags run: 'git tag -d $(git tag -l | grep -v "^v")' - name: Set LDFLAGS diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 6829ef77f..6c5143654 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: v1.25.8 + go-version: v1.26.1 check-latest: true # We need this to remove local tags that are not semver so goreleaser doesn't get confused. diff --git a/.golangci.yaml b/.golangci.yaml index 5ed496cd8..80e33561a 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -67,6 +67,10 @@ linters: - linters: - goconst path: (.+)_test\.go + - linters: + - gosec + path: (.+)_test\.go + text: G101 - linters: - staticcheck text: QF1008 diff --git a/.ko.yaml b/.ko.yaml index 0e427d049..e2f07f410 100644 --- a/.ko.yaml +++ b/.ko.yaml @@ -1,5 +1,5 @@ baseImageOverrides: - github.com/google/ko: golang:1.25.8 + github.com/google/ko: golang:1.26.1 builds: - id: konnector diff --git a/Dockerfile b/Dockerfile index bcd5d73fe..1b46eac84 100644 --- a/Dockerfile +++ b/Dockerfile @@ -39,7 +39,7 @@ ENV VITE_BUILD_TARGET=docker RUN npm run build # Build Go binary with embedded UI assets -FROM golang:1.25.8 AS go-build-env +FROM golang:1.26.1 AS go-build-env WORKDIR /app # Accept build arguments for multi-arch support diff --git a/Dockerfile.konnector b/Dockerfile.konnector index ad37f2962..269ae5d70 100644 --- a/Dockerfile.konnector +++ b/Dockerfile.konnector @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM golang:1.25.8 AS builder +FROM golang:1.26.1 AS builder WORKDIR /app # Accept build arguments for multi-arch support diff --git a/Makefile b/Makefile index 204950708..69501878c 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ BOILERPLATE_VERSION := 201dcad9616c117927232ee0bc499ff38a27023e CODE_GENERATOR_VERSION := v2.4.0 CONTROLLER_GEN_VERSION := v0.17.3 DEX_VERSION := v2.43.1 -GOLANGCI_LINT_VERSION := 2.1.6 +GOLANGCI_LINT_VERSION := 2.11.3 GORELEASER_VERSION := 2.13.0 GOTESTSUM_VERSION := 1.8.1 HELM_DOCS_VERSION := 1.14.2 diff --git a/backend/auth/handler.go b/backend/auth/handler.go index cf3e358b4..f2a282edf 100644 --- a/backend/auth/handler.go +++ b/backend/auth/handler.go @@ -55,6 +55,8 @@ type AuthHandler struct { tokenExpiry time.Duration } +const maxCallbackFormSize int64 = 1 << 20 // 1 MiB + func NewAuthHandler(oidc OIDCProvider, jwtService *JWTService, cookieSigningKey, cookieEncryptionKey []byte, sessionStore session.Store, tokenExpiry time.Duration) *AuthHandler { return &AuthHandler{ oidc: oidc, @@ -136,6 +138,7 @@ func (ah *AuthHandler) HandleAuthorize(w http.ResponseWriter, r *http.Request) { func (ah *AuthHandler) HandleCallback(w http.ResponseWriter, r *http.Request) { logger := klog.FromContext(r.Context()).WithValues("method", r.Method, "url", r.URL.String()) + r.Body = http.MaxBytesReader(w, r.Body, maxCallbackFormSize) if err := r.ParseForm(); err != nil { logger.Error(err, "failed to parse form") ah.respondWithError(w, "", "failed to parse form", http.StatusBadRequest) diff --git a/backend/controllers/serviceexportrequest/serviceexportrequest_reconcile.go b/backend/controllers/serviceexportrequest/serviceexportrequest_reconcile.go index d67e26068..42cebc800 100644 --- a/backend/controllers/serviceexportrequest/serviceexportrequest_reconcile.go +++ b/backend/controllers/serviceexportrequest/serviceexportrequest_reconcile.go @@ -118,7 +118,7 @@ func (r *reconciler) getExportedSchemas(ctx context.Context, cl client.Client) ( resources.ExportedCRDsLabel: "true", } - listOpts := []client.ListOption{} + listOpts := make([]client.ListOption, 0, 1) listOpts = append(listOpts, client.MatchingLabelsSelector{Selector: labelSelector.AsSelector()}) if err := cl.List(ctx, list, listOpts...); err != nil { diff --git a/backend/oidc/oidc_test.go b/backend/oidc/oidc_test.go index 24775dde2..65a7de9f9 100644 --- a/backend/oidc/oidc_test.go +++ b/backend/oidc/oidc_test.go @@ -179,12 +179,19 @@ func TestLoadTLSConfig_MultipleCerts(t *testing.T) { } // Write combined CA bundle - combinedCAFile := filepath.Join(tmpDir, "combined-ca.crt") - ca1Data = append(ca1Data, ca2Data...) - err = os.WriteFile(combinedCAFile, ca1Data, 0600) + combinedCA, err := os.CreateTemp(tmpDir, "combined-ca-*.crt") if err != nil { + t.Fatalf("Failed to create combined CA file: %v", err) + } + combinedCAFile := combinedCA.Name() + + ca1Data = append(ca1Data, ca2Data...) + if _, err = combinedCA.Write(ca1Data); err != nil { t.Fatalf("Failed to write combined CA file: %v", err) } + if err = combinedCA.Close(); err != nil { + t.Fatalf("Failed to close combined CA file: %v", err) + } // Test LoadTLSConfig with multiple certs config, err := LoadTLSConfig(combinedCAFile) diff --git a/backend/options/serve.go b/backend/options/serve.go index 59bbdbc08..75b65303a 100644 --- a/backend/options/serve.go +++ b/backend/options/serve.go @@ -17,6 +17,7 @@ limitations under the License. package options import ( + "context" "fmt" "net" "strconv" @@ -58,7 +59,8 @@ func (options *Serve) Complete() error { addr = net.JoinHostPort(options.ListenIP, strconv.Itoa(options.ListenPort)) } // We only support TCP4 for now to avoid dual stack complications in embedded OIDC server tests. - options.Listener, err = net.Listen("tcp4", addr) + var lc net.ListenConfig + options.Listener, err = lc.Listen(context.Background(), "tcp4", addr) if err != nil { return err } diff --git a/cli/go.mod b/cli/go.mod index 0800cdb7a..6737273e4 100644 --- a/cli/go.mod +++ b/cli/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/cli -go 1.25.8 +go 1.26.1 replace ( github.com/kube-bind/kube-bind => ../ diff --git a/cli/pkg/kubectl/base/browser.go b/cli/pkg/kubectl/base/browser.go index 11faa49d8..e0e8aa7d6 100644 --- a/cli/pkg/kubectl/base/browser.go +++ b/cli/pkg/kubectl/base/browser.go @@ -17,8 +17,9 @@ limitations under the License. package base import ( + "context" "os/exec" - "strings" + "runtime" ) // openBrowser opens the given URL in the default browser @@ -26,29 +27,14 @@ func OpenBrowser(url string) error { var cmd *exec.Cmd // Determine the command based on the operating system - switch { - case isWindows(): - cmd = exec.Command("cmd", "/c", "start", url) - case isMacOS(): - cmd = exec.Command("open", url) + switch runtime.GOOS { + case "windows": + cmd = exec.CommandContext(context.Background(), "cmd", "/c", "start", url) + case "darwin": + cmd = exec.CommandContext(context.Background(), "open", url) default: // Linux and other Unix-like systems - cmd = exec.Command("xdg-open", url) + cmd = exec.CommandContext(context.Background(), "xdg-open", url) } return cmd.Run() } - -// isWindows checks if the current OS is Windows -func isWindows() bool { - return strings.Contains(strings.ToLower(exec.Command("uname").String()), "windows") -} - -// isMacOS checks if the current OS is macOS -func isMacOS() bool { - cmd := exec.Command("uname") - output, err := cmd.Output() - if err != nil { - return false - } - return strings.TrimSpace(string(output)) == "Darwin" -} diff --git a/cli/pkg/kubectl/bind-apiservice/plugin/binder.go b/cli/pkg/kubectl/bind-apiservice/plugin/binder.go index fcfb3d0b9..c903b4391 100644 --- a/cli/pkg/kubectl/bind-apiservice/plugin/binder.go +++ b/cli/pkg/kubectl/bind-apiservice/plugin/binder.go @@ -145,7 +145,6 @@ func (b *Binder) BindFromFile(ctx context.Context) ([]*kubebindv1alpha2.APIServi } // Create bindings for all requests - var bindings []*kubebindv1alpha2.APIServiceBinding result, err := b.createServiceExportRequest(ctx, remoteConfig, remoteNamespaceActual, request) if err != nil { return nil, fmt.Errorf("failed to create service export request: %w", err) @@ -160,9 +159,8 @@ func (b *Binder) BindFromFile(ctx context.Context) ([]*kubebindv1alpha2.APIServi if err != nil { return nil, fmt.Errorf("failed to create API service bindings: %w", err) } - bindings = append(bindings, results...) - return bindings, nil + return results, nil } // BindFromResponse processes a BindingResourceResponse and creates all necessary bindings @@ -237,7 +235,7 @@ func (b *Binder) BindFromResponse(ctx context.Context, response *kubebindv1alpha } // Create bindings for all requests - var bindings []*kubebindv1alpha2.APIServiceBinding + bindings := make([]*kubebindv1alpha2.APIServiceBinding, 0, len(apiRequests)) for _, request := range apiRequests { result, err := b.createServiceExportRequest(ctx, remoteConfig, remoteNamespaceActual, request) if err != nil { diff --git a/cli/pkg/kubectl/bind-login/plugin/login.go b/cli/pkg/kubectl/bind-login/plugin/login.go index b3b898e8e..c9137ad98 100644 --- a/cli/pkg/kubectl/bind-login/plugin/login.go +++ b/cli/pkg/kubectl/bind-login/plugin/login.go @@ -298,13 +298,13 @@ func (o *LoginOptions) buildAuthURL(provider *kubebindv1alpha2.BindingProvider, } func (o *LoginOptions) startCallbackServerWithRandomPort(tokenCh chan<- *TokenResponse, errCh chan<- error) (*http.Server, string, error) { - listener, err := net.Listen("tcp", "127.0.0.1:0") + var lc net.ListenConfig + listener, err := lc.Listen(context.Background(), "tcp", "127.0.0.1:0") if err != nil { return nil, "", fmt.Errorf("failed to find available port: %w", err) } port := listener.Addr().(*net.TCPAddr).Port - listener.Close() callbackURL := fmt.Sprintf("http://127.0.0.1:%d/callback", port) @@ -362,7 +362,7 @@ func (o *LoginOptions) startCallbackServerWithRandomPort(tokenCh chan<- *TokenRe } go func() { - if err := server.ListenAndServe(); err != http.ErrServerClosed { + if err := server.Serve(listener); err != http.ErrServerClosed { select { case errCh <- err: default: diff --git a/cli/pkg/kubectl/bind/plugin/bind.go b/cli/pkg/kubectl/bind/plugin/bind.go index bf0fcd291..745a89518 100644 --- a/cli/pkg/kubectl/bind/plugin/bind.go +++ b/cli/pkg/kubectl/bind/plugin/bind.go @@ -341,13 +341,13 @@ func (b *BindOptions) buildUIURL(callbackPort int, sessionID, backendClusterID, // startCallbackServer starts a local HTTP server to receive the callback from the UI func (b *BindOptions) startCallbackServer(resultCh chan<- *BindResult, errCh chan<- error, sessionID string) (*http.Server, int, error) { // Find an available port - listener, err := net.Listen("tcp", "127.0.0.1:0") + var lc net.ListenConfig + listener, err := lc.Listen(context.Background(), "tcp", "127.0.0.1:0") if err != nil { return nil, 0, fmt.Errorf("failed to find available port: %w", err) } port := listener.Addr().(*net.TCPAddr).Port - listener.Close() // Setup HTTP handler mux := http.NewServeMux() @@ -420,7 +420,7 @@ func (b *BindOptions) startCallbackServer(resultCh chan<- *BindResult, errCh cha } go func() { - if err := server.ListenAndServe(); err != http.ErrServerClosed { + if err := server.Serve(listener); err != http.ErrServerClosed { select { case errCh <- err: default: diff --git a/cli/pkg/kubectl/dev/plugin/create.go b/cli/pkg/kubectl/dev/plugin/create.go index ddddc114b..0ee889157 100644 --- a/cli/pkg/kubectl/dev/plugin/create.go +++ b/cli/pkg/kubectl/dev/plugin/create.go @@ -617,7 +617,7 @@ func (o *DevOptions) checkFileLimits() error { } // Check fs.inotify.max_user_watches - watchesCmd := exec.Command("sysctl", "-n", "fs.inotify.max_user_watches") + watchesCmd := exec.CommandContext(context.Background(), "sysctl", "-n", "fs.inotify.max_user_watches") watchesOutput, err := watchesCmd.Output() if err == nil { if watches, err := strconv.Atoi(strings.TrimSpace(string(watchesOutput))); err == nil && watches < 524288 { @@ -627,7 +627,7 @@ func (o *DevOptions) checkFileLimits() error { } // Check fs.inotify.max_user_instances - instancesCmd := exec.Command("sysctl", "-n", "fs.inotify.max_user_instances") + instancesCmd := exec.CommandContext(context.Background(), "sysctl", "-n", "fs.inotify.max_user_instances") instancesOutput, err := instancesCmd.Output() if err == nil { if instances, err := strconv.Atoi(strings.TrimSpace(string(instancesOutput))); err == nil && instances < 512 { diff --git a/contrib/kcp/go.mod b/contrib/kcp/go.mod index 5d97bee1f..24f28091f 100644 --- a/contrib/kcp/go.mod +++ b/contrib/kcp/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/contrib/kcp -go 1.25.8 +go 1.26.1 replace ( github.com/kube-bind/kube-bind => ../../ diff --git a/docs/generators/cli-doc/go.mod b/docs/generators/cli-doc/go.mod index 5b3495ab6..76af0a40c 100644 --- a/docs/generators/cli-doc/go.mod +++ b/docs/generators/cli-doc/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/docs/generators/cli-doc -go 1.25.8 +go 1.26.1 replace ( github.com/kube-bind/kube-bind => ../../../ diff --git a/go.mod b/go.mod index 516a96709..84844c561 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ module github.com/kube-bind/kube-bind // The script hack/verify-go-versions.sh checks that all version // references across the codebase are consistent with the versions // maintained here. -// go-build-version 1.25.8 -go 1.25.8 +// go-build-version 1.26.0 +go 1.26.1 replace ( github.com/kube-bind/kube-bind => ./ diff --git a/hack/tools.checksums b/hack/tools.checksums index 59fbd1cf3..e41736f76 100644 --- a/hack/tools.checksums +++ b/hack/tools.checksums @@ -1,6 +1,6 @@ -golangci-lint|GOARCH=amd64;GOOS=linux|7009324a8aad93c1f84dce1c3cf61181bdd6b68e5f1b8b5d6971662258255050 -golangci-lint|GOARCH=arm64;GOOS=darwin|96dc1dbbb686fc7982b9ea4b800f3d234a2d9fb78b0344f287e8d28ee11bc72b -golangci-lint|GOARCH=arm64;GOOS=linux|c51ff5b21be688b043baea44de7dd855cf07b855c14f0de405bfaf922b1d7634 +golangci-lint|GOARCH=amd64;GOOS=linux|657d27b11b6b92169ceef89d39a12da5670caa4ef27376ac49a26433050e2356 +golangci-lint|GOARCH=arm64;GOOS=darwin|324c8926c741695bfca4a2333391c04a442a386d39ee921bd2fa3b648fdaadb6 +golangci-lint|GOARCH=arm64;GOOS=linux|5ef8816f90dcdb532924586601d2a0e5ace9f975c9d104519bc92721dffd75ed goreleaser|ARCH=x86_64;OS=Linux|8de4a7d97d9b2b62e8186bcd28f7a203ba55ecfaaa4329e14264d3235095faed gotestsum|GOARCH=amd64;GOOS=linux|ee25248e6f5073cad0b7a712c97ed473adb7420f7eefad534177de0113a8a505 gotestsum|GOARCH=arm64;GOOS=linux|7a5e7f8cb5e2126be563b7c7182cc4522fbc65408a99df82d156d30e997b8705 diff --git a/pkg/konnector/controllers/cluster/serviceexport/multinsinformer/informer.go b/pkg/konnector/controllers/cluster/serviceexport/multinsinformer/informer.go index a41877bd4..5644271a2 100644 --- a/pkg/konnector/controllers/cluster/serviceexport/multinsinformer/informer.go +++ b/pkg/konnector/controllers/cluster/serviceexport/multinsinformer/informer.go @@ -187,12 +187,12 @@ func (inf *DynamicMultiNamespaceInformer) enqueueServiceNamespace(obj any) { } logger.V(1).Info("starting dynamic informer", "namespace", sns.Status.Namespace) - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancelCause(context.Background()) factory := dynamicinformer.NewFilteredDynamicSharedInformerFactory(inf.providerDynamicClient, time.Minute*30, sns.Status.Namespace, nil) gvrInf := factory.ForResource(inf.gvr) gvrInf.Lister() // to wire the GVR up in the informer factory - inf.namespaceCancel[name] = cancel + inf.namespaceCancel[name] = func() { cancel(nil) } inf.namespaceInformers[name] = gvrInf for _, h := range inf.handlers { diff --git a/pkg/konnector/controllers/cluster/serviceexport/serviceexport_reconcile.go b/pkg/konnector/controllers/cluster/serviceexport/serviceexport_reconcile.go index 3f8ee7ce0..0ffb2c960 100644 --- a/pkg/konnector/controllers/cluster/serviceexport/serviceexport_reconcile.go +++ b/pkg/konnector/controllers/cluster/serviceexport/serviceexport_reconcile.go @@ -319,7 +319,7 @@ func (r *reconciler) ensureControllerForSchema(ctx context.Context, export *kube } // Create a new context for this controller - ctxWithCancel, cancel := context.WithCancel(ctx) + ctxWithCancel, cancel := context.WithCancelCause(ctx) consumerInf.Start(ctxWithCancel.Done()) providerInf.Start(ctxWithCancel) @@ -338,7 +338,7 @@ func (r *reconciler) ensureControllerForSchema(ctx context.Context, export *kube r.syncStore.Set(key, contextstore.SyncContext{ Generation: export.Generation, - Cancel: cancel, + Cancel: func() { cancel(nil) }, }) return nil @@ -474,7 +474,7 @@ func (r *reconciler) ensureControllerForPermissionClaim( logger.Info("creating claim reconciler", "gvr", claimGVR, "key", claimKey) - ctxWithCancel, cancel := context.WithCancel(ctx) + ctxWithCancel, cancel := context.WithCancelCause(ctx) // Start the informers and controllers in a goroutine go func() { defer r.syncStore.Delete(claimKey) @@ -502,7 +502,7 @@ func (r *reconciler) ensureControllerForPermissionClaim( // Store the controller context for tracking r.syncStore.Set(claimKey, contextstore.SyncContext{ Generation: binding.Generation, - Cancel: cancel, + Cancel: func() { cancel(nil) }, }) return nil diff --git a/pkg/konnector/konnector_reconcile.go b/pkg/konnector/konnector_reconcile.go index a2781f448..68c66b684 100644 --- a/pkg/konnector/konnector_reconcile.go +++ b/pkg/konnector/konnector_reconcile.go @@ -127,10 +127,10 @@ func (r *reconciler) startClusterControllerForSecret(ctx context.Context, secret // will also handle real APIServiceBindings that use the same kubeconfig. syntheticKey := "__heartbeat__" + secret.Name - ctrlCtx, cancel := context.WithCancel(ctx) + ctrlCtx, cancel := context.WithCancelCause(ctx) ctrlContext := &controllerContext{ kubeconfig: kubeconfig, - cancel: cancel, + cancel: func() { cancel(nil) }, serviceBindings: sets.New(syntheticKey), } r.controllers[syntheticKey] = ctrlContext @@ -154,7 +154,7 @@ func (r *reconciler) startClusterControllerForSecret(ctx context.Context, secret ) if err != nil { logger.Error(err, "failed to start cluster controller for heartbeat") - cancel() + cancel(nil) delete(r.controllers, syntheticKey) return err } @@ -239,10 +239,10 @@ func (r *reconciler) reconcile(ctx context.Context, binding *kubebindv1alpha2.AP return nil // nothing we can do here. The APIServiceBinding Controller will set a condition } - ctrlCtx, cancel := context.WithCancel(ctx) + ctrlCtx, cancel := context.WithCancelCause(ctx) r.controllers[binding.Name] = &controllerContext{ kubeconfig: kubeconfig, - cancel: cancel, + cancel: func() { cancel(nil) }, serviceBindings: sets.New(binding.Name), } diff --git a/pkg/konnector/server/server.go b/pkg/konnector/server/server.go index 55e5bf622..5e8d29e75 100644 --- a/pkg/konnector/server/server.go +++ b/pkg/konnector/server/server.go @@ -61,8 +61,12 @@ func (s *Server) Start(ctx context.Context) { ReadHeaderTimeout: 1 * time.Minute, } go func() { - listener, err := net.Listen("tcp", s.ServerAddr) + var lc net.ListenConfig + listener, err := lc.Listen(ctx, "tcp", s.ServerAddr) if err != nil { + if ctx.Err() != nil { + return + } panic(err) } diff --git a/sdk/apis/third_party/conditions/util/conditions/matcher.go b/sdk/apis/third_party/conditions/util/conditions/matcher.go index 92bc5e377..afe678996 100644 --- a/sdk/apis/third_party/conditions/util/conditions/matcher.go +++ b/sdk/apis/third_party/conditions/util/conditions/matcher.go @@ -37,7 +37,7 @@ type matchConditions struct { } func (m matchConditions) Match(actual any) (success bool, err error) { - elems := []any{} + elems := make([]any, 0, len(m.expected)) for _, condition := range m.expected { elems = append(elems, MatchCondition(condition)) } diff --git a/sdk/apis/third_party/conditions/util/conditions/merge_test.go b/sdk/apis/third_party/conditions/util/conditions/merge_test.go index a7ac147e1..2fec24093 100644 --- a/sdk/apis/third_party/conditions/util/conditions/merge_test.go +++ b/sdk/apis/third_party/conditions/util/conditions/merge_test.go @@ -150,7 +150,7 @@ func TestMergeRespectPriority(t *testing.T) { func conditionsWithSource(obj Setter, conditions ...*conditionsapi.Condition) []localizedCondition { obj.SetConditions(conditionList(conditions...)) - ret := []localizedCondition{} + ret := make([]localizedCondition, 0, len(conditions)) for i := range conditions { ret = append(ret, localizedCondition{ Condition: conditions[i], diff --git a/sdk/go.mod b/sdk/go.mod index a16d4388f..535bb86ad 100644 --- a/sdk/go.mod +++ b/sdk/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/sdk -go 1.25.8 +go 1.26.1 require ( github.com/google/go-cmp v0.7.0 diff --git a/test/e2e/bind/happy-case_test.go b/test/e2e/bind/happy-case_test.go index fcb87739d..2c3a6aacc 100644 --- a/test/e2e/bind/happy-case_test.go +++ b/test/e2e/bind/happy-case_test.go @@ -256,7 +256,7 @@ func testHappyCase( var referencedSecretName, labelSelectedSecretName string var filename string if consumerResourceScope == apiextensionsv1.NamespaceScoped { - referencedSecretName = "colt-45-permit" //nolint:gosec + referencedSecretName = "colt-45-permit" labelSelectedSecretName = "cowboy-gang-affiliation" filename = "cr-cowboy.yaml" } else { diff --git a/test/e2e/framework/backend.go b/test/e2e/framework/backend.go index fc63c1454..856f18936 100644 --- a/test/e2e/framework/backend.go +++ b/test/e2e/framework/backend.go @@ -63,7 +63,8 @@ func StartBackend(t testing.TB, args ...string) (net.Addr, *backend.Server) { // use a random port via an explicit listener. Then add a kube-bind- client to dex // with the callback URL set to the listener's address. - opts.Serve.Listener, err = net.Listen("tcp", "localhost:0") + listenConfig := net.ListenConfig{} + opts.Serve.Listener, err = listenConfig.Listen(context.Background(), "tcp", "localhost:0") require.NoError(t, err) addr := opts.Serve.Listener.Addr() diff --git a/test/e2e/framework/dex.go b/test/e2e/framework/dex.go index e09919461..b00f64e60 100644 --- a/test/e2e/framework/dex.go +++ b/test/e2e/framework/dex.go @@ -66,7 +66,9 @@ func StartDex(t testing.TB) { dexBinary = "dex" } - dexCmd := exec.Command( + //nolint:gosec // test helper intentionally allows overriding dex binary/config via environment for local e2e runs. + dexCmd := exec.CommandContext( + context.Background(), dexBinary, "serve", dexConfig, diff --git a/test/e2e/framework/kcp.go b/test/e2e/framework/kcp.go index cb06e8755..b177b589d 100644 --- a/test/e2e/framework/kcp.go +++ b/test/e2e/framework/kcp.go @@ -72,7 +72,7 @@ func WithStaticName(s string) ClusterWorkspaceOption { func RandomString(length int) string { token := make([]byte, length) - rand.Read(token) //nolint:errcheck + rand.Read(token) base36hash := strings.ToLower(base36.EncodeBytes(token)) return base36hash[:length+1] } @@ -91,7 +91,7 @@ func WithGenerateName(s string, formatArgs ...any) ClusterWorkspaceOption { } token := make([]byte, 4) - rand.Read(token) //nolint:errcheck + rand.Read(token) base36hash := strings.ToLower(base36.EncodeBytes(token)) ws.Name = s + base36hash[:5] ws.GenerateName = "" @@ -119,7 +119,7 @@ func NewWorkspace(t *testing.T, config *rest.Config, options ...ClusterWorkspace ws.Name = ws.GenerateName ws.GenerateName = "" token := make([]byte, 4) - rand.Read(token) //nolint:errcheck + rand.Read(token) base36hash := strings.ToLower(base36.EncodeBytes(token)) ws.Name += base36hash[:5] diff --git a/web/go.mod b/web/go.mod index 322b0fa4a..115d6e9cb 100644 --- a/web/go.mod +++ b/web/go.mod @@ -1,3 +1,3 @@ module github.com/kube-bind/kube-bind/web -go 1.25.8 +go 1.26.1 From 0ef1bf4b06311b4615132ddca1c153208a1e5e10 Mon Sep 17 00:00:00 2001 From: Karol Szwaj Date: Mon, 30 Mar 2026 14:33:53 +0200 Subject: [PATCH 3/6] fix go version verify Signed-off-by: Karol Szwaj On-behalf-of: @SAP karol.szwaj@sap.com --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 84844c561..46c54547e 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ module github.com/kube-bind/kube-bind // The script hack/verify-go-versions.sh checks that all version // references across the codebase are consistent with the versions // maintained here. -// go-build-version 1.26.0 +// go-build-version 1.26.1 go 1.26.1 replace ( From 075e88a09892cbcff14f8e569f21d6a5d76804fc Mon Sep 17 00:00:00 2001 From: Karol Szwaj Date: Mon, 30 Mar 2026 16:01:36 +0200 Subject: [PATCH 4/6] Revert WithCancelCause changes Signed-off-by: Karol Szwaj --- .../cluster/serviceexport/multinsinformer/informer.go | 4 ++-- .../cluster/serviceexport/serviceexport_reconcile.go | 8 ++++---- pkg/konnector/konnector_reconcile.go | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pkg/konnector/controllers/cluster/serviceexport/multinsinformer/informer.go b/pkg/konnector/controllers/cluster/serviceexport/multinsinformer/informer.go index 5644271a2..141e72955 100644 --- a/pkg/konnector/controllers/cluster/serviceexport/multinsinformer/informer.go +++ b/pkg/konnector/controllers/cluster/serviceexport/multinsinformer/informer.go @@ -187,12 +187,12 @@ func (inf *DynamicMultiNamespaceInformer) enqueueServiceNamespace(obj any) { } logger.V(1).Info("starting dynamic informer", "namespace", sns.Status.Namespace) - ctx, cancel := context.WithCancelCause(context.Background()) + ctx, cancel := context.WithCancel(context.Background()) //nolint:gosec factory := dynamicinformer.NewFilteredDynamicSharedInformerFactory(inf.providerDynamicClient, time.Minute*30, sns.Status.Namespace, nil) gvrInf := factory.ForResource(inf.gvr) gvrInf.Lister() // to wire the GVR up in the informer factory - inf.namespaceCancel[name] = func() { cancel(nil) } + inf.namespaceCancel[name] = cancel inf.namespaceInformers[name] = gvrInf for _, h := range inf.handlers { diff --git a/pkg/konnector/controllers/cluster/serviceexport/serviceexport_reconcile.go b/pkg/konnector/controllers/cluster/serviceexport/serviceexport_reconcile.go index 0ffb2c960..da788191c 100644 --- a/pkg/konnector/controllers/cluster/serviceexport/serviceexport_reconcile.go +++ b/pkg/konnector/controllers/cluster/serviceexport/serviceexport_reconcile.go @@ -319,7 +319,7 @@ func (r *reconciler) ensureControllerForSchema(ctx context.Context, export *kube } // Create a new context for this controller - ctxWithCancel, cancel := context.WithCancelCause(ctx) + ctxWithCancel, cancel := context.WithCancel(ctx) //nolint:gosec consumerInf.Start(ctxWithCancel.Done()) providerInf.Start(ctxWithCancel) @@ -338,7 +338,7 @@ func (r *reconciler) ensureControllerForSchema(ctx context.Context, export *kube r.syncStore.Set(key, contextstore.SyncContext{ Generation: export.Generation, - Cancel: func() { cancel(nil) }, + Cancel: cancel, }) return nil @@ -474,7 +474,7 @@ func (r *reconciler) ensureControllerForPermissionClaim( logger.Info("creating claim reconciler", "gvr", claimGVR, "key", claimKey) - ctxWithCancel, cancel := context.WithCancelCause(ctx) + ctxWithCancel, cancel := context.WithCancel(ctx) //nolint:gosec // Start the informers and controllers in a goroutine go func() { defer r.syncStore.Delete(claimKey) @@ -502,7 +502,7 @@ func (r *reconciler) ensureControllerForPermissionClaim( // Store the controller context for tracking r.syncStore.Set(claimKey, contextstore.SyncContext{ Generation: binding.Generation, - Cancel: func() { cancel(nil) }, + Cancel: cancel, }) return nil diff --git a/pkg/konnector/konnector_reconcile.go b/pkg/konnector/konnector_reconcile.go index 68c66b684..b472e46d0 100644 --- a/pkg/konnector/konnector_reconcile.go +++ b/pkg/konnector/konnector_reconcile.go @@ -127,10 +127,10 @@ func (r *reconciler) startClusterControllerForSecret(ctx context.Context, secret // will also handle real APIServiceBindings that use the same kubeconfig. syntheticKey := "__heartbeat__" + secret.Name - ctrlCtx, cancel := context.WithCancelCause(ctx) + ctrlCtx, cancel := context.WithCancel(ctx) ctrlContext := &controllerContext{ kubeconfig: kubeconfig, - cancel: func() { cancel(nil) }, + cancel: cancel, serviceBindings: sets.New(syntheticKey), } r.controllers[syntheticKey] = ctrlContext @@ -154,7 +154,7 @@ func (r *reconciler) startClusterControllerForSecret(ctx context.Context, secret ) if err != nil { logger.Error(err, "failed to start cluster controller for heartbeat") - cancel(nil) + cancel() delete(r.controllers, syntheticKey) return err } @@ -239,10 +239,10 @@ func (r *reconciler) reconcile(ctx context.Context, binding *kubebindv1alpha2.AP return nil // nothing we can do here. The APIServiceBinding Controller will set a condition } - ctrlCtx, cancel := context.WithCancelCause(ctx) + ctrlCtx, cancel := context.WithCancel(ctx) //nolint:gosec r.controllers[binding.Name] = &controllerContext{ kubeconfig: kubeconfig, - cancel: func() { cancel(nil) }, + cancel: cancel, serviceBindings: sets.New(binding.Name), } From f939799af2c8cc9fa1fbe5a3c6cb017040d32598 Mon Sep 17 00:00:00 2001 From: Karol Szwaj Date: Mon, 30 Mar 2026 16:04:10 +0200 Subject: [PATCH 5/6] Fix test context in dex Signed-off-by: Karol Szwaj On-behalf-of: @SAP karol.szwaj@sap.com --- test/e2e/framework/dex.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/framework/dex.go b/test/e2e/framework/dex.go index b00f64e60..6101bd6f5 100644 --- a/test/e2e/framework/dex.go +++ b/test/e2e/framework/dex.go @@ -68,7 +68,7 @@ func StartDex(t testing.TB) { //nolint:gosec // test helper intentionally allows overriding dex binary/config via environment for local e2e runs. dexCmd := exec.CommandContext( - context.Background(), + t.Context(), dexBinary, "serve", dexConfig, @@ -119,7 +119,7 @@ func CreateDexClient(t testing.TB, addr net.Addr) (string, string) { require.NoError(t, err) t.Cleanup(func() { - ctx, cancel := context.WithDeadline(context.Background(), metav1.Now().Add(10*time.Second)) + ctx, cancel := context.WithDeadline(t.Context(), metav1.Now().Add(10*time.Second)) defer cancel() conn, err := grpc.NewClient("127.0.0.1:5557", grpc.WithTransportCredentials(grpcinsecure.NewCredentials())) require.NoError(t, err) From afc9cfaa5858637fe4205627ffeccf074ff3d8d0 Mon Sep 17 00:00:00 2001 From: Karol Szwaj Date: Mon, 30 Mar 2026 16:07:48 +0200 Subject: [PATCH 6/6] Make minimum Go version to 1.26.0 Signed-off-by: Karol Szwaj On-behalf-of: @SAP karol.szwaj@sap.com --- cli/go.mod | 2 +- contrib/kcp/go.mod | 2 +- docs/generators/cli-doc/go.mod | 2 +- go.mod | 2 +- sdk/go.mod | 2 +- web/go.mod | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/go.mod b/cli/go.mod index 6737273e4..4a6206294 100644 --- a/cli/go.mod +++ b/cli/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/cli -go 1.26.1 +go 1.26.0 replace ( github.com/kube-bind/kube-bind => ../ diff --git a/contrib/kcp/go.mod b/contrib/kcp/go.mod index 24f28091f..8a247c9c8 100644 --- a/contrib/kcp/go.mod +++ b/contrib/kcp/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/contrib/kcp -go 1.26.1 +go 1.26.0 replace ( github.com/kube-bind/kube-bind => ../../ diff --git a/docs/generators/cli-doc/go.mod b/docs/generators/cli-doc/go.mod index 76af0a40c..8bbb711ff 100644 --- a/docs/generators/cli-doc/go.mod +++ b/docs/generators/cli-doc/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/docs/generators/cli-doc -go 1.26.1 +go 1.26.0 replace ( github.com/kube-bind/kube-bind => ../../../ diff --git a/go.mod b/go.mod index 46c54547e..6e3f78e59 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ module github.com/kube-bind/kube-bind // references across the codebase are consistent with the versions // maintained here. // go-build-version 1.26.1 -go 1.26.1 +go 1.26.0 replace ( github.com/kube-bind/kube-bind => ./ diff --git a/sdk/go.mod b/sdk/go.mod index 535bb86ad..ed302e863 100644 --- a/sdk/go.mod +++ b/sdk/go.mod @@ -1,6 +1,6 @@ module github.com/kube-bind/kube-bind/sdk -go 1.26.1 +go 1.26.0 require ( github.com/google/go-cmp v0.7.0 diff --git a/web/go.mod b/web/go.mod index 115d6e9cb..2fd2316c4 100644 --- a/web/go.mod +++ b/web/go.mod @@ -1,3 +1,3 @@ module github.com/kube-bind/kube-bind/web -go 1.26.1 +go 1.26.0