diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d37fb774ea7276322c247051374558b1e5f83f91..bf4db2cb600ad5c7be5328da66224d5aa468ae9a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,7 +10,7 @@ include: file: '/templates/validation.yml' - project: 'to-be-continuous/bash' ref: '3.3' - file: 'templates/gitlab-ci-bash.yml' + file: '/templates/gitlab-ci-bash.yml' - project: 'to-be-continuous/semantic-release' ref: '3.7' file: '/templates/gitlab-ci-semrel.yml' diff --git a/README.md b/README.md index bbe96c8b9965f2cc20bb59e58c5e92eac5c80118..f3acfc5aeeee1cca9ce5341f5aa9f887742a6844 100644 --- a/README.md +++ b/README.md @@ -4,25 +4,48 @@ This project implements a GitLab CI/CD template to build, test and analyse your ## Usage -In order to include this template in your project, add the following to your `gitlab-ci.yml`: +This template can be used both as a [CI/CD component](https://docs.gitlab.com/ee/ci/components/#use-a-component-in-a-cicd-configuration) +or using the legacy [`include:project`](https://docs.gitlab.com/ee/ci/yaml/index.html#includeproject) syntax. + +### Use as a CI/CD component + +Add the following to your `gitlab-ci.yml`: + +```yaml +include: + # 1: include the component + - component: gitlab.com/to-be-continuous/golang/gitlab-ci-golang@4.7.0 + # 2: set/override component inputs + inputs: + image: "registry.hub.docker.com/library/golang:buster" # ⚠ this is only an example +``` + +### Use as a CI/CD template (legacy) + +Add the following to your `gitlab-ci.yml`: ```yaml include: + # 1: include the template - project: 'to-be-continuous/golang' ref: '4.7.0' file: '/templates/gitlab-ci-golang.yml' + +variables: + # 2: set/override template variables + GO_IMAGE: "registry.hub.docker.com/library/golang:buster" # ⚠ this is only an example ``` ## Global configuration The Go template uses some global configuration used throughout all jobs. -| Name | Description | Default value | +| Input / Variable | Description | Default value | |------------------|------------------------------------------------------------------------------------------------------------|-----------------| -| `GO_IMAGE` | The Docker image used to run Go for `go-build` <br/>:warning: **set the version required by your project** | `registry.hub.docker.com/library/golang:buster` | -| `GO_TEST_IMAGE` | The Docker image used to run Go for `go-test` <br/>:warning: **set the version required by your project** | _none_ | -| `GO_PROJECT_DIR` | Go project root directory | `.` | -| `GOPROXY` | URL of Go module proxy | _none_ | +| `image` / `GO_IMAGE` | The Docker image used to run Go for `go-build` <br/>:warning: **set the version required by your project** | `registry.hub.docker.com/library/golang:bookworm` | +| `test-image` / `GO_TEST_IMAGE` | The Docker image used to run Go for `go-test` <br/>:warning: **set the version required by your project** | _none_ | +| `project-dir` / `GO_PROJECT_DIR` | Go project root directory | `.` | +| `goproxy` / `GOPROXY` | URL of Go module proxy | _none_ | ## Jobs @@ -68,18 +91,18 @@ go-build: These jobs use the following variable: -| Name | Description | Default value | +| Input / Variable | Description | Default value | |-------------------------|-------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------| -| `GO_BUILD_MODE` | The template build mode (accepted values are `application`, `modules` and `auto`) | `auto` | -| `GO_BUILD_FLAGS` | Flags used by the [go build command](https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependencies) | `-mod=readonly` | -| `GO_BUILD_LINKER_FLAGS` | Linker flags used by the [go build command](https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependencies) `-ldflags` | `-s -w` | -| `GO_BUILD_PACKAGES` | Packages to build with the [go build command](https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependencies) | `./...` | -| `GO_TEST_FLAGS` | Flags used by the [go test command](https://pkg.go.dev/cmd/go#hdr-Test_packages) | `-mod=readonly -v -race` | -| `GO_TEST_PACKAGES` | Packages to test with the [go test command](https://pkg.go.dev/cmd/go#hdr-Test_packages) | `./...` | -| `GO_LIST_ARGS` | Arguments used by the list command | `list -u -m -mod=readonly -json all` | -| `GO_TARGET_OS` | The `GOOS` target [see available values](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63) | _none_ (fallback to go docker image `GOOS`) | -| `GO_TARGET_ARCH` | The `GOARCH` target [see available values](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63) | _none_ (fallback to go docker image `GOARCH`) | -| `GO_COBERTURA_FLAGS` | The `GOFLAGS` to use with `gocover-cobertura` if needed | _none_ | +| `build-mode` / `GO_BUILD_MODE` | The template build mode (accepted values are `application`, `modules` and `auto`) | `auto` | +| `build-flags` / `GO_BUILD_FLAGS` | Flags used by the [go build command](https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependencies) | `-mod=readonly` | +| `build-linker-flags` / `GO_BUILD_LINKER_FLAGS` | Linker flags used by the [go build command](https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependencies) `-ldflags` | `-s -w` | +| `build-packages` / `GO_BUILD_PACKAGES` | Packages to build with the [go build command](https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependencies) | `./...` | +| `test-flags` / `GO_TEST_FLAGS` | Flags used by the [go test command](https://pkg.go.dev/cmd/go#hdr-Test_packages) | `-mod=readonly -v -race` | +| `test-packages` / `GO_TEST_PACKAGES` | Packages to test with the [go test command](https://pkg.go.dev/cmd/go#hdr-Test_packages) | `./...` | +| `list-args` / `GO_LIST_ARGS` | Arguments used by the list command | `list -u -m -mod=readonly -json all` | +| `target-os` / `GO_TARGET_OS` | The `GOOS` target [see available values](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63) | _none_ (fallback to go docker image `GOOS`) | +| `target-arch` / `GO_TARGET_ARCH` | The `GOARCH` target [see available values](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63) | _none_ (fallback to go docker image `GOARCH`) | +| `cobertura-flags` / `GO_COBERTURA_FLAGS` | The `GOFLAGS` to use with `gocover-cobertura` if needed | _none_ | In addition to a textual report in the console, the test jobs produce the following reports, kept for one day: @@ -97,11 +120,11 @@ This job enables a manual [GolangCI-Lint](https://github.com/golangci/golangci-l It is bound to the `build` stage, and uses the following variables: -| Name | Description | Default value | +| Input / Variable | Description | Default value | |-----------------------|----------------------------------------------------------------------------------------------------------|----------------------------------------| -| `GO_CI_LINT_IMAGE` | The Docker image used to run `golangci-lint` | `registry.hub.docker.com/golangci/golangci-lint:latest-alpine` | -| `GO_CI_LINT_ARGS` | `golangci-lint` [command line arguments](https://github.com/golangci/golangci-lint#command-line-options) | `-E gosec,goimports ./...` | -| `GO_CI_LINT_DISABLED` | Set to `true` to disable this job | _none_(enabled) | +| `ci-lint-image` / `GO_CI_LINT_IMAGE` | The Docker image used to run `golangci-lint` | `registry.hub.docker.com/golangci/golangci-lint:latest-alpine` | +| `ci-lint-args` / `GO_CI_LINT_ARGS` | `golangci-lint` [command line arguments](https://github.com/golangci/golangci-lint#command-line-options) | `-E gosec,goimports ./...` | +| `ci-lint-disabled` / `GO_CI_LINT_DISABLED` | Set to `true` to disable this job | _none_(enabled) | In addition to a textual report in the console, this job produces the following reports, kept for one day: @@ -116,9 +139,9 @@ This job enables a manual [Go-mod-outdated](https://github.com/psampaz/go-mod-ou It is bound to the `test` stage, and uses the following variables: -| Name | Description | Default value | +| Input / Variable | Description | Default value | |------------------------|-----------------------------------------------------------------------------------------------|-------------------| -| `GO_MOD_OUTDATED_ARGS` | `god-mod-outdated` [command line arguments](https://github.com/psampaz/go-mod-outdated#usage) | `-update -direct` | +| `mod-outdated-args` / `GO_MOD_OUTDATED_ARGS` | `god-mod-outdated` [command line arguments](https://github.com/psampaz/go-mod-outdated#usage) | `-update -direct` | Checking outdated modules can be a long operation and therefore the job is configured to be ran **manually** by default (overridable). @@ -161,11 +184,11 @@ This job generates a [SBOM](https://cyclonedx.org/) file listing installed packa It is bound to the `test` stage, and uses the following variables: -| Name | Description | Default value | +| Input / Variable | Description | Default value | | --------------------- | -------------------------------------- | ----------------- | -| `GO_SBOM_DISABLED` | Set to `true` to disable this job | _none_ | -| `GO_SBOM_IMAGE` | Image of cyclonedx-gomod used for SBOM analysis | `registry.hub.docker.com/cyclonedx/cyclonedx-gomod:latest` | -| `GO_SBOM_OPTS` | [@cyclonedx/cyclonedx-gomod options](https://github.com/CycloneDX/cyclonedx-gomod#usage) used for SBOM analysis | `-main .` | +| `sbom-disabled` / `GO_SBOM_DISABLED` | Set to `true` to disable this job | _none_ | +| `sbom-image` / `GO_SBOM_IMAGE` | Image of cyclonedx-gomod used for SBOM analysis | `registry.hub.docker.com/cyclonedx/cyclonedx-gomod:latest` | +| `sbom-opts` / `GO_SBOM_OPTS` | [@cyclonedx/cyclonedx-gomod options](https://github.com/CycloneDX/cyclonedx-gomod#usage) used for SBOM analysis | `-main .` | :warning: if you don't have your main class located at the root of your `GO_PROJECT_DIR`, then you will need to override the `-main` option in `GO_SBOM_OPTS` and define your real main class location. @@ -182,7 +205,7 @@ This job enables Vulnerability Management with [Govulncheck](https://go.dev/blog It is bound to the `test` stage, and uses the following variables: -| Name | Description | Default value | +| Input / Variable | Description | Default value | | --------------------- | -------------------------------------- | ----------------- | -| `GO_VULNCHECK_DISABLED` | Set to `true` to disable this job | _none_ -| `GO_VULNCHECK_ARGS` | `govulncheck` [command line arguments](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck#hdr-Flags) | `./...` | \ No newline at end of file +| `vulncheck-disabled` / `GO_VULNCHECK_DISABLED` | Set to `true` to disable this job | _none_ +| `vulncheck-args` / `GO_VULNCHECK_ARGS` | `govulncheck` [command line arguments](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck#hdr-Flags) | `./...` | \ No newline at end of file diff --git a/bumpversion.sh b/bumpversion.sh index f06829a406ca8da98e570e8ad7d8bb22367b668d..ed44d7b68b0e09f6d2cf557f7a15e52553246341 100755 --- a/bumpversion.sh +++ b/bumpversion.sh @@ -27,13 +27,13 @@ if [[ "$curVer" ]]; then log_info "Bump version from \\e[33;1m${curVer}\\e[0m to \\e[33;1m${nextVer}\\e[0m (release type: $relType)..." # replace in README - sed -e "s/ref: '$curVer'/ref: '$nextVer'/" README.md > README.md.next + sed -e "s/ref: *'$curVer'/ref: '$nextVer'/" -e "s/ref: *\"$curVer\”/ref: \”$nextVer\”/" -e "s/component: *\(.*\)@$curVer/component: \1@$nextVer/" README.md > README.md.next mv -f README.md.next README.md # replace in template and variants for tmpl in templates/*.yml do - sed -e "s/\"$curVer\"/\"$nextVer\"/" "$tmpl" > "$tmpl.next" + sed -e "s/command: *\[\"--service\", \"\(.*\)\", \"$curVer\"\]/command: [\"--service\", \"\1\", \"$nextVer\"]/" "$tmpl" > "$tmpl.next" mv -f "$tmpl.next" "$tmpl" done else diff --git a/kicker.json b/kicker.json index b5faad7fd4191317631b7e7ac6a547d1d0fcdc58..9c7f91223a954481cd1f3a491af20864dd197fdc 100644 --- a/kicker.json +++ b/kicker.json @@ -3,11 +3,13 @@ "description": "Build, test and analyse your [Go](https://golang.org/) projects", "template_path": "templates/gitlab-ci-golang.yml", "kind": "build", + "prefix": "go", + "is_component": true, "variables": [ { "name": "GO_IMAGE", "description": "The Docker image used to run Go (build+test or build only) - **set the version required by your project**", - "default": "registry.hub.docker.com/library/golang:buster" + "default": "registry.hub.docker.com/library/golang:bookworm" }, { "name": "GO_PROJECT_DIR", diff --git a/logo.png b/logo.png index 17ae6fffd14eebeb1eaaa89a4047fac7bb06be46..795421951799ca4ce1c200aefe6bce2e80080195 100644 Binary files a/logo.png and b/logo.png differ diff --git a/templates/gitlab-ci-golang.yml b/templates/gitlab-ci-golang.yml index 2abcda5640b8bb6d8e2ff73ae16da7e25fb01729..f7a0c9aa263398a0e11ca3c600f0221dc6c6240f 100644 --- a/templates/gitlab-ci-golang.yml +++ b/templates/gitlab-ci-golang.yml @@ -14,6 +14,90 @@ # Floor, Boston, MA 02110-1301, USA. # ========================================================================================= # default workflow rules: Merge Request pipelines +spec: + inputs: + image: + description: The Docker image used to run Go (build+test or build only) - **set the version required by your project** + default: registry.hub.docker.com/library/golang:bookworm + project-dir: + description: Go project root directory + default: . + goproxy: + description: URL of Go module proxy (see [Go env](https://golang.org/cmd/go/#hdr-Environment_variables)) + default: '' + test-image: + description: Specific Docker image used to run Go tests (as a separate job) + default: '' + build-flags: + description: Flags used by the [go build command](https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependencies) + default: -mod=readonly + build-mode: + description: The template build mode (accepted values are `application`, `modules` and `auto`) + options: + - auto + - application + - modules + default: auto + build-linker-flags: + description: Linker flags used by the [go build command](https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependencies) `-ldflags` + default: -s -w + build-packages: + description: Packages to build with the [go build command](https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependencies) + default: ./... + target-os: + description: |- + The `$GOOS` target [see available values](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63) + + Fallbacks to default `$GOOS` from the Go Docker image + default: '' + target-arch: + description: |- + The `$GOARCH` target [see available values](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63) + + Fallbacks to default `$GOARCH` from the Go Docker image + default: '' + test-flags: + description: Flags used by the [go test command](https://pkg.go.dev/cmd/go#hdr-Test_packages) + default: -mod=readonly -v -race + test-packages: + description: Packages to test with the [go test command](https://pkg.go.dev/cmd/go#hdr-Test_packages) + default: ./... + list-args: + description: Arguments used by the list command + default: list -u -m -mod=readonly -json all + cobertura-flags: + description: Build flags to add to use gocover-cobertura, leave blank if not needed + default: '' + ci-lint-disabled: + description: Disable GolangCI-Lint + type: boolean + default: false + ci-lint-image: + description: The Docker image used to run `golangci-lint` + default: registry.hub.docker.com/golangci/golangci-lint:latest-alpine + ci-lint-args: + description: '`golangci-lint` [command line arguments](https://github.com/golangci/golangci-lint#command-line-options)' + default: -E gosec,goimports ./... + mod-outdated-args: + description: '`god-mod-outdated` [command line arguments](https://github.com/psampaz/go-mod-outdated#usage' + default: -update -direct + sbom-disabled: + description: Disable Software Bill of Materials + type: boolean + default: false + sbom-image: + default: registry.hub.docker.com/cyclonedx/cyclonedx-gomod:latest + sbom-opts: + description: '[@cyclonedx/cyclonedx-gomod options](https://github.com/CycloneDX/cyclonedx-gomod#usage) used for SBOM analysis' + default: -main . + vulncheck-disabled: + description: Disable Govulncheck + type: boolean + default: false + vulncheck-args: + description: '`govulncheck` [command line arguments](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck#hdr-Flags)' + default: ./... +--- workflow: rules: # prevent branch pipeline when an MR is open (prefer MR pipeline) @@ -56,67 +140,66 @@ workflow: variables: # variabilized tracking image - TBC_TRACKING_IMAGE: "registry.gitlab.com/to-be-continuous/tools/tracking:master" + TBC_TRACKING_IMAGE: registry.gitlab.com/to-be-continuous/tools/tracking:master # Default Go project root directory - GO_PROJECT_DIR: . + GO_PROJECT_DIR: $[[ inputs.project-dir ]] # Default Docker image (can be overridden) - GO_IMAGE: "registry.hub.docker.com/library/golang:bookworm" + GO_IMAGE: $[[ inputs.image ]] # Default flags for 'build' command - GO_BUILD_FLAGS: >- - -mod=readonly + GO_BUILD_FLAGS: $[[ inputs.build-flags ]] # Default flags for go build linker - GO_BUILD_LINKER_FLAGS: "-s -w" + GO_BUILD_LINKER_FLAGS: $[[ inputs.build-linker-flags ]] # Default packages for 'build' command - GO_BUILD_PACKAGES: >- + GO_BUILD_PACKAGES: $[[ inputs.build-packages ]] ./... # Default build mode (application/modules/auto) - GO_BUILD_MODE: auto + GO_BUILD_MODE: $[[ inputs.build-mode ]] # Default flags for 'test' command - GO_TEST_FLAGS: >- - -mod=readonly - -v - -race + GO_TEST_FLAGS: $[[ inputs.test-flags ]] # Default packages for 'test' command - GO_TEST_PACKAGES: >- - ./... + GO_TEST_PACKAGES: $[[ inputs.test-packages ]] # Default arguments for 'list' command - GO_LIST_ARGS : >- - list - -u - -m - -mod=readonly - -json all + GO_LIST_ARGS: $[[ inputs.list-args ]] # Default arguments for go-mod-outdated command - GO_MOD_OUTDATED_ARGS: '-update -direct' + GO_MOD_OUTDATED_ARGS: $[[ inputs.mod-outdated-args ]] - GO_VULNCHECK_ARGS: >- + GO_VULNCHECK_ARGS: $[[ inputs.vulncheck-args ]] ./... # Default golangci-lint Docker image (can be overridden) - GO_CI_LINT_IMAGE: "registry.hub.docker.com/golangci/golangci-lint:latest-alpine" + GO_CI_LINT_IMAGE: $[[ inputs.ci-lint-image ]] # Default arguments for golangci-lint command - GO_CI_LINT_ARGS: '-E gosec,goimports ./...' + GO_CI_LINT_ARGS: $[[ inputs.ci-lint-args ]] + + GOPROXY: $[[ inputs.goproxy ]] + GO_TEST_IMAGE: $[[ inputs.test-image ]] + GO_TARGET_OS: $[[ inputs.target-os ]] + GO_TARGET_ARCH: $[[ inputs.target-arch ]] + GO_COBERTURA_FLAGS: $[[ inputs.cobertura-flags ]] + GO_CI_LINT_DISABLED: $[[ inputs.ci-lint-disabled ]] + GO_SBOM_DISABLED: $[[ inputs.sbom-disabled ]] + GO_VULNCHECK_DISABLED: $[[ inputs.vulncheck-disabled ]] # Image of cyclonedx-gomod used for SBOM analysis - GO_SBOM_IMAGE: "registry.hub.docker.com/cyclonedx/cyclonedx-gomod:latest" + GO_SBOM_IMAGE: $[[ inputs.sbom-image ]] # Options for cyclonedx-gomod used for SBOM analysis - GO_SBOM_OPTS: "-main ." + GO_SBOM_OPTS: $[[ inputs.sbom-opts ]] # default production ref name (pattern) - PROD_REF: '/^(master|main)$/' + PROD_REF: /^(master|main)$/ # default integration ref name (pattern) - INTEG_REF: '/^develop$/' + INTEG_REF: /^develop$/ stages: - build