diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 660fdd22a..ff3d03223 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -49,11 +49,11 @@ Example: `scope.NewClusterScope()` combines `LinodeCluster` + CAPI `Cluster` res ## Development Workflows ### Build & Test Commands -- `make generate` - Regenerate CRDs and mocks after API changes -- `make test` - Run unit tests with mocked clients -- `make e2e E2E_SELECTOR=quick` - Run specific E2E tests using Chainsaw -- `make lint` - Run golangci-lint with project-specific rules -- `make build` - Build the controller manager binary +- `mise run generate` - Regenerate CRDs and mocks after API changes +- `mise run test` - Run unit tests with mocked clients +- `mise run e2e E2E_SELECTOR=quick` - Run specific E2E tests using Chainsaw +- `mise run lint` - Run golangci-lint with project-specific rules +- `mise run build` - Build the controller manager binary ### Adding New Resources 1. Define API types in `api/v1alpha2/` with proper validation markers @@ -61,7 +61,7 @@ Example: `scope.NewClusterScope()` combines `LinodeCluster` + CAPI `Cluster` res 3. Add scope in `cloud/scope/` for client management 4. Add validation webhook in `internal/webhook/v1alpha2/` 5. Add cloud services in `cloud/services/` if needed -6. Run `make generate` to update CRDs and mocks +6. Run `mise run generate` to update CRDs and mocks 7. Add E2E tests in `e2e/-controller/` ### Testing Patterns @@ -200,5 +200,5 @@ Standard OpenTelemetry environment variables are supported via `autoexport` pack - Use `kubectl describe` on resources to see status conditions and events - E2E test failures often indicate webhook validation or API compatibility issues - Enable debug logging with `CAPL_DEBUG=true` for detailed tracing -- Validate CRDs are current with `make generate` after API changes -- Generate local-release whenever making changes to the /templates directory. Use command `make local-release` to generate the release files. +- Validate CRDs are current with `mise run generate` after API changes +- Generate local-release whenever making changes to the /templates directory. Use command `mise run local-release` to generate the release files. diff --git a/.github/workflows/build-push.yml b/.github/workflows/build-push.yml index 8222acc3e..00cfa7421 100644 --- a/.github/workflows/build-push.yml +++ b/.github/workflows/build-push.yml @@ -35,30 +35,28 @@ jobs: sum.golang.org:443 *.githubusercontent.com:443 storage.googleapis.com:443 + mise.jdx.dev:443 + mise-versions.jdx.dev:443 + tuf-repo-cdn.sigstore.dev:443 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 persist-credentials: false - - name: Set up QEMU - uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 - - name: Docker Meta - id: meta - uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 + + - name: Set up Mise + uses: jdx/mise-action@dba19683ed58901619b14f395a24841710cb4925 # v4.1.0 with: - images: linode/cluster-api-provider-linode + install_args: go ko + - name: Login to Docker Hub uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - name: Build and Push to Docker Hub - uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0 - with: - context: . - build-args: VERSION=${{ github.ref_name == 'main' && format('main-{0}', github.sha) || github.ref_name }} - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + + - name: Publish image with ko + env: + KO_DOCKER_REPO: docker.io/linode/cluster-api-provider-linode + IMAGE_VERSION: ${{ github.ref_name }} + run: mise run ko-publish diff --git a/.github/workflows/build_test_ci.yml b/.github/workflows/build_test_ci.yml index 10019fc89..a6615d5bc 100644 --- a/.github/workflows/build_test_ci.yml +++ b/.github/workflows/build_test_ci.yml @@ -59,37 +59,27 @@ jobs: sum.golang.org:443 *.githubusercontent.com:443 storage.googleapis.com:443 - get.jetify.com:443 - get.jetpack.io:443 - releases.jetify.com:443 - releases.jetpack.io:443 - artifacts.nixos.org:443 - cache.nixos.org:443 cli.codecov.io:443 api.codecov.io:443 ingest.codecov.io:443 dl.k8s.io:443 cdn.dl.k8s.io:443 + mise.jdx.dev:443 + mise-versions.jdx.dev:443 + tuf-repo-cdn.sigstore.dev:443 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false ref: ${{ github.event.pull_request.head.sha || github.sha }} - - name: Set up Go - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 + - name: Set up Mise + uses: jdx/mise-action@dba19683ed58901619b14f395a24841710cb4925 # v4.1.0 with: - go-version-file: 'go.mod' - check-latest: true - - - name: Install devbox - uses: jetify-com/devbox-install-action@8c6a66ed6273138b1915457069de78cb52fe3bd7 # v0.15.0 - with: - enable-cache: 'true' - refresh-cli: 'false' + install_args: go - name: Test - run: devbox run make test + run: mise run test - name: Upload coverage reports to Codecov uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v6.0.2 diff --git a/.github/workflows/e2e-test.yaml b/.github/workflows/e2e-test.yaml index 706e8c715..6c5375e45 100644 --- a/.github/workflows/e2e-test.yaml +++ b/.github/workflows/e2e-test.yaml @@ -119,34 +119,19 @@ jobs: *.linodeobjects.com:443 dl.k8s.io:443 cdn.dl.k8s.io:443 - get.jetify.com:443 - get.jetpack.io:443 - releases.jetify.com:443 - releases.jetpack.io:443 - artifacts.nixos.org:443 - cache.nixos.org:443 + mise.jdx.dev:443 + mise-versions.jdx.dev:443 + tuf-repo-cdn.sigstore.dev:443 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false ref: ${{ github.event.pull_request.head.sha || github.sha }} - - name: Set up Go - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 + - name: Set up Mise + uses: jdx/mise-action@dba19683ed58901619b14f395a24841710cb4925 # v4.1.0 with: - go-version-file: 'go.mod' - check-latest: true - - - name: Docker cache - uses: ScribeMD/docker-cache@fb28c93772363301b8d0a6072ce850224b73f74e # 0.5.0 - with: - key: docker-${{ runner.os }}-${{ hashFiles('go.sum') }} - - - name: Install devbox - uses: jetify-com/devbox-install-action@8c6a66ed6273138b1915457069de78cb52fe3bd7 # v0.15.0 - with: - enable-cache: 'true' - refresh-cli: 'false' + install_args: go golangci-lint - name: Create IPv4-only kind network run: | @@ -170,11 +155,11 @@ jobs: LINODE_MACHINE_TYPE: g6-standard-2 CLUSTERCTL_CONFIG: /home/runner/work/cluster-api-provider-linode/cluster-api-provider-linode/e2e/gha-clusterctl-config.yaml LINODE_CLIENT_TIMEOUT: 30 - run: devbox run make e2etest + run: mise run e2etest - name: cleanup stale clusters if: ${{ always() }} - run: make clean-child-clusters + run: mise run clean-child-clusters - name: Copy logs if: ${{ always() }} diff --git a/.github/workflows/e2e-upgrade-test.yaml b/.github/workflows/e2e-upgrade-test.yaml index 87ed15829..427d61ff1 100644 --- a/.github/workflows/e2e-upgrade-test.yaml +++ b/.github/workflows/e2e-upgrade-test.yaml @@ -89,11 +89,10 @@ jobs: fetch-depth: 0 persist-credentials: false - - name: Set up Go - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 + - name: Set up Mise + uses: jdx/mise-action@dba19683ed58901619b14f395a24841710cb4925 # v4.1.0 with: - go-version-file: 'go.mod' - check-latest: true + install_args: go - name: Create IPv4-only kind network run: | @@ -113,12 +112,12 @@ jobs: LINODE_MACHINE_TYPE: g6-standard-2 CLUSTERCTL_CONFIG: /home/runner/work/cluster-api-provider-linode/cluster-api-provider-linode/e2e/gha-clusterctl-config.yaml E2E_FLAGS: --assert-timeout 20m0s - run: make test-upgrade + run: mise run test-upgrade - name: cleanup stale clusters if: ${{ always() }} - run: make clean-child-clusters + run: mise run clean-child-clusters - name: cleanup kind mgmt cluster if: ${{ always() }} - run: make clean-kind-cluster + run: mise run clean-kind-cluster diff --git a/.github/workflows/go-analyze.yml b/.github/workflows/go-analyze.yml index 2b6db9a3e..a15129f42 100644 --- a/.github/workflows/go-analyze.yml +++ b/.github/workflows/go-analyze.yml @@ -69,23 +69,22 @@ jobs: with: persist-credentials: false - - name: Set up Go - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 + - name: Set up Mise + uses: jdx/mise-action@dba19683ed58901619b14f395a24841710cb4925 # v4.1.0 with: - go-version-file: 'go.mod' - check-latest: true + install_args: go - name: lint uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.2.0 - name: lint-api - run: make lint-api + run: mise run lint-api - name: Nilcheck - run: make nilcheck + run: mise run nilcheck - name: Vulncheck - run: make vulncheck + run: mise run vulncheck - name: Gosec - run: make gosec + run: mise run gosec diff --git a/.github/workflows/pull_request_ci.yaml b/.github/workflows/pull_request_ci.yaml index 30ba69669..c93a1cb03 100644 --- a/.github/workflows/pull_request_ci.yaml +++ b/.github/workflows/pull_request_ci.yaml @@ -73,12 +73,9 @@ jobs: sum.golang.org:443 *.githubusercontent.com:443 storage.googleapis.com:443 - get.jetify.com:443 - get.jetpack.io:443 - releases.jetify.com:443 - releases.jetpack.io:443 - artifacts.nixos.org:443 - cache.nixos.org:443 + mise.jdx.dev:443 + mise-versions.jdx.dev:443 + tuf-repo-cdn.sigstore.dev:443 dl.k8s.io:443 cdn.dl.k8s.io:443 @@ -86,25 +83,18 @@ jobs: with: persist-credentials: false - - name: Set up Go - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 + - name: Set up Mise + uses: jdx/mise-action@dba19683ed58901619b14f395a24841710cb4925 # v4.1.0 with: - go-version-file: 'go.mod' - check-latest: true - - - name: Install devbox - uses: jetify-com/devbox-install-action@8c6a66ed6273138b1915457069de78cb52fe3bd7 # v0.15.0 - with: - enable-cache: 'true' - refresh-cli: 'false' + install_args: go - name: Build - run: devbox run make build + run: mise run build - name: Check for generated diff - run: make check-gen-diff + run: mise run check-gen-diff - docker-build: + image-build: runs-on: ubuntu-latest needs: changes if: ${{ contains(fromJSON(needs.changes.outputs.paths), 'src') }} @@ -130,15 +120,19 @@ jobs: production.cloudfront.docker.com:443 gcr.io:443 storage.googleapis.com:443 + mise.jdx.dev:443 + mise-versions.jdx.dev:443 + tuf-repo-cdn.sigstore.dev:443 + dl.k8s.io:443 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - - name: Docker cache - uses: ScribeMD/docker-cache@fb28c93772363301b8d0a6072ce850224b73f74e # 0.5.0 + - name: Set up Mise + uses: jdx/mise-action@dba19683ed58901619b14f395a24841710cb4925 # v4.1.0 with: - key: docker-${{ runner.os }}-${{ hashFiles('go.sum') }} + install_args: go ko - - name: Build the Docker image - run: make docker-build + - name: Build the image + run: mise run ko-build diff --git a/.husky/hooks/pre-commit b/.husky/hooks/pre-commit deleted file mode 100755 index 9f701118a..000000000 --- a/.husky/hooks/pre-commit +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -$PWD/bin/husky install diff --git a/.husky/hooks/pre-push b/.husky/hooks/pre-push deleted file mode 100755 index 49e0f6034..000000000 --- a/.husky/hooks/pre-push +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -if [[ "$SKIP_GIT_PUSH_HOOK" ]]; then exit 0; fi - -set -e - -if git status --short | grep -qv "??"; then - git stash - function unstash() { - git reset --hard - git stash pop - } - trap unstash EXIT -fi - -make generate manifests -git diff --exit-code --quiet || (git status && exit 1) - -make lint gosec nilcheck test diff --git a/.ko.yaml b/.ko.yaml new file mode 100644 index 000000000..0b1e60bf1 --- /dev/null +++ b/.ko.yaml @@ -0,0 +1,4 @@ +defaultBaseImage: gcr.io/distroless/static:nonroot +defaultPlatforms: + - linux/arm64 + - linux/amd64 diff --git a/Makefile b/Makefile index 1dd454714..ab7de198a 100644 --- a/Makefile +++ b/Makefile @@ -1,28 +1,20 @@ ##################################################################### # top-level Makefile for cluster-api-provider-linode ##################################################################### -REGISTRY ?= docker.io/linode -IMAGE_NAME ?= cluster-api-provider-linode -CONTROLLER_IMAGE ?= $(REGISTRY)/$(IMAGE_NAME) -TAG ?= dev -ENVTEST_K8S_VERSION := $(shell go list -m -f '{{.Version}}' k8s.io/client-go) VERSION ?= $(shell git describe --always --tag --dirty=-dev) +IMAGE_TAGS ?= $(VERSION) +WITH_GOFLAGS ?= "GOFLAGS=\"-ldflags=-X github.com/linode/cluster-api-provider-linode/version.version=$(VERSION)\"" +KO_DOCKER_REPO ?= docker.io/linode/cluster-api-provider-linode +KOCACHE ?= ~/.ko +RELEASE_DIR ?= release +ENVTEST_K8S_VERSION := $(shell go list -m -f '{{.Version}}' k8s.io/client-go) BUILD_ARGS := --build-arg VERSION=$(VERSION) SHELL = /usr/bin/env bash -o pipefail .SHELLFLAGS = -ec -CONTAINER_TOOL ?= docker MDBOOK_DEV_HOST = 0.0.0.0 MDBOOK_DEV_PORT = 3000 E2E_SELECTOR ?= all -# ENVTEST_K8S_VERSION -# - refers to the version of kubebuilder assets to be downloaded by envtest binary. -# CONTAINER_TOOL -# - defines the container tool to be used for building images. -# Be aware that the target commands are only tested with Docker which is -# scaffolded by default. However, you might want to replace it to use other -# tools. (i.e. podman) - ##################################################################### # OS / ARCH ##################################################################### @@ -80,25 +72,25 @@ help: ## Display this help. generate: generate-manifests generate-code generate-mock generate-api-docs .PHONY: generate-manifests -generate-manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. - $(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases +generate-manifests: ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. + controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases .PHONY: generate-code -generate-code: controller-gen gowrap ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations. +generate-code: ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations. go generate ./... - $(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..." + controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..." .PHONY: generate-mock -generate-mock: mockgen ## Generate mocks for the Linode API client. - $(MOCKGEN) -source=./clients/clients.go -destination ./mock/client.go -package mock +generate-mock: ## Generate mocks for the Linode API client. + mockgen -source=./clients/clients.go -destination ./mock/client.go -package mock .PHONY: generate-flavors ## Generate template flavors. -generate-flavors: $(KUSTOMIZE) +generate-flavors: bash hack/generate-flavors.sh .PHONY: generate-api-docs -generate-api-docs: crd-ref-docs ## Generate API reference documentation. - $(CRD_REF_DOCS) \ +generate-api-docs: ## Generate API reference documentation. + crd-ref-docs \ --config=./docs/.crd-ref-docs.yaml \ --source-path=./api/ \ --renderer=markdown \ @@ -118,28 +110,33 @@ check-gen-diff: fmt: ## Run go fmt against code. go fmt ./... +.PHONY: tidy +tidy: ## Run go mod tidy against code. + go mod tidy + .PHONY: vet vet: ## Run go vet against code. go vet ./... .PHONY: gosec gosec: ## Run gosec against code. - docker run --rm -w /workdir -v $(PWD):/workdir securego/gosec:$(GOSEC_VERSION) -exclude-dir=bin -exclude-generated ./... + gosec -exclude-dir=bin -exclude-generated ./... .PHONY: lint lint: ## Run lint against code. - $(GOLANGCI_LINT) run -c .golangci.yml + golangci-lint run -c .golangci.yml .PHONY: lint lint-api: golangci-lint-custom ## Run lint against code. $(GOLANGCI_LINT_CUSTOM) run -c .golangci-kal.yml + .PHONY: nilcheck nilcheck: golangci-lint-custom ## Run nil check against code. $(GOLANGCI_LINT_CUSTOM) run -c .golangci-nilaway.yml .PHONY: vulncheck -vulncheck: govulncheck ## Run vulnerability check against code. +vulncheck: ## Run vulnerability check against code. govulncheck ./... .PHONY: docs @@ -153,22 +150,22 @@ docs: ##@ Testing: .PHONY: test -test: generate fmt vet envtest ## Run tests. - KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use ${ENVTEST_K8S_VERSION#v} --bin-dir $(CACHE_BIN) -p path)" go test -race -timeout 60s `go list ./... | grep -v ./mock$$` -coverprofile cover.out.tmp +test: generate fmt vet ## Run tests. + KUBEBUILDER_ASSETS="$(shell setup-envtest use ${ENVTEST_K8S_VERSION#v} -p path)" go test -race -timeout 60s `go list ./... | grep -v ./mock$$` -coverprofile cover.out.tmp grep -v "zz_generated.*" cover.out.tmp > cover.out rm cover.out.tmp .PHONY: e2etest -e2etest: generate local-release local-deploy chainsaw s5cmd - SSE_KEY=$$(openssl rand -base64 32) LOCALBIN=$(CACHE_BIN) $(CHAINSAW) test ./e2e --parallel 2 --selector $(E2E_SELECTOR) $(E2E_FLAGS) +e2etest: generate local-release local-deploy + SSE_KEY=$$(openssl rand -base64 32) chainsaw test ./e2e --parallel 2 --selector $(E2E_SELECTOR) $(E2E_FLAGS) .PHONY: local-deploy -local-deploy: kind-cluster tilt kustomize clusterctl - $(TILT) ci -f Tiltfile +local-deploy: kind-cluster + tilt ci -f Tiltfile .PHONY: kind-cluster -kind-cluster: kind ctlptl - $(CTLPTL) apply -f .tilt/ctlptl-config.yaml +kind-cluster: + ctlptl apply -f .tilt/ctlptl-config.yaml ##@ Test Upgrade: @@ -185,18 +182,18 @@ checkout-last-release: git checkout $(LAST_RELEASE) .PHONY: last-release-cluster -last-release-cluster: kind ctlptl tilt kustomize clusterctl chainsaw kind-cluster checkout-last-release local-release local-deploy - LOCALBIN=$(CACHE_BIN) CLUSTERCTL_CONFIG=$(CLUSTERCTL_CONFIG) SKIP_CUSTOM_DELETE=true $(CHAINSAW) test --namespace $(COMMON_NAMESPACE) --assert-timeout 600s --skip-delete ./e2e/capl-cluster-flavors/kubeadm-capl-cluster +last-release-cluster: kind-cluster checkout-last-release local-release local-deploy + CLUSTERCTL_CONFIG=$(CLUSTERCTL_CONFIG) SKIP_CUSTOM_DELETE=true chainsaw test --namespace $(COMMON_NAMESPACE) --assert-timeout 600s --skip-delete ./e2e/capl-cluster-flavors/kubeadm-capl-cluster .PHONY: test-upgrade test-upgrade: last-release-cluster checkout-latest-commit $(MAKE) local-release $(MAKE) local-deploy - LOCALBIN=$(CACHE_BIN) CLUSTERCTL_CONFIG=$(CLUSTERCTL_CONFIG) $(CHAINSAW) test --namespace $(COMMON_NAMESPACE) --assert-timeout 800s ./e2e/capl-cluster-flavors/kubeadm-capl-cluster + CLUSTERCTL_CONFIG=$(CLUSTERCTL_CONFIG) chainsaw test --namespace $(COMMON_NAMESPACE) --assert-timeout 800s ./e2e/capl-cluster-flavors/kubeadm-capl-cluster .PHONY: clean-kind-cluster -clean-kind-cluster: ctlptl - $(CTLPTL) delete -f .tilt/ctlptl-config.yaml +clean-kind-cluster: + ctlptl delete -f .tilt/ctlptl-config.yaml ## -------------------------------------- ## Build @@ -206,33 +203,13 @@ clean-kind-cluster: ctlptl build: generate fmt vet ## Build manager binary. go build -ldflags="-X github.com/linode/cluster-api-provider-linode/version.version=$(VERSION)" -o bin/manager cmd/main.go -# If you wish to build the manager image targeting other platforms you can use the --platform flag. -# (i.e. docker build --platform linux/arm64). However, you must enable docker buildKit for it. -# More info: https://docs.docker.com/develop/develop-images/build_enhancements/ -.PHONY: docker-build -docker-build: ## Build docker image with the manager. - $(CONTAINER_TOOL) build $(BUILD_ARGS) . -t $(CONTROLLER_IMAGE):$(VERSION) - -.PHONY: docker-push -docker-push: ## Push docker image with the manager. - $(CONTAINER_TOOL) push $(CONTROLLER_IMAGE):$(VERSION) - -# PLATFORMS defines the target platforms for the manager image be built to provide support to multiple -# architectures. (i.e. make docker-buildx IMG=myregistry/mypoperator:0.0.1). To use this option you need to: -# - be able to use docker buildx. More info: https://docs.docker.com/build/buildx/ -# - have enabled BuildKit. More info: https://docs.docker.com/develop/develop-images/build_enhancements/ -# - be able to push the image to your registry (i.e. if you do not set a valid value via IMG=> then the export will fail) -# To adequately provide solutions that are compatible with multiple platforms, you should consider using this option. -PLATFORMS ?= linux/arm64,linux/amd64,linux/s390x,linux/ppc64le -.PHONY: docker-buildx -docker-buildx: ## Build and push docker image for the manager for cross-platform support - # copy existing Dockerfile and insert --platform=${BUILDPLATFORM} into Dockerfile.cross, and preserve the original Dockerfile - sed -e '1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile.cross - - $(CONTAINER_TOOL) buildx create --name project-v3-builder - $(CONTAINER_TOOL) buildx use project-v3-builder - - $(CONTAINER_TOOL) buildx build $(BUILD_ARGS) --push --platform=$(PLATFORMS) --tag $(CONTROLLER_IMAGE):$(VERSION) -f Dockerfile.cross . - - $(CONTAINER_TOOL) buildx rm project-v3-builder - rm Dockerfile.cross +.PHONY: ko-build +ko-build: + $(WITH_GO_FLAGS) KO_CACHE=KOCACHE$(KOCACHE) ko build --local -t $(IMAGE_TAGS) --bare github.com/linode/cluster-api-provider-linode/cmd + +.PHONY: ko-publish +ko-publish: + $(WITH_GO_FLAGS) KO_CACHE=KOCACHE$(KOCACHE) KO_DOCKER_REPO=$(KO_DOCKER_REPO) ko build -t $(IMAGE_TAGS) --bare github.com/linode/cluster-api-provider-linode/cmd ## -------------------------------------- ## Deployment @@ -245,9 +222,9 @@ ifndef ignore-not-found endif .PHONY: tilt-cluster -tilt-cluster: ctlptl tilt kind clusterctl - $(CTLPTL) apply -f .tilt/ctlptl-config.yaml - $(TILT) up +tilt-cluster: + ctltpl apply -f .tilt/ctlptl-config.yaml + tilt up ## -------------------------------------- ## Release @@ -258,7 +235,7 @@ tilt-cluster: ctlptl tilt kind clusterctl RELEASE_DIR ?= infrastructure-linode .PHONY: release -release: kustomize clean-release set-manifest-image release-manifests generate-flavors release-templates release-metadata clean-release-git +release: clean-release set-manifest-image release-manifests generate-flavors release-templates release-metadata clean-release-git $(RELEASE_DIR): mkdir -p $(RELEASE_DIR)/ @@ -277,8 +254,8 @@ set-manifest-image: ## Update kustomize image patch file for default resource. sed -i'' -e 's@image: .*@image: '"$(REGISTRY)/$(IMAGE_NAME):$(VERSION)"'@' ./config/default/manager_image_patch.yaml .PHONY: release-manifests -release-manifests: $(KUSTOMIZE) $(RELEASE_DIR) - $(KUSTOMIZE) build config/default > $(RELEASE_DIR)/infrastructure-components.yaml +release-manifests: $(RELEASE_DIR) + kustomize build config/default > $(RELEASE_DIR)/infrastructure-components.yaml .PHONY: local-release local-release: @@ -304,224 +281,37 @@ clean-release: clean-release-git rm -rf $(RELEASE_DIR) .PHONY: clean-child-clusters -clean-child-clusters: kubectl - $(KUBECTL) delete clusters -A --all --timeout=180s - -## -------------------------------------- -## Build Dependencies -## -------------------------------------- +clean-child-clusters: + kubectl delete clusters -A --all --timeout=180s -##@ Build Dependencies: +## -------------------------------------------- +## Build deps (that can't be installed by mise) +## -------------------------------------------- -## Location to install dependencies to - -# Use CACHE_BIN for tools that cannot use devbox and LOCALBIN for tools that can use either method CACHE_BIN ?= $(CURDIR)/bin LOCALBIN ?= $(CACHE_BIN) -DEVBOX_BIN ?= $(DEVBOX_PACKAGES_DIR)/bin - -# if the $DEVBOX_PACKAGES_DIR env variable exists that means we are within a devbox shell and can safely -# use devbox's bin for our tools -ifdef DEVBOX_PACKAGES_DIR - LOCALBIN = $(DEVBOX_BIN) -endif - -export PATH := $(CACHE_BIN):$(PATH) -$(LOCALBIN): - mkdir -p $(LOCALBIN) - -$(CACHE_BIN): - mkdir -p $(CACHE_BIN) - -## -------------------------------------- -## Tooling Binaries -## -------------------------------------- - -##@ Tooling Binaries: -# setup-envtest does not have devbox support so always use CACHE_BIN - -KUBECTL ?= $(LOCALBIN)/kubectl -KUSTOMIZE ?= $(LOCALBIN)/kustomize -CTLPTL ?= $(LOCALBIN)/ctlptl -CLUSTERCTL ?= $(LOCALBIN)/clusterctl -CRD_REF_DOCS ?= $(CACHE_BIN)/crd-ref-docs -KUBEBUILDER ?= $(LOCALBIN)/kubebuilder -CONTROLLER_GEN ?= $(CACHE_BIN)/controller-gen -CONVERSION_GEN ?= $(CACHE_BIN)/conversion-gen -TILT ?= $(LOCALBIN)/tilt -KIND ?= $(LOCALBIN)/kind -CHAINSAW ?= $(LOCALBIN)/chainsaw -ENVTEST ?= $(CACHE_BIN)/setup-envtest -NILAWAY ?= $(LOCALBIN)/nilaway -GOVULNC ?= $(LOCALBIN)/govulncheck -MOCKGEN ?= $(CACHE_BIN)/mockgen -GOWRAP ?= $(CACHE_BIN)/gowrap -GOLANGCI_LINT ?= $(LOCALBIN)/golangci-lint +NILAWAY ?= $(LOCALBIN)/nilaway GOLANGCI_LINT_CUSTOM ?= $(CACHE_BIN)/golangci-lint-custom -S5CMD ?= $(CACHE_BIN)/s5cmd - -## Tool Versions -# renovate: datasource=go depName=sigs.k8s.io/kustomize -KUSTOMIZE_VERSION ?= v5.7.1 - -# renovate: datasource=go depName=github.com/tilt-dev/ctlptl -CTLPTL_VERSION ?= v0.9.0 - -# renovate: datasource=github-tags depName=kubernetes-sigs/cluster-api -CLUSTERCTL_VERSION ?= v1.12.5 - -# renovate: datasource=go depName=github.com/elastic/crd-ref-docs -CRD_REF_DOCS_VERSION ?= v0.3.0 - -# renovate: datasource=github-tags depName=kubernetes/kubernetes -KUBECTL_VERSION ?= v1.35.3 - -# renovate: datasource=github-tags depName=kubernetes-sigs/kubebuilder -KUBEBUILDER_VERSION ?= v4.13.1 - -# renovate: datasource=go depName=sigs.k8s.io/controller-runtime/tools/setup-envtest -ENVTEST_VERSION ?= release-0.22 - -# renovate: datasource=go depName=sigs.k8s.io/controller-tools -CONTROLLER_TOOLS_VERSION ?= v0.20.1 - -# renovate: datasource=github-tags depName=tilt-dev/tilt -TILT_VERSION ?= 0.36.3 - -# renovate: datasource=github-tags depName=kubernetes-sigs/kind -KIND_VERSION ?= 0.31.0 - -# renovate: datasource=go depName=github.com/kyverno/chainsaw -CHAINSAW_VERSION ?= v0.2.13 +CONVERSION_GEN ?= $(CACHE_BIN)/conversion-gen # renovate: datasource=go depName=go.uber.org/nilaway NILAWAY_VERSION ?= d2274102dc2eab9f77cef849a5470a6ebf983125 - -# renovate: datasource=go depName=golang.org/x/vuln -GOVULNC_VERSION ?= v1.1.4 - -# renovate: datasource=go depName=go.uber.org/mock/mockgen -MOCKGEN_VERSION ?= v0.6.0 - -# renovate: datasource=go depName=github.com/hexdigest/gowrap -GOWRAP_VERSION ?= v1.4.3 - -# renovate: datasource=go depName=github.com/peak/s5cmd -S5CMD_VERSION ?= v2.3.0 - # renovate: datasource=go depName=k8s.io/code-generator CONVERSION_GEN_VERSION ?= v0.35.3 -# renovate: datasource=github-tags depName=golangci/golangci-lint -GOLANGCI_LINT_VERSION ?= v2.10.1 - -# renovate: datasource=github-tags depName=securego/gosec -GOSEC_VERSION ?= 2.22.11 - -.PHONY: tools -tools: $(KUSTOMIZE) $(CTLPTL) $(CLUSTERCTL) $(KUBECTL) $(CONTROLLER_GEN) $(CONVERSION_GEN) $(TILT) $(KIND) $(CHAINSAW) $(ENVTEST) $(NILAWAY) $(GOVULNC) $(MOCKGEN) $(GOWRAP) - - -.PHONY: kustomize -kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. -$(KUSTOMIZE): $(LOCALBIN) - GOBIN=$(LOCALBIN) GO111MODULE=on go install sigs.k8s.io/kustomize/kustomize/v5@$(KUSTOMIZE_VERSION) - -.PHONY: ctlptl -ctlptl: $(CTLPTL) ## Download ctlptl locally if necessary. -$(CTLPTL): $(LOCALBIN) - GOBIN=$(LOCALBIN) go install github.com/tilt-dev/ctlptl/cmd/ctlptl@$(CTLPTL_VERSION) - -.PHONY: clusterctl -clusterctl: $(CLUSTERCTL) ## Download clusterctl locally if necessary. -$(CLUSTERCTL): $(LOCALBIN) - curl -fsSL https://github.com/kubernetes-sigs/cluster-api/releases/download/$(CLUSTERCTL_VERSION)/clusterctl-$(OS)-$(ARCH_SHORT) -o $(CLUSTERCTL) - chmod +x $(CLUSTERCTL) - -.PHONY: crd-ref-docs -crd-ref-docs: $(CRD_REF_DOCS) ## Download crd-ref-docs locally if necessary. -$(CRD_REF_DOCS): $(LOCALBIN) - GOBIN=$(CACHE_BIN) go install github.com/elastic/crd-ref-docs@$(CRD_REF_DOCS_VERSION) - -.PHONY: kubectl -kubectl: $(KUBECTL) ## Download kubectl locally if necessary. -$(KUBECTL): $(LOCALBIN) - curl -fsSL https://dl.k8s.io/release/$(KUBECTL_VERSION)/bin/$(OS)/$(ARCH_SHORT)/kubectl -o $(KUBECTL) - chmod +x $(KUBECTL) - -.PHONY: kubebuilder -kubebuilder: $(KUBEBUILDER) ## Download kubebuilder locally if necessary. -$(KUBEBUILDER): $(LOCALBIN) - curl -L -o $(LOCALBIN)/kubebuilder https://github.com/kubernetes-sigs/kubebuilder/releases/download/$(KUBEBUILDER_VERSION)/kubebuilder_$(OS)_$(ARCH_SHORT) - chmod +x $(LOCALBIN)/kubebuilder +.PHONY: nilaway +nilaway: $(NILAWAY) ## Download nilaway locally if necessary. -.PHONY: controller-gen -controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. -$(CONTROLLER_GEN): $(LOCALBIN) - GOBIN=$(CACHE_BIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION) +$(NILAWAY): $(LOCALBIN) + GOBIN=$(LOCALBIN) go install go.uber.org/nilaway/cmd/nilaway@$(NILAWAY_VERSION) .PHONY: conversion-gen conversion-gen: $(CONVERSION_GEN) ## Download conversion-gen locally if necessary. $(CONVERSION_GEN): $(LOCALBIN) GOBIN=$(CACHE_BIN) go install k8s.io/code-generator/cmd/conversion-gen@$(CONVERSION_GEN_VERSION) -.PHONY: tilt -tilt: $(TILT) ## Download tilt locally if necessary. -$(TILT): $(LOCALBIN) - TILT_OS=$(OS); \ - if [ $$TILT_OS = "darwin" ]; then \ - TILT_OS=mac; \ - fi; \ - curl -fsSL https://github.com/tilt-dev/tilt/releases/download/v$(TILT_VERSION)/tilt.$(TILT_VERSION).$$TILT_OS.$(ARCH).tar.gz | tar -xzvm -C $(LOCALBIN) tilt - -.PHONY: kind -kind: $(KIND) ## Download kind locally if necessary. -$(KIND): $(LOCALBIN) - curl -Lso $(KIND) https://github.com/kubernetes-sigs/kind/releases/download/v$(KIND_VERSION)/kind-$(OS)-$(ARCH_SHORT) - chmod +x $(KIND) - -.PHONY: chainsaw -chainsaw: $(CHAINSAW) ## Download chainsaw locally if necessary. -$(CHAINSAW): $(CACHE_BIN) - GOBIN=$(CACHE_BIN) go install github.com/kyverno/chainsaw@$(CHAINSAW_VERSION) - -.PHONY: envtest -envtest: $(ENVTEST) ## Download setup-envtest locally if necessary. -$(ENVTEST): $(CACHE_BIN) - GOBIN=$(CACHE_BIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@$(ENVTEST_VERSION) - -.phony: golangci-lint -golangci-lint: $(GOLANGCI_LINT) -$(GOLANGCI_LINT): # Build golangci-lint from tools folder. - GOBIN=$(LOCALBIN) go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION) - .phony: golangci-lint-custom golangci-lint-custom: $(GOLANGCI_LINT_CUSTOM) -$(GOLANGCI_LINT_CUSTOM): $(GOLANGCI_LINT) # Build golangci-lint-custom from custom configuration. - $(GOLANGCI_LINT) custom - -.PHONY: nilaway -nilaway: $(NILAWAY) ## Download nilaway locally if necessary. -$(NILAWAY): $(LOCALBIN) - GOBIN=$(LOCALBIN) go install go.uber.org/nilaway/cmd/nilaway@$(NILAWAY_VERSION) - -.PHONY: govulncheck -govulncheck: $(GOVULNC) ## Download govulncheck locally if necessary. -$(GOVULNC): $(LOCALBIN) - GOBIN=$(LOCALBIN) go install golang.org/x/vuln/cmd/govulncheck@$(GOVULNC_VERSION) - -.PHONY: mockgen -mockgen: $(MOCKGEN) ## Download mockgen locally if necessary. -$(MOCKGEN): $(CACHE_BIN) - GOBIN=$(CACHE_BIN) go install go.uber.org/mock/mockgen@$(MOCKGEN_VERSION) - -.PHONY: gowrap -gowrap: $(GOWRAP) ## Download gowrap locally if necessary. -$(GOWRAP): $(CACHE_BIN) - GOBIN=$(CACHE_BIN) go install github.com/hexdigest/gowrap/cmd/gowrap@$(GOWRAP_VERSION) - -.PHONY: s5cmd -s5cmd: $(S5CMD) -$(S5CMD): $(CACHE_BIN) - GOBIN=$(CACHE_BIN) go install github.com/peak/s5cmd/v2@$(S5CMD_VERSION) +$(GOLANGCI_LINT_CUSTOM): # Build golangci-lint-custom from custom configuration. + golangci-lint custom diff --git a/README.md b/README.md index 8ec3f0f49..37a14578e 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ - + diff --git a/Tiltfile b/Tiltfile index e588d2f43..ab68997ed 100644 --- a/Tiltfile +++ b/Tiltfile @@ -166,7 +166,7 @@ if debug == "true": docker_build_with_restart( "docker.io/linode/cluster-api-provider-linode", context=".", - dockerfile_contents="""FROM golang:1.22 + dockerfile_contents="""FROM golang:1.26 RUN go install github.com/go-delve/delve/cmd/dlv@latest COPY bin/manager /manager WORKDIR /""", @@ -218,7 +218,8 @@ if os.getenv("SKIP_DOCKER_BUILD", "false") != "true" and debug != "true": docker_build( "docker.io/linode/cluster-api-provider-linode", context=".", - only=("Dockerfile", "Makefile", "vendor", "go.mod", "go.sum", + dockerfile="dev.Dockerfile", + only=("dev.Dockerfile", "Makefile", "vendor", "go.mod", "go.sum", "./api", "./clients", "./cloud", "./cmd", "./internal", "./observability", "./util", "./version"), build_args={"VERSION": os.getenv("VERSION", "")}, ) diff --git a/Dockerfile b/dev.Dockerfile similarity index 98% rename from Dockerfile rename to dev.Dockerfile index d674862ce..69b33410e 100644 --- a/Dockerfile +++ b/dev.Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.25 as builder +FROM golang:1.26 as builder ARG TARGETOS ARG TARGETARCH ARG VERSION diff --git a/devbox.json b/devbox.json deleted file mode 100644 index 67d656927..000000000 --- a/devbox.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "packages": { - "clusterctl": "1.12.2", - "ctlptl": "0.9.0", - "docker": "29.4.0", - "go-tools": "2025.1.1", - "go": "1.25.5", - "golangci-lint": "2.8.0", - "govulncheck": "1.1.4", - "kind": "0.31.0", - "kustomize": "5.8.0", - "nilaway": "0-unstable-2025-03-07", - "tilt": "0.36.0", - "mdbook": "0.5.2", - "mdbook-admonish": "1.20.0", - "kyverno-chainsaw": "0.2.14", - "kubernetes-helm": "3.19.1", - "kubectl": "1.35.0", - "kubebuilder": "4.10.1", - "jq": "1.8.1", - "apple-sdk_15": { - "version": "15.2", - "excluded_platforms": ["x86_64-linux"] - } - }, - "shell": { - "init_hook": [ - "export \"GOROOT=$(go env GOROOT)\"" - ], - "scripts": {} - } -} diff --git a/devbox.lock b/devbox.lock deleted file mode 100644 index 2e0075197..000000000 --- a/devbox.lock +++ /dev/null @@ -1,1005 +0,0 @@ -{ - "lockfile_version": "1", - "packages": { - "apple-sdk_15@15.2": { - "last_modified": "2025-09-18T16:33:27Z", - "resolved": "github:NixOS/nixpkgs/f4b140d5b253f5e2a1ff4e5506edbf8267724bde#apple-sdk_15", - "source": "devbox-search", - "version": "15.2", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/3w6k7waxdw7bv0l6ip0azfaskm5ibk4p-apple-sdk-15.2", - "default": true - } - ], - "store_path": "/nix/store/3w6k7waxdw7bv0l6ip0azfaskm5ibk4p-apple-sdk-15.2" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/jd692x02r6by0hckzqhjgjccj615dsn9-apple-sdk-15.2", - "default": true - } - ], - "store_path": "/nix/store/jd692x02r6by0hckzqhjgjccj615dsn9-apple-sdk-15.2" - } - } - }, - "clusterctl@1.12.2": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#clusterctl", - "source": "devbox-search", - "version": "1.12.2", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/778jxvqkkq2417wf7khzfwm3w1w9z4n1-clusterctl-1.12.2", - "default": true - } - ], - "store_path": "/nix/store/778jxvqkkq2417wf7khzfwm3w1w9z4n1-clusterctl-1.12.2" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/8dkagw89sav6kk19sfbvpjqa0il0pw6l-clusterctl-1.12.2", - "default": true - } - ], - "store_path": "/nix/store/8dkagw89sav6kk19sfbvpjqa0il0pw6l-clusterctl-1.12.2" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/8844gbxh2cfkpgszmnwhxplm43pg7z1r-clusterctl-1.12.2", - "default": true - } - ], - "store_path": "/nix/store/8844gbxh2cfkpgszmnwhxplm43pg7z1r-clusterctl-1.12.2" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/b9sid26w0lnafiyzxpyxcink9crcvzh6-clusterctl-1.12.2", - "default": true - } - ], - "store_path": "/nix/store/b9sid26w0lnafiyzxpyxcink9crcvzh6-clusterctl-1.12.2" - } - } - }, - "ctlptl@0.9.0": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#ctlptl", - "source": "devbox-search", - "version": "0.9.0", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/129p6ypxd8by1s79svr9v734i5m5mmhd-ctlptl-0.9.0", - "default": true - } - ], - "store_path": "/nix/store/129p6ypxd8by1s79svr9v734i5m5mmhd-ctlptl-0.9.0" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/38w77srlwlfyfhbq5lvaissyw2vjnnj2-ctlptl-0.9.0", - "default": true - } - ], - "store_path": "/nix/store/38w77srlwlfyfhbq5lvaissyw2vjnnj2-ctlptl-0.9.0" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/qkp91ns0hld6j7mngd6lxbkyzh2cz5w1-ctlptl-0.9.0", - "default": true - } - ], - "store_path": "/nix/store/qkp91ns0hld6j7mngd6lxbkyzh2cz5w1-ctlptl-0.9.0" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/v4zpg3lh6kywj7gvn6i8nqy4m5nc950g-ctlptl-0.9.0", - "default": true - } - ], - "store_path": "/nix/store/v4zpg3lh6kywj7gvn6i8nqy4m5nc950g-ctlptl-0.9.0" - } - } - }, - "docker@29.4.0": { - "last_modified": "2026-04-10T12:25:30Z", - "resolved": "github:NixOS/nixpkgs/8c11f88bb9573a10a7d6bf87161ef08455ac70b9#docker", - "source": "devbox-search", - "version": "29.4.0", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/xd3ala37gimhl2s372q4x21ka7ipx7vd-docker-29.4.0", - "default": true - } - ], - "store_path": "/nix/store/xd3ala37gimhl2s372q4x21ka7ipx7vd-docker-29.4.0" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/y5n9y1r85jgxqnbpva0szlgars5qgmir-docker-29.4.0", - "default": true - } - ], - "store_path": "/nix/store/y5n9y1r85jgxqnbpva0szlgars5qgmir-docker-29.4.0" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/54hvrnh8jc97m2mphq6kjwngv3bvy50c-docker-29.4.0", - "default": true - } - ], - "store_path": "/nix/store/54hvrnh8jc97m2mphq6kjwngv3bvy50c-docker-29.4.0" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/h2jllwy4mdbd4d1a0s310zzjpx53hyxa-docker-29.4.0", - "default": true - } - ], - "store_path": "/nix/store/h2jllwy4mdbd4d1a0s310zzjpx53hyxa-docker-29.4.0" - } - } - }, - "github:NixOS/nixpkgs/nixpkgs-unstable": { - "last_modified": "2026-03-05T01:30:23Z", - "resolved": "github:NixOS/nixpkgs/66d9241e3dc2296726dc522e62dbfe89c7b449f3?lastModified=1772674223&narHash=sha256-%2FsuKbHSaSmuC9UY7G0VRQ3aO%2BQKqxAQPQ19wG7QNkF8%3D" - }, - "go-tools@2025.1.1": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#go-tools", - "source": "devbox-search", - "version": "2025.1.1", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/4x3dr69xnxc9sxlgflfrsiblny3q68rr-go-tools-2025.1.1", - "default": true - } - ], - "store_path": "/nix/store/4x3dr69xnxc9sxlgflfrsiblny3q68rr-go-tools-2025.1.1" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/l2if11jv6gjfzl0n6yvbx4wj3jkhjq1g-go-tools-2025.1.1", - "default": true - } - ], - "store_path": "/nix/store/l2if11jv6gjfzl0n6yvbx4wj3jkhjq1g-go-tools-2025.1.1" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/rrgr0ncskb35zdag07fl0zbmgbkcqq6c-go-tools-2025.1.1", - "default": true - } - ], - "store_path": "/nix/store/rrgr0ncskb35zdag07fl0zbmgbkcqq6c-go-tools-2025.1.1" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/b70brm4j9x20qr8b10r6jgy1g2dik12f-go-tools-2025.1.1", - "default": true - } - ], - "store_path": "/nix/store/b70brm4j9x20qr8b10r6jgy1g2dik12f-go-tools-2025.1.1" - } - } - }, - "go@1.25.5": { - "last_modified": "2026-01-23T17:20:52Z", - "resolved": "github:NixOS/nixpkgs/a1bab9e494f5f4939442a57a58d0449a109593fe#go", - "source": "devbox-search", - "version": "1.25.5", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/wh88zz6r1ihcp2mm7ys1f2anp8aga6n2-go-1.25.5", - "default": true - } - ], - "store_path": "/nix/store/wh88zz6r1ihcp2mm7ys1f2anp8aga6n2-go-1.25.5" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/k3knzdi0v21bf2m7vcxpdy1jnqg1h0zk-go-1.25.5", - "default": true - } - ], - "store_path": "/nix/store/k3knzdi0v21bf2m7vcxpdy1jnqg1h0zk-go-1.25.5" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/bwdahzajhqd5x14dbvkqww5f1wpsxif3-go-1.25.5", - "default": true - } - ], - "store_path": "/nix/store/bwdahzajhqd5x14dbvkqww5f1wpsxif3-go-1.25.5" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/zzvsjgylnphvhms3lgr2qlwdxmc68z66-go-1.25.5", - "default": true - } - ], - "store_path": "/nix/store/zzvsjgylnphvhms3lgr2qlwdxmc68z66-go-1.25.5" - } - } - }, - "golangci-lint@2.8.0": { - "last_modified": "2026-01-23T17:20:52Z", - "resolved": "github:NixOS/nixpkgs/a1bab9e494f5f4939442a57a58d0449a109593fe#golangci-lint", - "source": "devbox-search", - "version": "2.8.0", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ci7qq9jsgk0v1f0pzs7kb0v9rk5zwyck-golangci-lint-2.8.0", - "default": true - } - ], - "store_path": "/nix/store/ci7qq9jsgk0v1f0pzs7kb0v9rk5zwyck-golangci-lint-2.8.0" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ly2sk4i2qj8gfb0l7m5sxvyv7c8rn273-golangci-lint-2.8.0", - "default": true - } - ], - "store_path": "/nix/store/ly2sk4i2qj8gfb0l7m5sxvyv7c8rn273-golangci-lint-2.8.0" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/r1m8175dhby0agi1r43ic2scrphsjnlb-golangci-lint-2.8.0", - "default": true - } - ], - "store_path": "/nix/store/r1m8175dhby0agi1r43ic2scrphsjnlb-golangci-lint-2.8.0" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/kj9ibnlg1p3macpcw8lm4rhpcwgfjal1-golangci-lint-2.8.0", - "default": true - } - ], - "store_path": "/nix/store/kj9ibnlg1p3macpcw8lm4rhpcwgfjal1-golangci-lint-2.8.0" - } - } - }, - "govulncheck@1.1.4": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#govulncheck", - "source": "devbox-search", - "version": "1.1.4", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/cjvd14imk7b43sway8ws7fh1swfws8hx-govulncheck-1.1.4", - "default": true - } - ], - "store_path": "/nix/store/cjvd14imk7b43sway8ws7fh1swfws8hx-govulncheck-1.1.4" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/r7cpz24rpavf45d3dzviwkqs7r07ax9c-govulncheck-1.1.4", - "default": true - } - ], - "store_path": "/nix/store/r7cpz24rpavf45d3dzviwkqs7r07ax9c-govulncheck-1.1.4" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/bam9f1h02n6gjd3clv9q9mvj8dfj6lf0-govulncheck-1.1.4", - "default": true - } - ], - "store_path": "/nix/store/bam9f1h02n6gjd3clv9q9mvj8dfj6lf0-govulncheck-1.1.4" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/3ddprqx23bhzg052f9a7xsr3dz61rx3m-govulncheck-1.1.4", - "default": true - } - ], - "store_path": "/nix/store/3ddprqx23bhzg052f9a7xsr3dz61rx3m-govulncheck-1.1.4" - } - } - }, - "jq@1.8.1": { - "last_modified": "2026-03-02T19:25:24Z", - "resolved": "github:NixOS/nixpkgs/4215e62dc2cd3bc705b0a423b9719ff6be378a43#jq", - "source": "devbox-search", - "version": "1.8.1", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "bin", - "path": "/nix/store/qclllhrddhsqs87zrjhb0rikj9vh382g-jq-1.8.1-bin", - "default": true - }, - { - "name": "man", - "path": "/nix/store/fw0rb615pja12zpdqdn4w8bxvb310pf9-jq-1.8.1-man", - "default": true - }, - { - "name": "dev", - "path": "/nix/store/2hj3wiwnf5yjp0n176wgyd9f0ln11zhz-jq-1.8.1-dev" - }, - { - "name": "doc", - "path": "/nix/store/im47zqjcdg2bhx97fkwvx7p1yzi098hz-jq-1.8.1-doc" - }, - { - "name": "out", - "path": "/nix/store/w513pwkks3lw9ligjigpqniqj3dbipsl-jq-1.8.1" - } - ], - "store_path": "/nix/store/qclllhrddhsqs87zrjhb0rikj9vh382g-jq-1.8.1-bin" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "bin", - "path": "/nix/store/bnsyxn71xzc4nd86k6j25wmzncir628l-jq-1.8.1-bin", - "default": true - }, - { - "name": "man", - "path": "/nix/store/bl1f8rn2amdw86y6zyxybpz0g9bkd4yw-jq-1.8.1-man", - "default": true - }, - { - "name": "doc", - "path": "/nix/store/rdp9243l8x6pqmcrz99nwa4kf25km9w7-jq-1.8.1-doc" - }, - { - "name": "out", - "path": "/nix/store/zglcyjcxpsnqq4ip8w2myqmlv08641b0-jq-1.8.1" - }, - { - "name": "dev", - "path": "/nix/store/3iy3f3m2ikjsw8bmx7485flysxj1vgk7-jq-1.8.1-dev" - } - ], - "store_path": "/nix/store/bnsyxn71xzc4nd86k6j25wmzncir628l-jq-1.8.1-bin" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "bin", - "path": "/nix/store/silqkfms6xjsaq0w3m0g6ygl4zj9992c-jq-1.8.1-bin", - "default": true - }, - { - "name": "man", - "path": "/nix/store/034cqaasry6lv5nc3nkngp2p1ww3rib6-jq-1.8.1-man", - "default": true - }, - { - "name": "out", - "path": "/nix/store/hjc1gxah0mlc523mr4h9mxwzk7nx96hq-jq-1.8.1" - }, - { - "name": "dev", - "path": "/nix/store/504ml9mmnn1b1y50i6dd13kbadg4kwj9-jq-1.8.1-dev" - }, - { - "name": "doc", - "path": "/nix/store/yqm1xgg9ivm1jlkn2x0bwyc3l499cw4i-jq-1.8.1-doc" - } - ], - "store_path": "/nix/store/silqkfms6xjsaq0w3m0g6ygl4zj9992c-jq-1.8.1-bin" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "bin", - "path": "/nix/store/jyi1vkcbaihqbfbra4qd0107sj1jhdk4-jq-1.8.1-bin", - "default": true - }, - { - "name": "man", - "path": "/nix/store/lqxm904bymdhvi8fc2l6gpj0n4wq33a8-jq-1.8.1-man", - "default": true - }, - { - "name": "dev", - "path": "/nix/store/1m6s8nd3x7s7jddjdgydq10c5wj4dj4h-jq-1.8.1-dev" - }, - { - "name": "doc", - "path": "/nix/store/51isxd9mi828n238hj3572vmfx12msp1-jq-1.8.1-doc" - }, - { - "name": "out", - "path": "/nix/store/70bwclvic12925zck7za5y9g761l9kkh-jq-1.8.1" - } - ], - "store_path": "/nix/store/jyi1vkcbaihqbfbra4qd0107sj1jhdk4-jq-1.8.1-bin" - } - } - }, - "kind@0.31.0": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#kind", - "source": "devbox-search", - "version": "0.31.0", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/rda19grlrih0ks0mxzhzy4sqh83mb0x4-kind-0.31.0", - "default": true - } - ], - "store_path": "/nix/store/rda19grlrih0ks0mxzhzy4sqh83mb0x4-kind-0.31.0" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/kfx7g36zfqdynlj9hsaxvbswyh0k35yr-kind-0.31.0", - "default": true - } - ], - "store_path": "/nix/store/kfx7g36zfqdynlj9hsaxvbswyh0k35yr-kind-0.31.0" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/c2nw6gz2w240crs0afab0braazmaagjk-kind-0.31.0", - "default": true - } - ], - "store_path": "/nix/store/c2nw6gz2w240crs0afab0braazmaagjk-kind-0.31.0" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/j7xm61bjdrampp2bmw3zsbj896zllhgf-kind-0.31.0", - "default": true - } - ], - "store_path": "/nix/store/j7xm61bjdrampp2bmw3zsbj896zllhgf-kind-0.31.0" - } - } - }, - "kubebuilder@4.10.1": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#kubebuilder", - "source": "devbox-search", - "version": "4.10.1", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/nf3brbwy07xddy9cfbpgcqffarfcikqg-kubebuilder-4.10.1", - "default": true - } - ], - "store_path": "/nix/store/nf3brbwy07xddy9cfbpgcqffarfcikqg-kubebuilder-4.10.1" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/q1lpw3jggyzg8r10f9rkb4bvr76pnmr9-kubebuilder-4.10.1", - "default": true - } - ], - "store_path": "/nix/store/q1lpw3jggyzg8r10f9rkb4bvr76pnmr9-kubebuilder-4.10.1" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/46ywn2s21xvd039749y6nz645ibvmmmq-kubebuilder-4.10.1", - "default": true - } - ], - "store_path": "/nix/store/46ywn2s21xvd039749y6nz645ibvmmmq-kubebuilder-4.10.1" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/hkm25cwhp3ad6k4q0qs2bhr6yhfsjkv9-kubebuilder-4.10.1", - "default": true - } - ], - "store_path": "/nix/store/hkm25cwhp3ad6k4q0qs2bhr6yhfsjkv9-kubebuilder-4.10.1" - } - } - }, - "kubectl@1.35.0": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#kubectl", - "source": "devbox-search", - "version": "1.35.0", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/vc9x3pbgiayy7404pizw2597ckxbx5iv-kubectl-1.35.0", - "default": true - }, - { - "name": "man", - "path": "/nix/store/kkw3fydnm0j5623by42z87z88x65j3da-kubectl-1.35.0-man", - "default": true - }, - { - "name": "convert", - "path": "/nix/store/z7sjfxgi8hfxp2lhnmsc8cxrivq47388-kubectl-1.35.0-convert" - } - ], - "store_path": "/nix/store/vc9x3pbgiayy7404pizw2597ckxbx5iv-kubectl-1.35.0" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/dwv1pr9ammi7nvg2wrh8i1b1pc4s1kdc-kubectl-1.35.0", - "default": true - }, - { - "name": "man", - "path": "/nix/store/5xpp0xycjgp6a4j4m0p3imfx60nm8qk1-kubectl-1.35.0-man", - "default": true - }, - { - "name": "convert", - "path": "/nix/store/z9sdg7h4g18pjxsammdn8v99mxfiwanq-kubectl-1.35.0-convert" - } - ], - "store_path": "/nix/store/dwv1pr9ammi7nvg2wrh8i1b1pc4s1kdc-kubectl-1.35.0" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/aspny4z58b3ggw0v4dayngrxjgqhfkwh-kubectl-1.35.0", - "default": true - }, - { - "name": "man", - "path": "/nix/store/39lj9l9nr6q1il6x3gwvrxbncawkjicf-kubectl-1.35.0-man", - "default": true - }, - { - "name": "convert", - "path": "/nix/store/8nfmr74j1ls3parfa3l6zglfgmzm7a99-kubectl-1.35.0-convert" - } - ], - "store_path": "/nix/store/aspny4z58b3ggw0v4dayngrxjgqhfkwh-kubectl-1.35.0" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/36ji0srf1rf0fhk27410g3i0njwqrfb3-kubectl-1.35.0", - "default": true - }, - { - "name": "man", - "path": "/nix/store/11329ky5q3yd8h6b2f6dilhxd93lp6a9-kubectl-1.35.0-man", - "default": true - }, - { - "name": "convert", - "path": "/nix/store/lzbrmcxx8zwjyi3k18f5jdv8axrgcyz8-kubectl-1.35.0-convert" - } - ], - "store_path": "/nix/store/36ji0srf1rf0fhk27410g3i0njwqrfb3-kubectl-1.35.0" - } - } - }, - "kubernetes-helm@3.19.1": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#kubernetes-helm", - "source": "devbox-search", - "version": "3.19.1", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/qgnf88s44vlb5flhrdiica0x7iq48yf3-kubernetes-helm-3.19.1", - "default": true - } - ], - "store_path": "/nix/store/qgnf88s44vlb5flhrdiica0x7iq48yf3-kubernetes-helm-3.19.1" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/rmzqdyhxj0sa2fm5h2r2fsrxl19jlvis-kubernetes-helm-3.19.1", - "default": true - } - ], - "store_path": "/nix/store/rmzqdyhxj0sa2fm5h2r2fsrxl19jlvis-kubernetes-helm-3.19.1" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/gwrsg2lq73bppnj7j9afzfz6biva1jfa-kubernetes-helm-3.19.1", - "default": true - } - ], - "store_path": "/nix/store/gwrsg2lq73bppnj7j9afzfz6biva1jfa-kubernetes-helm-3.19.1" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/3bjwp28yvv86pih7k9p7n7w5jhcn8qd9-kubernetes-helm-3.19.1", - "default": true - } - ], - "store_path": "/nix/store/3bjwp28yvv86pih7k9p7n7w5jhcn8qd9-kubernetes-helm-3.19.1" - } - } - }, - "kustomize@5.8.0": { - "last_modified": "2026-01-23T17:20:52Z", - "resolved": "github:NixOS/nixpkgs/a1bab9e494f5f4939442a57a58d0449a109593fe#kustomize", - "source": "devbox-search", - "version": "5.8.0", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/1jsi4vib5i93211xjmidag2v4ms6ad01-kustomize-5.8.0", - "default": true - } - ], - "store_path": "/nix/store/1jsi4vib5i93211xjmidag2v4ms6ad01-kustomize-5.8.0" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/0x4jksb2wfci0qb1415afvffx3cclr5a-kustomize-5.8.0", - "default": true - } - ], - "store_path": "/nix/store/0x4jksb2wfci0qb1415afvffx3cclr5a-kustomize-5.8.0" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/if4b679gapwpn9fiz4hqakdb7m6n7gbl-kustomize-5.8.0", - "default": true - } - ], - "store_path": "/nix/store/if4b679gapwpn9fiz4hqakdb7m6n7gbl-kustomize-5.8.0" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/hfcikvrjjd72cs0p8sv11b4kblfjpwif-kustomize-5.8.0", - "default": true - } - ], - "store_path": "/nix/store/hfcikvrjjd72cs0p8sv11b4kblfjpwif-kustomize-5.8.0" - } - } - }, - "kyverno-chainsaw@0.2.14": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#kyverno-chainsaw", - "source": "devbox-search", - "version": "0.2.14", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/y636aw2h1mxx669x405g4gxnswbvqkgg-kyverno-chainsaw-0.2.14", - "default": true - } - ], - "store_path": "/nix/store/y636aw2h1mxx669x405g4gxnswbvqkgg-kyverno-chainsaw-0.2.14" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/2qh8px16fmjdmdk0wrqz7lfwy0vbjh24-kyverno-chainsaw-0.2.14", - "default": true - } - ], - "store_path": "/nix/store/2qh8px16fmjdmdk0wrqz7lfwy0vbjh24-kyverno-chainsaw-0.2.14" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/p5090drfrcx7vrjms14i0i1zjmb0fr1l-kyverno-chainsaw-0.2.14", - "default": true - } - ], - "store_path": "/nix/store/p5090drfrcx7vrjms14i0i1zjmb0fr1l-kyverno-chainsaw-0.2.14" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/qzhxny5pngqgpxcghfkg7a93nkfp8aq5-kyverno-chainsaw-0.2.14", - "default": true - } - ], - "store_path": "/nix/store/qzhxny5pngqgpxcghfkg7a93nkfp8aq5-kyverno-chainsaw-0.2.14" - } - } - }, - "mdbook-admonish@1.20.0": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#mdbook-admonish", - "source": "devbox-search", - "version": "1.20.0", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/afwf1mg07d7v5758im6478mh1k4d1fg4-mdbook-admonish-1.20.0", - "default": true - } - ], - "store_path": "/nix/store/afwf1mg07d7v5758im6478mh1k4d1fg4-mdbook-admonish-1.20.0" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/cgi51q4875lf7hyx1z1af81z9gssnw26-mdbook-admonish-1.20.0", - "default": true - } - ], - "store_path": "/nix/store/cgi51q4875lf7hyx1z1af81z9gssnw26-mdbook-admonish-1.20.0" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/g1a80f3jy536im4glhsw78mm5ka1fhhd-mdbook-admonish-1.20.0", - "default": true - } - ], - "store_path": "/nix/store/g1a80f3jy536im4glhsw78mm5ka1fhhd-mdbook-admonish-1.20.0" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/dj5d2w0j7256awz2pbnsl2z21h1immqb-mdbook-admonish-1.20.0", - "default": true - } - ], - "store_path": "/nix/store/dj5d2w0j7256awz2pbnsl2z21h1immqb-mdbook-admonish-1.20.0" - } - } - }, - "mdbook@0.5.2": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#mdbook", - "source": "devbox-search", - "version": "0.5.2", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/j1i33q8p2vf68wcakarb9mqsldh7rprv-mdbook-0.5.2", - "default": true - } - ], - "store_path": "/nix/store/j1i33q8p2vf68wcakarb9mqsldh7rprv-mdbook-0.5.2" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/w3w1armzbwm9m0fyslc4k0qs5wsw233a-mdbook-0.5.2", - "default": true - } - ], - "store_path": "/nix/store/w3w1armzbwm9m0fyslc4k0qs5wsw233a-mdbook-0.5.2" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/12dps14cxl96vdf14lk3bh13fmwcydb4-mdbook-0.5.2", - "default": true - } - ], - "store_path": "/nix/store/12dps14cxl96vdf14lk3bh13fmwcydb4-mdbook-0.5.2" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/b7b6khgymvp7nq0liixwxx0jjss06av3-mdbook-0.5.2", - "default": true - } - ], - "store_path": "/nix/store/b7b6khgymvp7nq0liixwxx0jjss06av3-mdbook-0.5.2" - } - } - }, - "nilaway@0-unstable-2025-03-07": { - "last_modified": "2026-02-23T15:40:43Z", - "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#nilaway", - "source": "devbox-search", - "version": "0-unstable-2025-03-07", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/3zmsnb738pjyz4hhfg4fmdijzjxpwpmq-nilaway-0-unstable-2025-03-07", - "default": true - } - ], - "store_path": "/nix/store/3zmsnb738pjyz4hhfg4fmdijzjxpwpmq-nilaway-0-unstable-2025-03-07" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/y5si2bqrn0hjd6qx4j8maqx57k5arplm-nilaway-0-unstable-2025-03-07", - "default": true - } - ], - "store_path": "/nix/store/y5si2bqrn0hjd6qx4j8maqx57k5arplm-nilaway-0-unstable-2025-03-07" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/jsxv6qjv8jy84zvznlzxs3w1s2z4gzyx-nilaway-0-unstable-2025-03-07", - "default": true - } - ], - "store_path": "/nix/store/jsxv6qjv8jy84zvznlzxs3w1s2z4gzyx-nilaway-0-unstable-2025-03-07" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/znpk4qsa37xsb1idmd3fw8pxaav19cp6-nilaway-0-unstable-2025-03-07", - "default": true - } - ], - "store_path": "/nix/store/znpk4qsa37xsb1idmd3fw8pxaav19cp6-nilaway-0-unstable-2025-03-07" - } - } - }, - "tilt@0.36.0": { - "last_modified": "2026-01-23T17:20:52Z", - "resolved": "github:NixOS/nixpkgs/a1bab9e494f5f4939442a57a58d0449a109593fe#tilt", - "source": "devbox-search", - "version": "0.36.0", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/59j4kdg7rz1sb2xlcsg9mpzx2acl2rqc-tilt-0.36.0", - "default": true - } - ], - "store_path": "/nix/store/59j4kdg7rz1sb2xlcsg9mpzx2acl2rqc-tilt-0.36.0" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/vx1w7pvq4sf8dlrfrgmx6fmgdgjz611y-tilt-0.36.0", - "default": true - } - ], - "store_path": "/nix/store/vx1w7pvq4sf8dlrfrgmx6fmgdgjz611y-tilt-0.36.0" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/5j4d4v367y3h1nj3v5p6c2wxhdvnqvw7-tilt-0.36.0", - "default": true - } - ], - "store_path": "/nix/store/5j4d4v367y3h1nj3v5p6c2wxhdvnqvw7-tilt-0.36.0" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/jbjakkxrns9i2ffcgcdj7pcfddfgf09n-tilt-0.36.0", - "default": true - } - ], - "store_path": "/nix/store/jbjakkxrns9i2ffcgcdj7pcfddfgf09n-tilt-0.36.0" - } - } - } - } -} diff --git a/docs/src/developers/development.md b/docs/src/developers/development.md index 2c6218de8..0006a107c 100644 --- a/docs/src/developers/development.md +++ b/docs/src/developers/development.md @@ -7,8 +7,7 @@ - [Setting up](#setting-up) - [Base requirements](#base-requirements) - [Clone the source code](#clone-the-source-code) - - [Enable git hooks](#enable-git-hooks) - - [Set up devbox](#recommended-set-up-devbox) + - [Install Mise](#install-mise) - [Get familiar with basic concepts](#get-familiar-with-basic-concepts) - [Developing](#developing) - [Code Overview](#code-overview) @@ -33,10 +32,6 @@ Ensure you have your `LINODE_TOKEN` set as outlined in the [getting started prerequisites](../topics/getting-started.md#Prerequisites) section. ``` -There are no requirements since development dependencies are fetched as -needed via the make targets, but a recommendation is to -[install Devbox](https://www.jetify.com/docs/devbox/installing-devbox) - #### Optional Environment Variables ```bash export LINODE_URL= # Default unset. Set this to talk to a specific linode api endpoint @@ -57,26 +52,11 @@ git clone https://github.com/linode/cluster-api-provider-linode cd cluster-api-provider-linode ``` -### [Recommended] Set up devbox - -1. Install dependent packages in your project - ```sh - devbox install - ``` - - ```admonish success title="" - This will take a while, go and grab a drink of water. - ``` +### Install Mise +Local development in this repo uses [mise](https://mise.jdx.dev/) to install and run the pinned toolchain from `mise.toml`. -2. Use devbox environment - ```sh - devbox shell - ``` +Install `mise` before working on the repo, then run `mise install` once from the repository root to provision the required tools. Run tasks with `mise run`. -From this point you can use the devbox shell like a regular shell. -The rest of the guide assumes a devbox shell is used, but the make target -dependencies will install any missing dependencies if needed when running -outside a devbox shell. ### Get familiar with basic concepts @@ -125,7 +105,7 @@ export SKIP_DOCKER_BUILD=true To build a kind cluster and start Tilt, simply run: ```sh -make local-deploy +mise run local-deploy ``` Once your kind management cluster is up and running, you can @@ -146,7 +126,7 @@ After your kind management cluster is up and running with Tilt, you should be re For local development, templates should be generated via: ```sh -make local-release +mise run local-release ``` This creates `infrastructure-local-linode/v0.0.0/` with all the cluster templates: @@ -218,7 +198,7 @@ and the [linode-ccm](../topics/addons.md#ccm) installed. ~~~admonish success title="" ClusterClass experimental feature is enabled by default in the KIND management cluster -created via `make tilt-cluster` +created via `mise run tilt-cluster` ~~~ You can use the `clusterclass` flavor to create a workload cluster as well, assuming the @@ -255,7 +235,7 @@ For any issues, please refer to the [troubleshooting guide](../topics/troublesho CAPL supports using [Delve](https://github.com/go-delve/delve/) to attach a debugger to CAPL. This will start Delve in the CAPL container on port `40000` and use Tilt live_reload to rebuild the CAPL Controller on your host and insert it into the container without needing to rebuild the container. ```bash - CAPL_DEBUG=true make tilt-cluster + CAPL_DEBUG=true mise run tilt-cluster ``` ### Automated Testing @@ -271,7 +251,7 @@ export LINODE_REGION=us-sea export LINODE_CONTROL_PLANE_MACHINE_TYPE=g6-standard-2 export LINODE_MACHINE_TYPE=g6-standard-2 -make e2etest +mise run e2etest ``` This command creates a KIND cluster, and executes all the defined tests. diff --git a/docs/src/developers/testing.md b/docs/src/developers/testing.md index 33e08b9b8..998326712 100644 --- a/docs/src/developers/testing.md +++ b/docs/src/developers/testing.md @@ -15,7 +15,7 @@ ### Executing Tests In order to run the unit tests run the following command ```bash -make test +mise run test ``` ### Creating Tests General unit tests of functions follow the same conventions for testing using Go's `testing` standard library, along with the [testify](https://github.com/stretchr/testify) toolkit for making assertions. @@ -209,9 +209,9 @@ export LINODE_REGION=us-sea export LINODE_CONTROL_PLANE_MACHINE_TYPE=g6-standard-2 export LINODE_MACHINE_TYPE=g6-standard-2 -make e2etest +mise run e2etest ``` -*Note: By default `make e2etest` runs all the e2e tests defined under `/e2e` dir* +*Note: By default `mise run e2etest` runs all the e2e tests defined under `/e2e` dir* In order to run specific test, you need to pass flags to chainsaw by setting env var `E2E_SELECTOR` @@ -219,7 +219,7 @@ Additional settings can be passed to chainsaw by setting env var `E2E_FLAGS` Example: Only running e2e tests for flavors *(default, k3s, rke2)* ```bash -make e2etest E2E_SELECTOR='flavors' E2E_FLAGS='--assert-timeout 10m0s' +mise run e2etest E2E_SELECTOR='flavors' E2E_FLAGS='--assert-timeout 10m0s' ``` *Note: We need to bump up the assert timeout to 10 mins to allow the cluster to complete building and become available* @@ -260,4 +260,4 @@ There are other selectors you can use to invoke specfic tests. Please look at th - assert: file: 01-assert.yaml ``` -3. Add any resources to create or assert on in the same directory \ No newline at end of file +3. Add any resources to create or assert on in the same directory diff --git a/envrc.example b/envrc.example index 1fed786eb..d8ba859cf 100644 --- a/envrc.example +++ b/envrc.example @@ -1,11 +1,3 @@ -# Automatically sets up your devbox environment whenever you cd into this -# directory via our direnv integration: - -eval "$(devbox generate direnv --print-envrc)" - -# check out https://www.jetpack.io/devbox/docs/ide_configuration/direnv/ -# for more details - # For the manamgement cluster export LINODE_TOKEN="" export INSTALL_RKE2_PROVIDER="" # true/false diff --git a/go.mod b/go.mod index e9f5cc25a..4cf90d3ec 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/linode/cluster-api-provider-linode -go 1.25.0 +go 1.26.0 -toolchain go1.25.11 +toolchain go1.26.4 require ( github.com/akamai/AkamaiOPEN-edgegrid-golang/v12 v12.3.0 diff --git a/hack/observability/readme.md b/hack/observability/readme.md index ee1c0924c..473828eb5 100644 --- a/hack/observability/readme.md +++ b/hack/observability/readme.md @@ -12,7 +12,7 @@ In order to install the observability tools, please run the following commands: ```shell export CAPL_MONITORING=true -make local-deploy +mise run local-deploy ``` *Note: By setting the environment variable `CAPL_MONITORING=true`, Tilt will deploy the monitoring stack* @@ -25,4 +25,4 @@ kubectl port-forward -n monitoring svc/grafana 8080:80 ### Grafana -After port-forwarding, you can access the Grafana dashboard by navigating to http://localhost:8080. The default username and password are `admin` and `capl-operator` respectively. \ No newline at end of file +After port-forwarding, you can access the Grafana dashboard by navigating to http://localhost:8080. The default username and password are `admin` and `capl-operator` respectively. diff --git a/mise.toml b/mise.toml new file mode 100644 index 000000000..325ee74be --- /dev/null +++ b/mise.toml @@ -0,0 +1,117 @@ +[settings] +minimum_release_age = "7d" # only install versions released more than 7 days ago - https://mise.en.dev/security.html#minimum-release-age + +[tools] +go = "1.26.4" +ko = "0.18.1" +kustomize = "5.8.1" +ctlptl = "0.9.0" +clusterctl = "1.12.5" +kubectl = "1.35.5" +kubebuilder = "4.13.1" +"go:sigs.k8s.io/controller-runtime/tools/setup-envtest" = "release-0.22" +kube-controller-tools = "0.20.1" +tilt = "0.36.3" +kind = "0.31.0" +"go:github.com/kyverno/chainsaw" = "0.2.15" +"go:golang.org/x/vuln/cmd/govulncheck" = "1.1.4" +"go:go.uber.org/mock/mockgen" = "0.6.0" +"aqua:hexdigest/gowrap" = "1.4.3" +s5cmd = "2.3.0" +golangci-lint = "2.11.4" +"aqua:securego/gosec" = "2.22.11" +mdbook = "0.5.2" +jq = "1.8.1" +"go:github.com/elastic/crd-ref-docs" = "0.3.0" + +[tasks.fmt] +description = "Format Go sources" +run = "make fmt" + +[tasks.tidy] +description = "Tidy Go modules" +run = "make tidy" + +[tasks.vet] +description = "Run Go vet" +run = "make vet" + +[tasks.gosec] +description = "Run Go sec" +run = "make gosec" + +[tasks.lint] +description = "Run lint checks" +run = "make lint" + +[tasks.lint-api] +description = "Run API lint checks" +run = "make lint-api" + +[tasks.nilcheck] +description = "Run nilcheck" +run = "make nilcheck" + +[tasks.vulncheck] +description = "Run vulncheck" +run = "make vulncheck" + +[tasks.docs] +description = "Serve docs" +run = "make docs" + +[tasks.generate] +description = "Regenerate manifests, code, mocks, and api docs" +run = "make generate" + +[tasks.generate-flavors] +description = "Regenerate CAPL flavors" +run = "make generate-flavors" + +[tasks.check-gen-diff] +description = "Check for diffs when regenerating" +run = "make check-gen-diff" + +[tasks.test] +description = "Run tests" +run = "make test" + +[tasks.e2etest] +description = "Run e2e tests" +run = "make e2etest" + +[tasks.test-upgrade] +description = "Run the CAPL upgrade tests" +run = "make test-upgrade" + +[tasks.clean-child-clusters] +description = "Clean up the child cluster created by CAPL" +run = "make clean-child-clusters" + +[tasks.clean-kind-cluster] +description = "Clean up the kind management cluster" +run = "make clean-kind-cluster" + +[tasks.local-deploy] +description = "Deploy CAPL locally" +run = "make local-deploy" + +[tasks.tilt-cluster] +description = "Set up a Tilt cluster with CAPL" +run = "make tilt-cluster" + +[tasks.build] +description = "Build binary" +run = "make build" + +[tasks.ko-build] +description = "Build ko image" +run = "make ko-build" + +[tasks.ko-publish] +description = "Publish ko image" +run = "make ko-publish" + +[tasks.local-release] +description = "Make a local release for testing" +run = "make local-release" diff --git a/renovate.json5 b/renovate.json5 index 9cd3b8db0..61c44d584 100644 --- a/renovate.json5 +++ b/renovate.json5 @@ -77,7 +77,6 @@ "matchManagers": ["github-actions"], "matchPackageNames": [ "dorny/paths-filter", - "jetify-com/devbox-install-action", "codecov/codecov-action", "actions/upload-artifact", ] @@ -145,12 +144,5 @@ ], enabled: false, }, - { - "groupName": "devbox", - "groupSlug": "devbox", - "matchDatasources": [ - "devbox", - ] - } ] }