From bcefbdace4f09ad5bcd5b4fd355c6391d0065aa2 Mon Sep 17 00:00:00 2001 From: odubajDT Date: Tue, 7 Nov 2023 08:49:09 +0100 Subject: [PATCH 1/3] move golangci-lint action to a separate workflow Signed-off-by: odubajDT --- .github/workflows/golangci-lint.yml | 42 +++++++++++++++++++++++++++++ .github/workflows/pr-checks.yml | 29 +++----------------- .golangci.yml | 34 +++++++++++++++++++++++ Makefile | 2 +- 4 files changed, 80 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/golangci-lint.yml create mode 100644 .golangci.yml diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml new file mode 100644 index 000000000..811aa95b0 --- /dev/null +++ b/.github/workflows/golangci-lint.yml @@ -0,0 +1,42 @@ +name: Lint checks +on: + push: + branches: + - 'main' + - '[0-9]+.[1-9][0-9]*.x' + pull_request: + branches: + - 'main' + - '[0-9]+.[1-9][0-9]*.x' + paths: + - "**.go" + - "**/go.mod" + - "**/go.sum" + - ".golangi.yml" + - ".github/workflows/golangci-lint.yml" + - "!docs/**" +env: + # renovate: datasource=github-releases depName=golangci/golangci-lint + GOLANGCI_LINT_VERSION: "v1.55.2" + GO_VERSION: "~1.20" +jobs: + golangci-lint: + name: golangci-lint + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + steps: + - name: Check out code + uses: actions/checkout@v4 + + - uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + check-latest: true + + - name: golangci-lint + uses: golangci/golangci-lint-action@v3 + with: + working-directory: ./ + version: ${{ env.GOLANGCI_LINT_VERSION }} + args: --config ./.golangci.yml -v diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index f81e412b6..434615a07 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -19,32 +19,9 @@ permissions: contents: read jobs: - lint: - runs-on: ubuntu-latest - steps: - - name: Install Go - uses: actions/setup-go@v4 - with: - go-version: ${{ env.DEFAULT_GO_VERSION }} - - name: Checkout repository - uses: actions/checkout@v3 - - name: Setup Environment - run: | - echo "GOPATH=$(go env GOPATH)" >> $GITHUB_ENV - echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - - name: Module cache - uses: actions/cache@v3 - env: - cache-name: go-mod-cache - with: - path: ~/go/pkg/mod - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/go.sum') }} - - name: Run linter - run: make lint - unit-test: name: Unit Tests - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Install Go uses: actions/setup-go@v4 @@ -78,7 +55,7 @@ jobs: docker-local: permissions: security-events: write # for github/codeql-action/upload-sarif to upload SARIF results - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 @@ -117,7 +94,7 @@ jobs: path: ${{ github.workspace }}/open-feature-operator-local.tar e2e-test: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: docker-local strategy: matrix: diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 000000000..1b879694c --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,34 @@ +run: + timeout: 5m + go: '1.20' +linters: + enable: + - gofmt # Gofmt checks whether code was gofmt-ed. By default, this tool runs with -s option to check for code simplification + - gci # Gci controls golang package import order and makes it always deterministic. + - errorlint # errorlint can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. + - containedctx # containedctx is a linter that detects struct contained context.Context field + - dogsled # Checks assignments with too many blank identifiers (e.g. x, , , _, := f()) + - nilnil # Checks that there is no simultaneous return of nil error and an invalid value. + - noctx # noctx finds sending http request without context.Context + - gocyclo # measure cyclomatic complexity + - gocognit # measure cognitive complexity + - funlen # limit function length + - dupl # Detect code duplication + +issues: + exclude-rules: + - linters: + - containedctx + - gocyclo + - gocognit + - funlen + path: _test\.go + +linters-settings: + gocyclo: + min-complexity: 10 + gocognit: + min-complexity: 20 + funlen: + lines: 120 + statements: 120 diff --git a/Makefile b/Makefile index d709801c1..6f2145991 100644 --- a/Makefile +++ b/Makefile @@ -86,7 +86,7 @@ e2e-test-validate-local: .PHONY: lint lint: go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@latest - ${GOPATH}/bin/golangci-lint run --deadline=3m --timeout=3m ./... # Run linters + ${GOPATH}/bin/golangci-lint run --deadline=3m --timeout=3m --config=./.golangci.yml -v ./... # Run linters .PHONY: generate-crdocs generate-crdocs: kustomize crdocs From 7f9d677ad21407455f3066b6a3da6eebc0a17683 Mon Sep 17 00:00:00 2001 From: odubajDT Date: Tue, 7 Nov 2023 08:49:23 +0100 Subject: [PATCH 2/3] resolve linter issues Signed-off-by: odubajDT --- apis/core/v1alpha1/flagsourceconfiguration_types.go | 2 ++ apis/core/v1beta1/groupversion_info.go | 4 ++-- controllers/common/common.go | 4 ++-- controllers/common/flagd-injector.go | 5 ++++- controllers/common/flagd-injector_test.go | 7 +++++-- controllers/common/flagd-proxy_test.go | 3 ++- controllers/common/mock/flagd-injector.go | 1 - .../core/featureflagconfiguration/controller.go | 11 +++++------ .../core/flagsourceconfiguration/controller.go | 7 ++++--- main.go | 2 +- webhooks/featureflagconfiguration_webhook.go | 5 ++--- webhooks/pod_webhook.go | 9 +++++---- webhooks/pod_webhook_component_test.go | 2 +- webhooks/pod_webhook_deprecated.go | 1 + webhooks/pod_webhook_test.go | 6 +++--- 15 files changed, 39 insertions(+), 30 deletions(-) diff --git a/apis/core/v1alpha1/flagsourceconfiguration_types.go b/apis/core/v1alpha1/flagsourceconfiguration_types.go index bee950c5d..ebc6f7b5b 100644 --- a/apis/core/v1alpha1/flagsourceconfiguration_types.go +++ b/apis/core/v1alpha1/flagsourceconfiguration_types.go @@ -196,6 +196,7 @@ type FlagSourceConfigurationList struct { Items []FlagSourceConfiguration `json:"items"` } +//nolint:gocyclo func NewFlagSourceConfigurationSpec() (*FlagSourceConfigurationSpec, error) { fsc := &FlagSourceConfigurationSpec{ MetricsPort: DefaultMetricPort, @@ -278,6 +279,7 @@ func NewFlagSourceConfigurationSpec() (*FlagSourceConfigurationSpec, error) { return fsc, nil } +//nolint:gocyclo func (fc *FlagSourceConfigurationSpec) Merge(new *FlagSourceConfigurationSpec) { if new == nil { return diff --git a/apis/core/v1beta1/groupversion_info.go b/apis/core/v1beta1/groupversion_info.go index 53ceff093..29f2d92be 100644 --- a/apis/core/v1beta1/groupversion_info.go +++ b/apis/core/v1beta1/groupversion_info.go @@ -15,8 +15,8 @@ limitations under the License. */ // Package v1beta1 contains API Schema definitions for the core v1beta1 API group -//+kubebuilder:object:generate=true -//+groupName=core.openfeature.dev +// +kubebuilder:object:generate=true +// +groupName=core.openfeature.dev package v1beta1 import ( diff --git a/controllers/common/common.go b/controllers/common/common.go index c8bc91af3..4ad4e9c97 100644 --- a/controllers/common/common.go +++ b/controllers/common/common.go @@ -3,11 +3,11 @@ package common import ( "context" "fmt" - "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "time" + "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" appsV1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" ) diff --git a/controllers/common/flagd-injector.go b/controllers/common/flagd-injector.go index 3ad44679e..3cd732e2c 100644 --- a/controllers/common/flagd-injector.go +++ b/controllers/common/flagd-injector.go @@ -4,6 +4,8 @@ import ( "context" "encoding/json" "fmt" + "time" + "github.com/go-logr/logr" "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" "github.com/open-feature/open-feature-operator/controllers/common/constant" @@ -16,7 +18,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "sigs.k8s.io/controller-runtime/pkg/client" - "time" ) const ( @@ -45,6 +46,7 @@ type FlagdContainerInjector struct { FlagDResourceRequirements corev1.ResourceRequirements } +//nolint:gocyclo func (fi *FlagdContainerInjector) InjectFlagd( ctx context.Context, objectMeta *metav1.ObjectMeta, @@ -179,6 +181,7 @@ func (fi *FlagdContainerInjector) handleSidecarSources(ctx context.Context, obje return nil } +//nolint:gocyclo func (fi *FlagdContainerInjector) buildSources(ctx context.Context, objectMeta *metav1.ObjectMeta, flagSourceConfig *v1alpha1.FlagSourceConfigurationSpec, podSpec *corev1.PodSpec, sidecar *corev1.Container) ([]types.SourceConfig, error) { var sourceCfgCollection []types.SourceConfig diff --git a/controllers/common/flagd-injector_test.go b/controllers/common/flagd-injector_test.go index c988b18d0..37ef4ebcb 100644 --- a/controllers/common/flagd-injector_test.go +++ b/controllers/common/flagd-injector_test.go @@ -3,6 +3,9 @@ package common import ( "context" "errors" + "reflect" + "testing" + "github.com/go-logr/logr/testr" "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" "github.com/open-feature/open-feature-operator/controllers/common/constant" @@ -17,10 +20,8 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/client-go/kubernetes/scheme" - "reflect" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" - "testing" ) func TestFlagdContainerInjector_InjectDefaultSyncProvider(t *testing.T) { @@ -999,6 +1000,7 @@ func Test_getSecurityContext(t *testing.T) { } } +//nolint:dupl func TestFlagdContainerInjector_EnableClusterRoleBinding_AddDefaultServiceAccountName(t *testing.T) { namespace, fakeClient := initEnableClusterroleBindingTestEnv() @@ -1042,6 +1044,7 @@ func TestFlagdContainerInjector_EnableClusterRoleBinding_AddDefaultServiceAccoun require.Equal(t, namespace, updatedCrb.Subjects[0].Namespace) } +//nolint:dupl func TestFlagdContainerInjector_EnableClusterRoleBinding_ServiceAccountName(t *testing.T) { namespace, fakeClient := initEnableClusterroleBindingTestEnv() diff --git a/controllers/common/flagd-proxy_test.go b/controllers/common/flagd-proxy_test.go index ccfb041a0..11b90bc03 100644 --- a/controllers/common/flagd-proxy_test.go +++ b/controllers/common/flagd-proxy_test.go @@ -2,6 +2,8 @@ package common import ( "context" + "testing" + "github.com/go-logr/logr/testr" "github.com/stretchr/testify/require" v1 "k8s.io/api/apps/v1" @@ -9,7 +11,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" - "testing" ) func TestNewFlagdProxyConfiguration(t *testing.T) { diff --git a/controllers/common/mock/flagd-injector.go b/controllers/common/mock/flagd-injector.go index 237eb8d5f..d08494763 100644 --- a/controllers/common/mock/flagd-injector.go +++ b/controllers/common/mock/flagd-injector.go @@ -7,7 +7,6 @@ package commonmock import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" v1alpha1 "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" v1 "k8s.io/api/core/v1" diff --git a/controllers/core/featureflagconfiguration/controller.go b/controllers/core/featureflagconfiguration/controller.go index 42a23be94..564a438e5 100644 --- a/controllers/core/featureflagconfiguration/controller.go +++ b/controllers/core/featureflagconfiguration/controller.go @@ -20,19 +20,17 @@ import ( "context" "github.com/go-logr/logr" + corev1alpha1 "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" "github.com/open-feature/open-feature-operator/controllers/common" "github.com/open-feature/open-feature-operator/pkg/utils" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" - "sigs.k8s.io/controller-runtime/pkg/builder" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/predicate" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/client" - - corev1alpha1 "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/predicate" ) // FeatureFlagConfigurationReconciler reconciles a FeatureFlagConfiguration object @@ -61,6 +59,7 @@ type FeatureFlagConfigurationReconciler struct { const CrdName = "FeatureFlagConfiguration" +//nolint:gocognit,gocyclo func (r *FeatureFlagConfigurationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { r.Log.Info("Reconciling" + CrdName) diff --git a/controllers/core/flagsourceconfiguration/controller.go b/controllers/core/flagsourceconfiguration/controller.go index fa0f9c6aa..07894641d 100644 --- a/controllers/core/flagsourceconfiguration/controller.go +++ b/controllers/core/flagsourceconfiguration/controller.go @@ -22,6 +22,8 @@ import ( "strings" "time" + "github.com/go-logr/logr" + corev1alpha1 "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" "github.com/open-feature/open-feature-operator/controllers/common" appsV1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -30,9 +32,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/predicate" - - "github.com/go-logr/logr" - corev1alpha1 "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" ) // FlagSourceConfigurationReconciler reconciles a FlagSourceConfiguration object @@ -55,6 +54,8 @@ type FlagSourceConfigurationReconciler struct { // For more details, check Reconcile and its Result here: // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.13.0/pkg/reconcile +// +//nolint:gocyclo func (r *FlagSourceConfigurationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { r.Log.Info("Searching for FlagSourceConfiguration") diff --git a/main.go b/main.go index 9164e465a..f7d21808e 100644 --- a/main.go +++ b/main.go @@ -44,7 +44,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" "sigs.k8s.io/controller-runtime/pkg/webhook" - //+kubebuilder:scaffold:imports ) const ( @@ -87,6 +86,7 @@ func init() { //+kubebuilder:scaffold:scheme } +//nolint:funlen,gocognit,gocyclo func main() { flag.StringVar(&metricsAddr, metricsBindAddressFlagName, ":8080", "The address the metric endpoint binds to.") flag.StringVar(&probeAddr, healthProbeBindAddressFlagName, ":8081", "The address the probe endpoint binds to.") diff --git a/webhooks/featureflagconfiguration_webhook.go b/webhooks/featureflagconfiguration_webhook.go index 56235f5c3..4edf5603d 100644 --- a/webhooks/featureflagconfiguration_webhook.go +++ b/webhooks/featureflagconfiguration_webhook.go @@ -7,13 +7,12 @@ import ( "net/http" "strings" - schemas "github.com/open-feature/schemas/json" - "k8s.io/apimachinery/pkg/api/errors" - "github.com/go-logr/logr" corev1alpha1 "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" + schemas "github.com/open-feature/schemas/json" "github.com/xeipuuv/gojsonschema" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) diff --git a/webhooks/pod_webhook.go b/webhooks/pod_webhook.go index 4869e34ce..76794d04b 100644 --- a/webhooks/pod_webhook.go +++ b/webhooks/pod_webhook.go @@ -3,18 +3,17 @@ package webhooks import ( "context" "encoding/json" + goErr "errors" "fmt" - controllercommon "github.com/open-feature/open-feature-operator/controllers/common" - "github.com/open-feature/open-feature-operator/controllers/common/constant" "net/http" "reflect" "strings" "time" - goErr "errors" - "github.com/go-logr/logr" "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" + controllercommon "github.com/open-feature/open-feature-operator/controllers/common" + "github.com/open-feature/open-feature-operator/controllers/common/constant" "github.com/open-feature/open-feature-operator/pkg/utils" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -57,6 +56,8 @@ type PodMutator struct { } // Handle injects the flagd sidecar (if the prerequisites are all met) +// +//nolint:gocyclo func (m *PodMutator) Handle(ctx context.Context, req admission.Request) admission.Response { defer func() { if err := recover(); err != nil { diff --git a/webhooks/pod_webhook_component_test.go b/webhooks/pod_webhook_component_test.go index 484de8b43..9c8f7b6e2 100644 --- a/webhooks/pod_webhook_component_test.go +++ b/webhooks/pod_webhook_component_test.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - controllercommon "github.com/open-feature/open-feature-operator/controllers/common" "reflect" "testing" "time" @@ -14,6 +13,7 @@ import ( "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" corev1alpha2 "github.com/open-feature/open-feature-operator/apis/core/v1alpha2" corev1alpha3 "github.com/open-feature/open-feature-operator/apis/core/v1alpha3" + controllercommon "github.com/open-feature/open-feature-operator/controllers/common" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" admissionv1 "k8s.io/api/admission/v1" diff --git a/webhooks/pod_webhook_deprecated.go b/webhooks/pod_webhook_deprecated.go index 4cc70560c..ce0b5e8a0 100644 --- a/webhooks/pod_webhook_deprecated.go +++ b/webhooks/pod_webhook_deprecated.go @@ -9,6 +9,7 @@ import ( "github.com/open-feature/open-feature-operator/pkg/utils" ) +//nolint:gocyclo func (m *PodMutator) handleFeatureFlagConfigurationAnnotation(ctx context.Context, fcConfig *v1alpha1.FlagSourceConfigurationSpec, ffconfigAnnotation string, defaultNamespace string) error { for _, ffName := range parseList(ffconfigAnnotation) { ns, name := utils.ParseAnnotation(ffName, defaultNamespace) diff --git a/webhooks/pod_webhook_test.go b/webhooks/pod_webhook_test.go index 80f559bbd..b517eb4fd 100644 --- a/webhooks/pod_webhook_test.go +++ b/webhooks/pod_webhook_test.go @@ -5,17 +5,17 @@ import ( "encoding/json" "errors" "fmt" - "github.com/golang/mock/gomock" - "github.com/open-feature/open-feature-operator/controllers/common/constant" - commonmock "github.com/open-feature/open-feature-operator/controllers/common/mock" "net/http" "reflect" "testing" "github.com/go-logr/logr/testr" + "github.com/golang/mock/gomock" "github.com/open-feature/open-feature-operator/apis/core/v1alpha1" "github.com/open-feature/open-feature-operator/apis/core/v1alpha2" "github.com/open-feature/open-feature-operator/apis/core/v1alpha3" + "github.com/open-feature/open-feature-operator/controllers/common/constant" + commonmock "github.com/open-feature/open-feature-operator/controllers/common/mock" "github.com/open-feature/open-feature-operator/pkg/utils" "github.com/stretchr/testify/require" admissionv1 "k8s.io/api/admission/v1" From b0971c5f3527e8e6102a6479160db6cb0b2969b2 Mon Sep 17 00:00:00 2001 From: odubajDT Date: Tue, 7 Nov 2023 11:21:33 +0100 Subject: [PATCH 3/3] set ubuntu version to stable Signed-off-by: odubajDT --- .github/workflows/pr-lint.yml | 2 +- .github/workflows/release-please.yml | 8 ++++---- .github/workflows/validate-crd-docs.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pr-lint.yml b/.github/workflows/pr-lint.yml index c7d904fec..1d532ea33 100644 --- a/.github/workflows/pr-lint.yml +++ b/.github/workflows/pr-lint.yml @@ -18,7 +18,7 @@ jobs: pull-requests: write statuses: write # for amannn/action-semantic-pull-request to mark status of analyzed PR name: Validate PR title - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: amannn/action-semantic-pull-request@v5 env: diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 8170f4987..a9544b851 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -20,7 +20,7 @@ jobs: permissions: contents: write # for google-github-actions/release-please-action to create release commit pull-requests: write # for google-github-actions/release-please-action to create release PR - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Release-please creates a PR that tracks all changes steps: @@ -38,7 +38,7 @@ jobs: permissions: packages: write # to push the container image needs: release-please - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: ${{ needs.release-please.outputs.release_created }} steps: - name: Checkout @@ -104,7 +104,7 @@ jobs: permissions: contents: write # for softprops/action-gh-release to create GitHub release needs: release-please - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: ${{ needs.release-please.outputs.release_created }} steps: - name: Checkout @@ -139,7 +139,7 @@ jobs: needs: release-please permissions: contents: write - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: ${{ needs.release-please.outputs.release_created }} steps: - name: Checkout diff --git a/.github/workflows/validate-crd-docs.yml b/.github/workflows/validate-crd-docs.yml index cc8e340b0..69c9c49b7 100644 --- a/.github/workflows/validate-crd-docs.yml +++ b/.github/workflows/validate-crd-docs.yml @@ -9,7 +9,7 @@ defaults: jobs: check-helm-docs: name: Check crd documentation values - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Check out code uses: actions/checkout@v3