From 4889612e460deaf4a46a206712a3007d9b7ab5d1 Mon Sep 17 00:00:00 2001 From: Francesco Canovai Date: Wed, 25 Sep 2024 09:34:06 +0200 Subject: [PATCH] ci: initial pipeline Signed-off-by: Francesco Canovai --- .github/workflows/ci.yml | 44 +++++++ .github/workflows/release-please.yml | 57 +++++++++ .github/workflows/release-publish.yml | 31 +++++ .gitignore | 8 +- .golangci.yml | 87 ++++++------- .release-please-manifest.json | 3 + .spellcheck.yaml | 18 +++ .wordlist.txt | 3 + Taskfile.yml | 170 ++++++++++++++++++++++++++ commitlint.config.js | 12 ++ dagger/gotest/.gitattributes | 4 + dagger/gotest/.gitignore | 4 + dagger/gotest/dagger.json | 5 + dagger/gotest/go.mod | 47 +++++++ dagger/gotest/go.sum | 77 ++++++++++++ dagger/gotest/main.go | 97 +++++++++++++++ release-please-config.json | 12 ++ 17 files changed, 636 insertions(+), 43 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release-please.yml create mode 100644 .github/workflows/release-publish.yml create mode 100644 .release-please-manifest.json create mode 100644 .spellcheck.yaml create mode 100644 .wordlist.txt create mode 100644 Taskfile.yml create mode 100644 commitlint.config.js create mode 100644 dagger/gotest/.gitattributes create mode 100644 dagger/gotest/.gitignore create mode 100644 dagger/gotest/dagger.json create mode 100644 dagger/gotest/go.mod create mode 100644 dagger/gotest/go.sum create mode 100644 dagger/gotest/main.go create mode 100644 release-please-config.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e394a47 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,44 @@ +name: CI + +on: + pull_request: + workflow_dispatch: + +jobs: + ci: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + # We need the full history for the commitlint task + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + - name: Install Task + uses: arduino/setup-task@v2 + - name: Install Dagger + env: + # renovate: datasource=github-tags depName=dagger/dagger versioning=semver + DAGGER_VERSION: 0.13.3 + run: | + curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh + - name: Run CI task + run: | + task ci + - name: Write manifest + run: | + task manifest + - name: Publish images + if: | + github.event_name == 'workflow_dispatch' || + github.event.pull_request.head.repo.full_name == github.repository + env: + REGISTRY_USER: ${{ github.actor }} + REGISTRY_PASSWORD: ${{ secrets.GITHUB_TOKEN }} + run: | + task publish + - name: Attach manifest to workflow run + uses: actions/upload-artifact@v4 + with: + name: manifest.yaml + path: ./manifest.yaml diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 0000000..8179874 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,57 @@ +name: release-please + +on: + push: + branches: + - main + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + # TODO: googleapis/release-please-action cannot sign commits yet. + # We'll use the cli until there's a fix for + # https://github.com/googleapis/release-please/issues/2280. + - uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Checkout + uses: actions/checkout@v4 + - name: Install Task + uses: arduino/setup-task@v2 + - name: Install Dagger + env: + # renovate: datasource=github-tags depName=dagger/dagger versioning=semver + DAGGER_VERSION: 0.13.3 + run: | + curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh + - name: Create image and manifest + env: + REGISTRY_USER: ${{ github.actor }} + REGISTRY_PASSWORD: ${{ secrets.GITHUB_TOKEN }} + run: | + task publish + task manifest + - name: Attach manifest to workflow run + uses: actions/upload-artifact@v4 + with: + name: manifest.yaml + path: ./manifest.yaml + # TODO: remove bump-minor-pre-major when in production. It prevents + # release-please from bumping the major version on breaking changes. + # TODO: remove release-as after first release. Used to set the first + # release version, which would default to 1.0.0. Set the version + # manually also for 1.0.0. + # We use a GitHub token with write permissions to create the release, + # otherwise we won't be able to trigger a new run when pushing on main. + - name: Run release-please + run: | + npx release-please release-pr \ + --token="${{ secrets.REPO_PAT }}" \ + --repo-url="${{ github.repository }}" \ + --bump-minor-pre-major=true \ + --release-as=0.1.0 \ + --signoff "Peggie "; + npx release-please github-release \ + --token="${{ secrets.REPO_PAT }}" \ + --repo-url="${{ github.repository }}" diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml new file mode 100644 index 0000000..d88e948 --- /dev/null +++ b/.github/workflows/release-publish.yml @@ -0,0 +1,31 @@ +name: Release Publish Artifacts +on: + release: + types: [published] + +jobs: + release-publish-artifacts: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Task + uses: arduino/setup-task@v2 + - name: Install Dagger + env: + # renovate: datasource=github-tags depName=dagger/dagger versioning=semver + DAGGER_VERSION: 0.13.3 + run: | + curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh + - name: Create image and manifest + env: + REGISTRY_USER: ${{ github.actor }} + REGISTRY_PASSWORD: ${{ secrets.GITHUB_TOKEN }} + run: | + task publish + task manifest + - name: Attach manifest to release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + task upload-manifest-to-release diff --git a/.gitignore b/.gitignore index 4280a2d..4b4cc1f 100644 --- a/.gitignore +++ b/.gitignore @@ -26,5 +26,11 @@ go.work *.swo *~ -# Temporary files +# Dependency directories (remove the comment below to include it) vendor/ + +# Go workspace file +go.work + +# Taskfile cache +.task diff --git a/.golangci.yml b/.golangci.yml index aac8a13..3c4e64c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,47 +1,50 @@ -run: - timeout: 5m - allow-parallel-runners: true +linters-settings: + lll: + line-length: 120 + gci: + sections: + - standard + - default + - prefix(github.com/cloudnative-pg/plugin-barman-cloud) + - blank + - dot + nlreturn: + # Size of the block (including return statement that is still "OK") + # so no return split required. + # Default: 1 + block-size: 3 issues: - # don't skip warning about doc comments - # don't exclude the default set of lint - exclude-use-default: false - # restore some of the defaults - # (fill in the rest as needed) exclude-rules: - - path: "api/*" + # Allow dot imports for ginkgo and gomega + - source: ginkgo|gomega linters: - - lll - - path: "internal/*" - linters: - - dupl - - lll -linters: - disable-all: true - enable: - - dupl - - errcheck - - exportloopref - - ginkgolinter - - goconst - - gocyclo - - gofmt - - goimports - - gosimple - - govet - - ineffassign - - lll - - misspell - - nakedret - - prealloc - - revive - - staticcheck - - typecheck - - unconvert - - unparam - - unused + - revive + text: "should not use dot imports" + - linters: + - stylecheck + text: "should not use dot imports" + exclude-dirs: + - vendor -linters-settings: - revive: - rules: - - name: comment-spacings +linters: + enable-all: true + disable: + - depguard + - err113 + - exhaustruct + - execinquery + - exportloopref + - funlen + - gochecknoglobals + - gochecknoinits + - godox + - gomnd + - paralleltest + - testpackage + - varnamelen + - wsl + +run: + timeout: 10m + allow-parallel-runners: true diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..e18ee07 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.0.0" +} diff --git a/.spellcheck.yaml b/.spellcheck.yaml new file mode 100644 index 0000000..4bfff46 --- /dev/null +++ b/.spellcheck.yaml @@ -0,0 +1,18 @@ +matrix: +- name: Markdown + sources: + # Ignore the CHANGELOG.md file, it is autogenerated + - ./**/*.md|!./CHANGELOG.md + dictionary: + wordlists: + - .wordlist.txt + aspell: + lang: en + d: en_US + pipeline: + - pyspelling.filters.markdown: + - pyspelling.filters.html: + ignores: + - ':matches(code, pre)' + - 'code' + - 'pre' diff --git a/.wordlist.txt b/.wordlist.txt new file mode 100644 index 0000000..7179089 --- /dev/null +++ b/.wordlist.txt @@ -0,0 +1,3 @@ +cnpg +CloudNativePG +TODO diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..28eda12 --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,170 @@ +version: 3 + +tasks: + lint: + desc: Run golangci-lint + env: + # renovate: datasource=git-refs depName=golangci-lint lookupName=https://github.com/sagikazarmark/daggerverse currentValue=main + DAGGER_GOLANGCI_LINT_SHA: b2bd806a2c43a5a58459aa7969d0e3740e66ec43 + cmds: + - > + GITHUB_REF= dagger -s call -m github.com/sagikazarmark/daggerverse/golangci-lint@${DAGGER_GOLANGCI_LINT_SHA} + run --source . --config .golangci.yml stdout + sources: + - ./**/*.go + + spellcheck: + desc: Run spellcheck + env: + # renovate: datasource=git-refs depName=spellcheck lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main + DAGGER_SPELLCHECK_SHA: 5f99d3a96134f1a4cca9384b7367f0c8c23abd63 + cmds: + - > + GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/spellcheck@${DAGGER_SPELLCHECK_SHA} + spellcheck --source . with-exec --use-entrypoint --args="" stdout + sources: + - ./**/*.md + - .spellcheck.yaml + - .wordlist.txt + + commitlint: + desc: Check for conventional commits + env: + # renovate: datasource=git-refs depName=commitlint lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main + DAGGER_COMMITLINT_SHA: 5f99d3a96134f1a4cca9384b7367f0c8c23abd63 + cmds: + - > + GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/commitlint@${DAGGER_COMMITLINT_SHA} + lint --source . --args "--from=origin/main" stdout + + uncommitted: + desc: Check for uncommitted changes + env: + # renovate: datasource=git-refs depName=uncommitted lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main + DAGGER_UNCOMMITTED_SHA: 5f99d3a96134f1a4cca9384b7367f0c8c23abd63 + cmds: + - GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/uncommitted@${DAGGER_UNCOMMITTED_SHA} check-uncommitted --source . stdout + sources: + - ./** + + go-test: + desc: Run go test + env: + # renovate: datasource=docker depName=golang versioning=semver + GOLANG_IMAGE_VERSION: 1.23.1 + # renovate: datasource=git-refs depname=kubernetes packageName=https://github.com/kubernetes/kubernetes versioning=semver + K8S_VERSION: 1.31.0 + # renovate: datasource=git-refs depName=controller-runtime packageName=https://github.com/kubernetes-sigs/controller-runtime versioning=semver + SETUP_ENVTEST_VERSION: 0.19.0 + cmds: + - > + GITHUB_REF= dagger -s call -m ./dagger/gotest + --go-version ${GOLANG_IMAGE_VERSION} + --kube-version ${K8S_VERSION} + --setup-envtest-version ${SETUP_ENVTEST_VERSION} + unit-test --src . + sources: + - ./**/*.go + + build-image: + desc: Build a container image for the plugin + env: + # renovate: datasource=git-refs depName=docker lookupName=https://github.com/purpleclay/daggerverse currentValue=main + DAGGER_DOCKER_SHA: dcf4cc7865ada8433f601f728e4a019b68d1fe4e + cmds: + - > + GITHUB_REF= dagger -s call -m github.com/purpleclay/daggerverse/docker@${DAGGER_DOCKER_SHA} + build --dir . --platform linux/amd64 image > /dev/null + + ci: + desc: Run the CI pipeline + deps: + - spellcheck + - commitlint + - uncommitted + - lint + - go-test + - build-image + + publish: + desc: Build and publish a container image for the plugin + requires: + # We expect this to run in a GitHub workflow, so we put a few GitHub-specific vars here + # to prevent running this task locally by accident. + vars: + - CI + - GITHUB_REPOSITORY + - GITHUB_REF + - GITHUB_REF_NAME + - REGISTRY_USER + - REGISTRY_PASSWORD + vars: + IMAGE_NAME: ghcr.io/{{.GITHUB_REPOSITORY}}{{if not (hasPrefix "refs/tags/v" .GITHUB_REF)}}-testing{{end}} + # remove /merge suffix from the branch name. This is a workaround for the GitHub workflow on PRs, + # where the branch name is suffixed with /merge. Prepend pr- to the branch name on PRs. + IMAGE_VERSION: '{{regexReplaceAll "(\\d+)/merge" .GITHUB_REF_NAME "pr-${1}"}}' + env: + # renovate: datasource=git-refs depName=docker lookupName=https://github.com/purpleclay/daggerverse currentValue=main + DAGGER_DOCKER_SHA: dcf4cc7865ada8433f601f728e4a019b68d1fe4e + cmds: + - > + dagger -s call -m github.com/purpleclay/daggerverse/docker@${DAGGER_DOCKER_SHA} + --registry ghcr.io --username $REGISTRY_USER --password env:REGISTRY_PASSWORD + build --dir . --platform linux/amd64 + publish --ref {{.IMAGE_NAME}} --tags {{.IMAGE_VERSION}} + + manifest: + desc: Update the image in the Kustomization + requires: + # We expect this to run in a GitHub workflow, so we put a few GitHub-specific vars here + # to prevent running this task locally by accident. + vars: + - CI + - GITHUB_REPOSITORY + - GITHUB_REF + - GITHUB_REF_NAME + vars: + IMAGE_NAME: ghcr.io/{{.GITHUB_REPOSITORY}}{{if not (hasPrefix "refs/tags/v" .GITHUB_REF)}}-testing{{end}} + # remove /merge suffix from the branch name. This is a workaround for the GitHub workflow on PRs, + # where the branch name is suffixed with /merge. Prepend pr- to the branch name on PRs. + IMAGE_VERSION: '{{regexReplaceAll "(\\d+)/merge" .GITHUB_REF_NAME "pr-${1}"}}' + env: + # renovate: datasource=git-refs depName=kustomize lookupName=https://github.com/sagikazarmark/daggerverse currentValue=main + DAGGER_KUSTOMIZE_SHA: d814d0d7c421348f51cdda96870a05ca2aa8e96a + cmds: + - > + dagger -s call -m github.com/sagikazarmark/daggerverse/kustomize@${DAGGER_KUSTOMIZE_SHA} + edit --source config --dir default set image --image controller={{.IMAGE_NAME}}:{{.IMAGE_VERSION}} + directory export --path manifest-build + - > + dagger -s call -m github.com/sagikazarmark/daggerverse/kustomize@${DAGGER_KUSTOMIZE_SHA} + build --source manifest-build --dir default export --path manifest.yaml + + upload-manifest-to-release: + desc: Upload the manifest to the release + requires: + # We expect this to run in a GitHub workflow, so we put a few GitHub-specific vars here + # to prevent running this task locally by accident. + vars: + - CI + - GITHUB_REPOSITORY + - GITHUB_REF + - GITHUB_REF_NAME + - GITHUB_TOKEN + env: + # renovate: datasource=git-refs depName=gh lookupName=https://github.com/sagikazarmark/daggerverse + DAGGER_GH_SHA: 8f444e2c2b8e8162cea76d702086034ed3edc4f1 + preconditions: + - sh: "[[ {{.GITHUB_REF}} =~ 'refs/tags/v.*' ]]" + msg: not a tag, failing + cmds: + - > + dagger -s call -m github.com/sagikazarmark/daggerverse/gh@${DAGGER_GH_SHA} + with-source --source . + run --repo {{.GITHUB_REPOSITORY}} --token env:GITHUB_TOKEN + --cmd "release upload {{.GITHUB_REF_NAME}} manifest.yaml" + + clean: + desc: Remove autogenerated artifacts + cmds: + - rm -rf .task/ diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..85ce1e0 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,12 @@ +const Configuration= { + extends: ['@commitlint/config-conventional'], + formatter: '@commitlint/format', + rules: { + 'body-empty': [1, 'never'], + 'body-case': [2, 'always', 'sentence-case'], + 'references-empty': [1, 'never'], + 'signed-off-by': [2, 'always', 'Signed-off-by:'], + }, +}; + +module.exports = Configuration; diff --git a/dagger/gotest/.gitattributes b/dagger/gotest/.gitattributes new file mode 100644 index 0000000..3a45493 --- /dev/null +++ b/dagger/gotest/.gitattributes @@ -0,0 +1,4 @@ +/dagger.gen.go linguist-generated +/internal/dagger/** linguist-generated +/internal/querybuilder/** linguist-generated +/internal/telemetry/** linguist-generated diff --git a/dagger/gotest/.gitignore b/dagger/gotest/.gitignore new file mode 100644 index 0000000..7ebabcc --- /dev/null +++ b/dagger/gotest/.gitignore @@ -0,0 +1,4 @@ +/dagger.gen.go +/internal/dagger +/internal/querybuilder +/internal/telemetry diff --git a/dagger/gotest/dagger.json b/dagger/gotest/dagger.json new file mode 100644 index 0000000..7037886 --- /dev/null +++ b/dagger/gotest/dagger.json @@ -0,0 +1,5 @@ +{ + "name": "gotest", + "sdk": "go", + "engineVersion": "v0.13.3" +} diff --git a/dagger/gotest/go.mod b/dagger/gotest/go.mod new file mode 100644 index 0000000..deb3f26 --- /dev/null +++ b/dagger/gotest/go.mod @@ -0,0 +1,47 @@ +module dagger/gotest + +go 1.23.1 + +require ( + github.com/99designs/gqlgen v0.17.49 + github.com/Khan/genqlient v0.7.0 + github.com/vektah/gqlparser/v2 v2.5.16 + go.opentelemetry.io/otel v1.27.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 + go.opentelemetry.io/otel/log v0.3.0 + go.opentelemetry.io/otel/sdk v1.27.0 + go.opentelemetry.io/otel/sdk/log v0.3.0 + go.opentelemetry.io/otel/trace v1.27.0 + go.opentelemetry.io/proto/otlp v1.3.1 + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa + golang.org/x/sync v0.8.0 + google.golang.org/grpc v1.65.0 +) + +require ( + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/sosodev/duration v1.3.1 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect + go.opentelemetry.io/otel/metric v1.27.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/protobuf v1.34.2 // indirect +) + +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 + +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 + +replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.3.0 + +replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.3.0 diff --git a/dagger/gotest/go.sum b/dagger/gotest/go.sum new file mode 100644 index 0000000..f6bb539 --- /dev/null +++ b/dagger/gotest/go.sum @@ -0,0 +1,77 @@ +github.com/99designs/gqlgen v0.17.49 h1:b3hNGexHd33fBSAd4NDT/c3NCcQzcAVkknhN9ym36YQ= +github.com/99designs/gqlgen v0.17.49/go.mod h1:tC8YFVZMed81x7UJ7ORUwXF4Kn6SXuucFqQBhN8+BU0= +github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w= +github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= +github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/vektah/gqlparser/v2 v2.5.16 h1:1gcmLTvs3JLKXckwCwlUagVn/IlV2bwqle0vJ0vy5p8= +github.com/vektah/gqlparser/v2 v2.5.16/go.mod h1:1lz1OeCqgQbQepsGxPVywrjdBHW2T08PUS3pJqepRww= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 h1:oM0GTNKGlc5qHctWeIGTVyda4iFFalOzMZ3Ehj5rwB4= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88/go.mod h1:JGG8ebaMO5nXOPnvKEl+DiA4MGwFjCbjsxT1WHIEBPY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 h1:ccBrA8nCY5mM0y5uO7FT0ze4S0TuFcWdDB2FxGMTjkI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0/go.mod h1:/9pb6634zi2Lk8LYg9Q0X8Ar6jka4dkFOylBLbVQPCE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= +go.opentelemetry.io/otel/log v0.3.0 h1:kJRFkpUFYtny37NQzL386WbznUByZx186DpEMKhEGZs= +go.opentelemetry.io/otel/log v0.3.0/go.mod h1:ziCwqZr9soYDwGNbIL+6kAvQC+ANvjgG367HVcyR/ys= +go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= +go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= +go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= +go.opentelemetry.io/otel/sdk/log v0.3.0 h1:GEjJ8iftz2l+XO1GF2856r7yYVh74URiF9JMcAacr5U= +go.opentelemetry.io/otel/sdk/log v0.3.0/go.mod h1:BwCxtmux6ACLuys1wlbc0+vGBd+xytjmjajwqqIul2g= +go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= +go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/dagger/gotest/main.go b/dagger/gotest/main.go new file mode 100644 index 0000000..05801c4 --- /dev/null +++ b/dagger/gotest/main.go @@ -0,0 +1,97 @@ +// A generated module for Gotest functions +// +// This module has been generated via dagger init and serves as a reference to +// basic module structure as you get started with Dagger. +// +// Two functions have been pre-created. You can modify, delete, or add to them, +// as needed. They demonstrate usage of arguments and return types using simple +// echo and grep commands. The functions can be called from the dagger CLI or +// from one of the SDKs. +// +// The first line in this comment block is a short description line and the +// rest is a long description with more detail on the module's purpose or usage, +// if appropriate. All modules should have a short description. + +package main + +import ( + "context" + "fmt" + + "dagger/gotest/internal/dagger" +) + +type Gotest struct { + // +private + Ctr *dagger.Container + // +private + KubeVersion string +} + +func New( + // Go version + // + // +optional + // +default="latest" + goVersion string, + // setup-envtest version + // +optional + // +default="0.19.0" + setupEnvtestVersion string, + // Kubernetes version + // +optional + // +default="1.31.0" + kubeVersion string, + // Container to run the tests + // +optional + ctr *dagger.Container, +) *Gotest { + if ctr != nil { + return &Gotest{Ctr: ctr} + } + + user := "noroot" + modCachePath := fmt.Sprintf("/home/%s/go/pkg/mod", user) + goCachePath := fmt.Sprintf("/home/%s/.cache/go-build", user) + ctr = dag.Container().From("golang:"+goVersion). + WithExec([]string{"curl", "-L", + fmt.Sprintf("https://dl.k8s.io/release/v%v/bin/linux/amd64/kubectl", kubeVersion), + "-o", "/usr/local/bin/kubectl"}). + WithExec([]string{"chmod", "+x", "/usr/local/bin/kubectl"}). + WithExec([]string{"curl", "-L", + fmt.Sprintf( + "https://github.com/kubernetes-sigs/controller-runtime/releases/download/v%v/setup-envtest-linux-amd64", + setupEnvtestVersion), + "-o", "/usr/local/bin/setup-envtest"}). + WithExec([]string{"chmod", "+x", "/usr/local/bin/setup-envtest"}). + WithExec([]string{"useradd", "-m", user}). + WithUser(user). + WithEnvVariable("CGO_ENABLED", "0"). + WithEnvVariable("GOMODCACHE", modCachePath). + WithEnvVariable("GOCACHE", goCachePath). + WithMountedCache(modCachePath, dag.CacheVolume("go-mod"), + dagger.ContainerWithMountedCacheOpts{Owner: user}). + WithMountedCache(goCachePath, dag.CacheVolume("go-build"), + dagger.ContainerWithMountedCacheOpts{Owner: user}) + + return &Gotest{Ctr: ctr, KubeVersion: kubeVersion} +} + +func (m *Gotest) UnitTest( + ctx context.Context, + // Source directory + // +required + src *dagger.Directory, +) (string, error) { + envtestCmd := []string{"setup-envtest", "use", "-p", "path", m.KubeVersion} + return m.Ctr.WithDirectory("/src", src). + // Setup envtest. There is no proper way to install it from a git release, so we use the go install command + WithExec(envtestCmd). + WithEnvVariable("KUBEBUILDER_ASSETS", + fmt.Sprintf("/home/noroot/.local/share/kubebuilder-envtest/k8s/%v-linux-amd64", m.KubeVersion), + ). + WithWorkdir("/src"). + // Exclude the e2e tests, we don't want to run them here + WithoutDirectory("/src/test/e2e"). + WithExec([]string{"go", "test", "./..."}).Stdout(ctx) +} diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..b3f9a1d --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,12 @@ +{ + "changelog-path": "CHANGELOG.md", + "release-type": "go", + "bump-minor-pre-major": false, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease": false, + "packages": { + ".": {} + }, + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json" +}