Skip to content

Commit 6b7d48b

Browse files
douglascamatamowiessongy23
authored
[chore] Split up cmd/goreleaser/internal/configure.go (#1235)
* Split up `cmd/goreleaser/internal/configure.go` Signed-off-by: Douglas Camata <[email protected]> * Fix typo in comment Signed-off-by: Douglas Camata <[email protected]> * Address PR review Keeping the function names consistent by using the `new` prefix Signed-off-by: Douglas Camata <[email protected]> --------- Signed-off-by: Douglas Camata <[email protected]> Co-authored-by: Moritz Wiesinger <[email protected]> Co-authored-by: Yang Song <[email protected]>
1 parent 72f06dc commit 6b7d48b

File tree

14 files changed

+1042
-920
lines changed

14 files changed

+1042
-920
lines changed

cmd/goreleaser/internal/builder.go

Lines changed: 512 additions & 0 deletions
Large diffs are not rendered by default.

cmd/goreleaser/internal/configure.go

Lines changed: 0 additions & 919 deletions
This file was deleted.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package internal
5+
6+
const (
7+
coreDistro = "otelcol"
8+
contribDistro = "otelcol-contrib"
9+
k8sDistro = "otelcol-k8s"
10+
otlpDistro = "otelcol-otlp"
11+
ebpfProfilerDistro = "otelcol-ebpf-profiler"
12+
ocbBinary = "builder"
13+
opampBinary = "opampsupervisor"
14+
15+
binaryNamePrefix = "otelcol"
16+
imageNamePrefix = "opentelemetry-collector"
17+
projectName = "opentelemetry-collector-releases"
18+
defaultBuildDir = "_build"
19+
)
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package internal
5+
6+
import (
7+
"fmt"
8+
"slices"
9+
10+
"github.com/goreleaser/goreleaser-pro/v2/pkg/config"
11+
)
12+
13+
const (
14+
armArchitecture = "arm"
15+
dockerHubRepo = "otel"
16+
ghcrRepo = "ghcr.io/open-telemetry/opentelemetry-collector-releases"
17+
)
18+
19+
var (
20+
imageRepositories = []string{dockerHubRepo, ghcrRepo}
21+
)
22+
23+
// containerImageOptions contains options for container image configuration.
24+
type containerImageOptions struct {
25+
armVersion string
26+
winVersion string
27+
binaryRelease bool
28+
}
29+
30+
func (o *containerImageOptions) version() string {
31+
if o.armVersion != "" {
32+
return o.armVersion
33+
}
34+
return o.winVersion
35+
}
36+
37+
type osArchInfo struct {
38+
os, arch, version string
39+
}
40+
41+
func (o *osArchInfo) buildPlatform() string {
42+
switch o.os {
43+
case "linux":
44+
switch o.arch {
45+
case armArchitecture:
46+
return fmt.Sprintf("linux/arm/v%s", o.version)
47+
}
48+
case "windows":
49+
return fmt.Sprintf("windows/%s", o.arch)
50+
}
51+
return fmt.Sprintf("linux/%s", o.arch)
52+
}
53+
54+
func (o *osArchInfo) imageTag() string {
55+
switch o.os {
56+
case "linux":
57+
switch o.arch {
58+
case armArchitecture:
59+
return fmt.Sprintf("armv%s", o.version)
60+
}
61+
case "windows":
62+
return fmt.Sprintf("windows-%s-%s", o.version, o.arch)
63+
}
64+
return o.arch
65+
}
66+
67+
// newContainerImages creates container image configurations.
68+
func newContainerImages(dist string, targetOS string, targetArchs []string, opts containerImageOptions) []config.Docker {
69+
var images []config.Docker
70+
for _, targetArch := range targetArchs {
71+
images = append(images, buildDockerImageWithOS(dist, targetOS, targetArch, opts))
72+
}
73+
return images
74+
}
75+
76+
// newContainerImageManifests creates container image manifest configurations.
77+
func newContainerImageManifests(dist, os string, archs []string, opts containerImageOptions) []config.DockerManifest {
78+
tags := []string{`{{ .Version }}`, "{{ .Env.CONTAINER_IMAGE_EPHEMERAL_TAG }}"}
79+
if os == "windows" {
80+
for i, tag := range tags {
81+
tags[i] = fmt.Sprintf("%s-%s-%s", tag, os, opts.winVersion)
82+
}
83+
}
84+
85+
var r []config.DockerManifest
86+
for _, imageRepo := range imageRepositories {
87+
for _, tag := range tags {
88+
r = append(r, buildOSDockerManifest(imageRepo, tag, dist, os, archs, opts))
89+
}
90+
}
91+
return r
92+
}
93+
94+
func buildDockerImageWithOS(dist, os, arch string, opts containerImageOptions) config.Docker {
95+
osArch := osArchInfo{os: os, arch: arch, version: opts.version()}
96+
var imageTemplates []string
97+
for _, prefix := range imageRepositories {
98+
imageTemplates = append(
99+
imageTemplates,
100+
fmt.Sprintf("%s/%s:{{ .Version }}-%s", prefix, imageName(dist, opts), osArch.imageTag()),
101+
fmt.Sprintf("%s/%s:{{ .Env.CONTAINER_IMAGE_EPHEMERAL_TAG }}-%s", prefix, imageName(dist, opts), osArch.imageTag()),
102+
)
103+
}
104+
105+
label := func(name, template string) string {
106+
return fmt.Sprintf("--label=org.opencontainers.image.%s={{%s}}", name, template)
107+
}
108+
imageConfig := config.Docker{
109+
ImageTemplates: imageTemplates,
110+
Dockerfile: "Dockerfile",
111+
Use: "buildx",
112+
BuildFlagTemplates: []string{
113+
"--pull",
114+
fmt.Sprintf("--platform=%s", osArch.buildPlatform()),
115+
label("created", ".Date"),
116+
label("name", ".ProjectName"),
117+
label("revision", ".FullCommit"),
118+
label("version", ".Version"),
119+
label("source", ".GitURL"),
120+
"--label=org.opencontainers.image.licenses=Apache-2.0",
121+
},
122+
Goos: os,
123+
Goarch: arch,
124+
}
125+
if arch == armArchitecture {
126+
imageConfig.Goarm = opts.armVersion
127+
}
128+
if os == "windows" {
129+
imageConfig.BuildFlagTemplates = slices.Insert(
130+
imageConfig.BuildFlagTemplates, 1,
131+
fmt.Sprintf("--build-arg=WIN_VERSION=%s", opts.winVersion),
132+
)
133+
imageConfig.Dockerfile = "Windows.dockerfile"
134+
imageConfig.Use = "docker"
135+
imageConfig.SkipBuild = "{{ not (eq .Runtime.Goos \"windows\") }}"
136+
imageConfig.SkipPush = "{{ not (eq .Runtime.Goos \"windows\") }}"
137+
}
138+
return imageConfig
139+
}
140+
141+
func buildOSDockerManifest(prefix, version, dist, os string, archs []string, opts containerImageOptions) config.DockerManifest {
142+
var imageTemplates []string
143+
for _, arch := range archs {
144+
switch arch {
145+
case armArchitecture:
146+
for _, armVers := range armVersions(dist) {
147+
dockerArchTag := (&osArchInfo{os: os, arch: arch, version: armVers}).imageTag()
148+
imageTemplates = append(
149+
imageTemplates,
150+
fmt.Sprintf("%s/%s:%s-%s", prefix, imageName(dist, opts), version, dockerArchTag),
151+
)
152+
}
153+
default:
154+
imageTemplates = append(
155+
imageTemplates,
156+
fmt.Sprintf("%s/%s:%s-%s", prefix, imageName(dist, opts), version, arch),
157+
)
158+
}
159+
}
160+
161+
manifest := config.DockerManifest{
162+
NameTemplate: fmt.Sprintf("%s/%s:%s", prefix, imageName(dist, opts), version),
163+
ImageTemplates: imageTemplates,
164+
}
165+
if os == "windows" {
166+
manifest.SkipPush = "{{ not (eq .Runtime.Goos \"windows\") }}"
167+
}
168+
return manifest
169+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package internal
5+
6+
import (
7+
"slices"
8+
9+
"github.com/goreleaser/goreleaser-pro/v2/pkg/config"
10+
)
11+
12+
var (
13+
// contrib distro
14+
contribDist = newDistributionBuilder(contribDistro).withConfigFunc(func(d *distribution) {
15+
d.BuildConfigs = []buildConfig{
16+
&preBuiltBuildConfig{
17+
TargetOS: "linux",
18+
TargetArch: baseArchs,
19+
PreBuilt: config.PreBuiltOptions{
20+
Path: "artifacts/otelcol-contrib-linux_{{ .Target }}/otelcol-contrib",
21+
},
22+
},
23+
&preBuiltBuildConfig{
24+
TargetOS: "darwin",
25+
TargetArch: darwinArchs,
26+
PreBuilt: config.PreBuiltOptions{
27+
Path: "artifacts/otelcol-contrib-darwin_{{ .Target }}/otelcol-contrib",
28+
},
29+
},
30+
&preBuiltBuildConfig{
31+
TargetOS: "windows",
32+
TargetArch: winArchs,
33+
PreBuilt: config.PreBuiltOptions{
34+
Path: "artifacts/otelcol-contrib-windows_{{ .Target }}/otelcol-contrib.exe",
35+
},
36+
},
37+
}
38+
d.ContainerImages = slices.Concat(
39+
newContainerImages(d.Name, "linux", baseArchs, containerImageOptions{armVersion: "7"}),
40+
newContainerImages(d.Name, "windows", winContainerArchs, containerImageOptions{winVersion: "2019"}),
41+
newContainerImages(d.Name, "windows", winContainerArchs, containerImageOptions{winVersion: "2022"}),
42+
)
43+
d.ContainerImageManifests = slices.Concat(
44+
newContainerImageManifests(d.Name, "linux", baseArchs, containerImageOptions{}),
45+
)
46+
}).withPackagingDefaults().withDefaultConfigIncluded().build()
47+
48+
// contrib build-only project
49+
contribBuildOnlyDist = newDistributionBuilder(contribDistro).withConfigFunc(func(d *distribution) {
50+
d.BuildConfigs = []buildConfig{
51+
&fullBuildConfig{TargetOS: "linux", TargetArch: baseArchs, BuildDir: defaultBuildDir, ArmVersion: []string{"7"}},
52+
&fullBuildConfig{TargetOS: "darwin", TargetArch: darwinArchs, BuildDir: defaultBuildDir},
53+
&fullBuildConfig{TargetOS: "windows", TargetArch: winArchs, BuildDir: defaultBuildDir},
54+
}
55+
}).withBinArchive().
56+
withDefaultMonorepo().
57+
withDefaultEnv().
58+
withDefaultPartial().
59+
withDefaultRelease().
60+
withNightlyConfig().
61+
build()
62+
)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package internal
5+
6+
import "slices"
7+
8+
var (
9+
ebpfProfilerArchs = []string{"amd64", "arm64"}
10+
)
11+
12+
var (
13+
// ebpf-profiler distro
14+
ebpfProfilerDist = newDistributionBuilder(ebpfProfilerDistro).withConfigFunc(func(d *distribution) {
15+
d.BuildConfigs = []buildConfig{
16+
&fullBuildConfig{TargetOS: "linux", TargetArch: ebpfProfilerArchs, BuildDir: defaultBuildDir},
17+
}
18+
d.ContainerImages = slices.Concat(
19+
newContainerImages(d.Name, "linux", ebpfProfilerArchs, containerImageOptions{}),
20+
)
21+
d.ContainerImageManifests = slices.Concat(
22+
newContainerImageManifests(d.Name, "linux", ebpfProfilerArchs, containerImageOptions{}),
23+
)
24+
d.Env = append(d.Env, "TARGET_ARCH={{ .Runtime.Goarch }}")
25+
d.LdFlags = "-extldflags=-static"
26+
d.GoTags = "osusergo,netgo"
27+
}).withDefaultArchives().
28+
withDefaultChecksum().
29+
withDefaultSigns().
30+
withDefaultDockerSigns().
31+
withDefaultSBOMs().
32+
withDefaultMonorepo().
33+
withDefaultEnv().
34+
withDefaultPartial().
35+
withDefaultRelease().
36+
withNightlyConfig().
37+
withDefaultSnapshot().
38+
build()
39+
)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package internal
5+
6+
import "slices"
7+
8+
var (
9+
// k8s distro
10+
k8sDist = newDistributionBuilder(k8sDistro).withConfigFunc(func(d *distribution) {
11+
d.BuildConfigs = []buildConfig{
12+
&fullBuildConfig{TargetOS: "linux", TargetArch: k8sArchs, BuildDir: defaultBuildDir, Ppc64Version: []string{"power8"}},
13+
&fullBuildConfig{TargetOS: "windows", TargetArch: winContainerArchs, BuildDir: defaultBuildDir},
14+
}
15+
d.ContainerImages = slices.Concat(
16+
newContainerImages(d.Name, "linux", k8sArchs, containerImageOptions{armVersion: "7"}),
17+
newContainerImages(d.Name, "windows", winContainerArchs, containerImageOptions{winVersion: "2019"}),
18+
newContainerImages(d.Name, "windows", winContainerArchs, containerImageOptions{winVersion: "2022"}),
19+
)
20+
d.ContainerImageManifests = slices.Concat(
21+
newContainerImageManifests(d.Name, "linux", k8sArchs, containerImageOptions{}),
22+
)
23+
}).withDefaultArchives().
24+
withDefaultChecksum().
25+
withDefaultSigns().
26+
withDefaultDockerSigns().
27+
withDefaultSBOMs().
28+
withDefaultMonorepo().
29+
withDefaultEnv().
30+
withDefaultPartial().
31+
withDefaultRelease().
32+
withNightlyConfig().
33+
withDefaultSnapshot().
34+
build()
35+
)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package internal
5+
6+
import "slices"
7+
8+
const (
9+
ocbReleaseHeader = "### Images and binaries for collector distributions here: https://github.com/open-telemetry/opentelemetry-collector-releases/releases/tag/{{ .Tag }}"
10+
)
11+
12+
var (
13+
// OCB binary
14+
ocbDist = newDistributionBuilder(ocbBinary).withConfigFunc(func(d *distribution) {
15+
d.BuildConfigs = []buildConfig{
16+
&fullBuildConfig{TargetOS: "linux", TargetArch: ocbArchs, BinaryName: "ocb"},
17+
&fullBuildConfig{TargetOS: "darwin", TargetArch: darwinArchs, BinaryName: "ocb"},
18+
&fullBuildConfig{TargetOS: "windows", TargetArch: []string{"amd64"}, BinaryName: "ocb"},
19+
}
20+
d.ContainerImages = slices.Concat(
21+
newContainerImages(d.Name, "linux", ocbArchs, containerImageOptions{binaryRelease: true}),
22+
)
23+
d.ContainerImageManifests = slices.Concat(
24+
newContainerImageManifests(d.Name, "linux", ocbArchs, containerImageOptions{binaryRelease: true}),
25+
)
26+
d.LdFlags = "-s -w -X go.opentelemetry.io/collector/cmd/builder/internal.version={{ .Version }}"
27+
}).withBinaryPackagingDefaults().
28+
withBinaryMonorepo(".core/cmd/builder").
29+
withDefaultBinaryRelease(ocbReleaseHeader).
30+
withNightlyConfig().
31+
build()
32+
)

0 commit comments

Comments
 (0)