Skip to content

Commit b1d48e3

Browse files
authored
πŸ€– ci: unify :main and release image builds via goreleaser (#87)
## Summary Unify container publishing so `:main` and release images are both built by GoReleaser, and enable multi-arch (`linux/amd64` + `linux/arm64`) Docker output. ## Background Previously, the CI `publish-main` job manually built an amd64 binary and used `docker/build-push-action`, while release images were built via GoReleaser. This duplicated image logic and left `:main` single-arch. ## Implementation - Updated `.goreleaser.yaml`: - Added `release.disable` gate for main-channel runs (`GORELEASER_CHANNEL=main`) so CI can use `goreleaser release` without creating a GitHub release. - Made Docker tags channel-aware: - main-channel: `main` - release-channel: `{{ .Version }}` and `latest` - Enabled Docker platforms: - `linux/amd64` - `linux/arm64` - Made OCI version label channel-aware. - Updated `.github/workflows/ci.yaml` `publish-main` job: - Added `fetch-depth: 0` for git metadata availability. - Replaced manual build + docker push steps with `goreleaser/goreleaser-action`. - Added env for main-channel execution: - `GORELEASER_CURRENT_TAG=v0.0.0-main` - `GORELEASER_CHANNEL=main` - Included `.goreleaser.yaml` in publish path filtering. ## Validation - `make verify-vendor` - `make test` - `make build` - `make lint` - `go run github.com/rhysd/actionlint/cmd/actionlint@v1.7.10` - `go run github.com/goreleaser/goreleaser/v2@v2.13.1 check` - `GORELEASER_CHANNEL=main go run github.com/goreleaser/goreleaser/v2@v2.13.1 check` - `GORELEASER_CHANNEL=main GORELEASER_CURRENT_TAG=v0.0.0-main go run github.com/goreleaser/goreleaser/v2@v2.13.1 release --clean --skip=announce,publish,docker,validate` ## Risks - Main-channel GoReleaser execution depends on the synthetic tag env (`GORELEASER_CURRENT_TAG`). If altered/removed, the main publish job may fail on untagged commits. - Multi-arch image publishing now depends on Buildx/QEMU behavior through GoReleaser integration in CI. --- _Generated with `mux` β€’ Model: `openai:gpt-5.3-codex` β€’ Thinking: `xhigh` β€’ Cost: `$0.61`_ <!-- mux-attribution: model=openai:gpt-5.3-codex thinking=xhigh costs=0.61 -->
1 parent e0a1163 commit b1d48e3

44 files changed

Lines changed: 16738 additions & 156 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

β€Ž.github/workflows/ci.yamlβ€Ž

Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ jobs:
6868
- 'go.mod'
6969
- 'go.sum'
7070
- 'vendor/**'
71+
- '.goreleaser.yaml'
7172
- 'Dockerfile*'
7273
- 'Dockerfile.goreleaser'
7374
terraform:
@@ -477,6 +478,7 @@ jobs:
477478
- name: Checkout
478479
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
479480
with:
481+
fetch-depth: 0
480482
persist-credentials: false
481483

482484
- name: Setup Go
@@ -485,16 +487,6 @@ jobs:
485487
go-version-file: go.mod
486488
cache: false
487489

488-
- name: Build linux/amd64 binary for image
489-
env:
490-
GOFLAGS: -mod=vendor
491-
CGO_ENABLED: "0"
492-
GOOS: linux
493-
GOARCH: amd64
494-
run: |
495-
mkdir -p linux/amd64
496-
go build -o linux/amd64/coder-k8s ./
497-
498490
- name: Set up Docker Buildx
499491
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
500492

@@ -505,29 +497,16 @@ jobs:
505497
username: ${{ github.actor }}
506498
password: ${{ secrets.GITHUB_TOKEN }}
507499

508-
- name: Compute OCI label values
509-
id: oci
510-
run: echo "created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT"
511-
512-
- name: Build and push :main
513-
uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0
500+
- name: Run GoReleaser (:main)
501+
uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6.4.0
514502
with:
515-
context: .
516-
file: Dockerfile.goreleaser
517-
push: true
518-
tags: ghcr.io/coder/coder-k8s:main
519-
labels: |
520-
org.opencontainers.image.created=${{ steps.oci.outputs.created }}
521-
org.opencontainers.image.source=https://github.com/coder/coder-k8s
522-
org.opencontainers.image.url=https://coder.github.io/coder-k8s/
523-
org.opencontainers.image.documentation=https://coder.github.io/coder-k8s/
524-
org.opencontainers.image.title=coder-k8s
525-
org.opencontainers.image.description=Kubernetes operator for Coder
526-
org.opencontainers.image.version=main
527-
org.opencontainers.image.revision=${{ github.sha }}
528-
org.opencontainers.image.vendor=Coder
529-
org.opencontainers.image.licenses=Apache-2.0
530-
org.opencontainers.image.authors=Coder
503+
distribution: goreleaser
504+
version: "~> v2"
505+
args: release --clean --skip=announce
506+
env:
507+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
508+
GORELEASER_CURRENT_TAG: v0.0.0-main
509+
GORELEASER_CHANNEL: main
531510

532511
- name: Trivy image scan (:main)
533512
uses: aquasecurity/trivy-action@b6643a29fecd7f34b3597bc6acb0a98b03d33ff8 # v0.33.1

β€Ž.goreleaser.yamlβ€Ž

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,41 @@ archives:
2626
- LICENSE
2727
- README.md
2828

29+
release:
30+
disable: '{{ eq .Env.GORELEASER_CHANNEL "main" }}'
31+
2932
dockers_v2:
30-
- id: coder-k8s-image
33+
- id: coder-k8s-image-main
34+
disable: '{{ ne .Env.GORELEASER_CHANNEL "main" }}'
35+
dockerfile: Dockerfile.goreleaser
36+
ids:
37+
- coder-k8s
38+
images:
39+
- ghcr.io/coder/coder-k8s
40+
tags:
41+
- main
42+
platforms:
43+
- linux/amd64
44+
- linux/arm64
45+
sbom: true
46+
labels:
47+
org.opencontainers.image.created: "{{ .Date }}"
48+
org.opencontainers.image.source: https://github.com/coder/coder-k8s
49+
org.opencontainers.image.url: https://coder.github.io/coder-k8s/
50+
org.opencontainers.image.documentation: https://coder.github.io/coder-k8s/
51+
org.opencontainers.image.title: coder-k8s
52+
org.opencontainers.image.description: Kubernetes operator for Coder
53+
org.opencontainers.image.version: main
54+
org.opencontainers.image.revision: "{{ .FullCommit }}"
55+
org.opencontainers.image.vendor: Coder
56+
org.opencontainers.image.licenses: Apache-2.0
57+
org.opencontainers.image.authors: Coder
58+
flags:
59+
- "--pull=true"
60+
- "--provenance=false"
61+
62+
- id: coder-k8s-image-release
63+
disable: '{{ eq .Env.GORELEASER_CHANNEL "main" }}'
3164
dockerfile: Dockerfile.goreleaser
3265
ids:
3366
- coder-k8s
@@ -38,6 +71,7 @@ dockers_v2:
3871
- latest
3972
platforms:
4073
- linux/amd64
74+
- linux/arm64
4175
sbom: true
4276
labels:
4377
org.opencontainers.image.created: "{{ .Date }}"

β€Žgo.modβ€Ž

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -357,12 +357,12 @@ require (
357357
go.opentelemetry.io/collector/semconv v0.123.0 // indirect
358358
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect
359359
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect
360-
go.opentelemetry.io/otel v1.39.0 // indirect
360+
go.opentelemetry.io/otel v1.40.0 // indirect
361361
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
362362
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect
363-
go.opentelemetry.io/otel/metric v1.39.0 // indirect
364-
go.opentelemetry.io/otel/sdk v1.39.0 // indirect
365-
go.opentelemetry.io/otel/trace v1.39.0 // indirect
363+
go.opentelemetry.io/otel/metric v1.40.0 // indirect
364+
go.opentelemetry.io/otel/sdk v1.40.0 // indirect
365+
go.opentelemetry.io/otel/trace v1.40.0 // indirect
366366
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
367367
go.uber.org/atomic v1.11.0 // indirect
368368
go.uber.org/automaxprocs v1.6.0 // indirect

β€Žgo.sumβ€Ž

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -907,8 +907,8 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6
907907
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ=
908908
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=
909909
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=
910-
go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=
911-
go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8=
910+
go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms=
911+
go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g=
912912
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
913913
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
914914
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
@@ -917,14 +917,14 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0 h1:6VjV6Et+1Hd2iL
917917
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0/go.mod h1:u8hcp8ji5gaM/RfcOo8z9NMnf1pVLfVY7lBY2VOGuUU=
918918
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 h1:SNhVp/9q4Go/XHBkQ1/d5u9P/U+L1yaGPoi0x+mStaI=
919919
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0/go.mod h1:tx8OOlGH6R4kLV67YaYO44GFXloEjGPZuMjEkaaqIp4=
920-
go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=
921-
go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=
922-
go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
923-
go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
924-
go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
925-
go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
926-
go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI=
927-
go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA=
920+
go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g=
921+
go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc=
922+
go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8=
923+
go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE=
924+
go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw=
925+
go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg=
926+
go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw=
927+
go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA=
928928
go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
929929
go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
930930
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=

β€Žvendor/go.opentelemetry.io/otel/.golangci.ymlβ€Ž

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žvendor/go.opentelemetry.io/otel/CHANGELOG.mdβ€Ž

Lines changed: 39 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žvendor/go.opentelemetry.io/otel/CONTRIBUTING.mdβ€Ž

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žvendor/go.opentelemetry.io/otel/attribute/internal/attribute.goβ€Ž

Lines changed: 4 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žvendor/go.opentelemetry.io/otel/attribute/set.goβ€Ž

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žvendor/go.opentelemetry.io/otel/attribute/value.goβ€Ž

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
Β (0)