Skip to content

Commit 52278b7

Browse files
authored
chore(ci): build and tag all image architectures (#1160)
* chore(ci): build multi-arch images * build multi-arch images * f * f * f
1 parent 8ab69ee commit 52278b7

File tree

26 files changed

+314
-278
lines changed

26 files changed

+314
-278
lines changed

.github/workflows/image-deps-updater.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ jobs:
8080
INPUT_VELERO_AWS_PLUGIN_VERSION: ${{ github.event.inputs.velero_aws_plugin_version }}
8181
INPUT_KUBECTL_VERSION: ${{ github.event.inputs.kubectl_version }}
8282
INPUT_SEAWEEDFS_VERSION: ${{ github.event.inputs.seaweedfs_version }}
83+
ARCHS: "amd64,arm64"
8384
run: |
8485
chmod +x ./output/bin/buildtools
8586
./output/bin/buildtools update images ${{ matrix.addon }}

.github/workflows/update-addons.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ jobs:
6969
INPUT_OPENEBS_CHART_VERSION: ${{ github.event.inputs.openebs_chart_version }}
7070
INPUT_VELERO_CHART_VERSION: ${{ github.event.inputs.velero_chart_version }}
7171
INPUT_SEAWEEDFS_CHART_VERSION: ${{ github.event.inputs.seaweedfs_chart_version }}
72+
ARCHS: "amd64,arm64"
7273
run: |
7374
chmod 755 ./output/bin/buildtools
7475
./output/bin/buildtools update addon ${{ matrix.addon }}

cmd/buildtools/addon.go

Lines changed: 62 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,37 @@ type addonComponentOptions struct {
2626
latestK8sVersion *semver.Version
2727
}
2828

29-
func (c *addonComponent) resolveImageRepoAndTag(ctx context.Context, image string) (string, string, error) {
29+
func (c *addonComponent) buildImage(ctx context.Context, image string, archs string) (string, error) {
30+
if c.useUpstreamImage || c.getCustomImageName != nil {
31+
return "", nil
32+
}
33+
builtImage, err := c.buildApkoImage(ctx, image, archs)
34+
if err != nil {
35+
return "", fmt.Errorf("build apko image: %w", err)
36+
}
37+
return builtImage, nil
38+
}
39+
40+
func (c *addonComponent) resolveImageRepoAndTag(ctx context.Context, image string, arch string) (repo string, tag string, err error) {
3041
if c.useUpstreamImage {
31-
return c.resolveUpstreamImageRepoAndTag(ctx, image)
42+
repo, tag, err = c.resolveUpstreamImageRepoAndTag(ctx, image, arch)
43+
if err != nil {
44+
err = fmt.Errorf("resolve upstream image repo and tag: %w", err)
45+
}
46+
return
3247
}
3348
if c.getCustomImageName != nil {
34-
return c.resolveCustomImageRepoAndTag(ctx, c.getUpstreamVersion(image))
49+
repo, tag, err = c.resolveCustomImageRepoAndTag(ctx, image, arch)
50+
if err != nil {
51+
err = fmt.Errorf("resolve custom image repo and tag: %w", err)
52+
}
53+
return
3554
}
36-
return c.resolveApkoImageRepoAndTag(ctx, c.getUpstreamVersion(image))
55+
repo, tag, err = c.resolveApkoImageRepoAndTag(ctx, image, arch)
56+
if err != nil {
57+
err = fmt.Errorf("resolve apko image repo and tag: %w", err)
58+
}
59+
return
3760
}
3861

3962
func (c *addonComponent) getUpstreamVersion(image string) string {
@@ -46,17 +69,19 @@ func (c *addonComponent) getUpstreamVersion(image string) string {
4669
return TagFromImage(image)
4770
}
4871

49-
func (c *addonComponent) resolveUpstreamImageRepoAndTag(ctx context.Context, image string) (string, string, error) {
50-
digest, err := GetImageDigest(ctx, image)
72+
func (c *addonComponent) resolveUpstreamImageRepoAndTag(ctx context.Context, image string, arch string) (string, string, error) {
73+
digest, err := GetImageDigest(ctx, image, arch)
5174
if err != nil {
5275
return "", "", fmt.Errorf("failed to get image %s digest: %w", image, err)
5376
}
54-
tag := fmt.Sprintf("%s@%s", TagFromImage(image), digest)
77+
tag := fmt.Sprintf("%s-%s@%s", TagFromImage(image), arch, digest)
5578
repo := fmt.Sprintf("proxy.replicated.com/anonymous/%s", FamiliarImageName(RemoveTagFromImage(image)))
5679
return repo, tag, nil
5780
}
5881

59-
func (c *addonComponent) resolveCustomImageRepoAndTag(ctx context.Context, upstreamVersion string) (string, string, error) {
82+
func (c *addonComponent) resolveCustomImageRepoAndTag(ctx context.Context, image string, arch string) (string, string, error) {
83+
upstreamVersion := c.getUpstreamVersion(image)
84+
6085
k0sVersion, err := getK0sVersion()
6186
if err != nil {
6287
return "", "", fmt.Errorf("get k0s version: %w", err)
@@ -74,38 +99,53 @@ func (c *addonComponent) resolveCustomImageRepoAndTag(ctx context.Context, upstr
7499
if err != nil {
75100
return "", "", fmt.Errorf("failed to get image name for %s: %w", c.name, err)
76101
}
77-
digest, err := GetImageDigest(ctx, customImage)
102+
digest, err := GetImageDigest(ctx, customImage, arch)
78103
if err != nil {
79104
return "", "", fmt.Errorf("failed to get image %s digest: %w", customImage, err)
80105
}
81-
tag := fmt.Sprintf("%s@%s", TagFromImage(customImage), digest)
106+
tag := fmt.Sprintf("%s-%s@%s", TagFromImage(customImage), arch, digest)
82107
repo := fmt.Sprintf("proxy.replicated.com/anonymous/%s", FamiliarImageName(RemoveTagFromImage(customImage)))
83108
return repo, tag, nil
84109
}
85110

86-
func (c *addonComponent) resolveApkoImageRepoAndTag(ctx context.Context, upstreamVersion string) (string, string, error) {
111+
func (c *addonComponent) resolveApkoImageRepoAndTag(ctx context.Context, image string, arch string) (string, string, error) {
112+
builtImage, err := GetImageNameFromBuildFile("build/image")
113+
if err != nil {
114+
return "", "", fmt.Errorf("failed to get digest from build file: %w", err)
115+
}
116+
117+
digest, err := GetImageDigest(ctx, builtImage, arch)
118+
if err != nil {
119+
return "", "", fmt.Errorf("failed to get image %s digest: %w", builtImage, err)
120+
}
121+
tag := fmt.Sprintf("%s-%s@%s", TagFromImage(builtImage), arch, digest)
122+
repo := fmt.Sprintf("proxy.replicated.com/anonymous/%s", FamiliarImageName(RemoveTagFromImage(builtImage)))
123+
return repo, tag, nil
124+
}
125+
126+
func (c *addonComponent) buildApkoImage(ctx context.Context, image string, archs string) (string, error) {
127+
upstreamVersion := c.getUpstreamVersion(image)
128+
87129
packageName, packageVersion, err := c.getPackageNameAndVersion(ctx, upstreamVersion)
88130
if err != nil {
89-
return "", "", fmt.Errorf("failed to get package name and version constraint for %s: %w", c.name, err)
131+
return "", fmt.Errorf("get package name and version constraint for %s: %w", c.name, err)
90132
}
91133

92134
logrus.Infof("building and publishing %s", c.name)
93135

94-
if err := ApkoBuildAndPublish(c.name, packageName, packageVersion); err != nil {
95-
return "", "", fmt.Errorf("failed to apko build and publish for %s: %w", c.name, err)
136+
if err := ApkoLogin(); err != nil {
137+
return "", fmt.Errorf("apko login: %w", err)
96138
}
97139

98-
builtImage, err := GetImageNameFromBuildFile("build/image")
99-
if err != nil {
100-
return "", "", fmt.Errorf("failed to get digest from build file: %w", err)
140+
if err := ApkoBuildAndPublish(c.name, packageName, packageVersion, archs); err != nil {
141+
return "", fmt.Errorf("apko build and publish for %s: %w", c.name, err)
101142
}
102143

103-
parts := strings.SplitN(builtImage, ":", 2)
104-
if len(parts) != 2 {
105-
return "", "", fmt.Errorf("invalid image name: %s", builtImage)
144+
builtImage, err := GetImageNameFromBuildFile("build/image")
145+
if err != nil {
146+
return "", fmt.Errorf("get image name from build file: %w", err)
106147
}
107-
108-
return fmt.Sprintf("proxy.replicated.com/anonymous/%s", FamiliarImageName(parts[0])), parts[1], nil
148+
return builtImage, nil
109149
}
110150

111151
func (c *addonComponent) getPackageNameAndVersion(ctx context.Context, upstreamVersion string) (string, string, error) {

cmd/buildtools/adminconsole.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package main
22

33
import (
44
"fmt"
5-
"runtime"
65
"strings"
76

87
"github.com/replicatedhq/embedded-cluster/pkg/addons/adminconsole"
@@ -70,20 +69,11 @@ var updateAdminConsoleAddonCommand = &cli.Command{
7069
return fmt.Errorf("failed to get images from admin console chart: %w", err)
7170
}
7271

73-
for _, image := range images {
74-
component, ok := adminconsoleImageComponents[RemoveTagFromImage(image)]
75-
if !ok {
76-
return fmt.Errorf("no component found for image %s", image)
77-
}
78-
repo, tag, err := component.resolveImageRepoAndTag(c.Context, image)
79-
if err != nil {
80-
return fmt.Errorf("failed to resolve image and tag for %s: %w", image, err)
81-
}
82-
newimage := adminconsole.Metadata.Images[component.name]
83-
newimage.Repo = repo
84-
newimage.Tag[runtime.GOARCH] = tag
85-
newmeta.Images[component.name] = newimage
72+
metaImages, err := UpdateImages(c.Context, adminconsoleImageComponents, adminconsole.Metadata.Images, images)
73+
if err != nil {
74+
return fmt.Errorf("failed to update images: %w", err)
8675
}
76+
newmeta.Images = metaImages
8777

8878
logrus.Infof("saving addon manifest")
8979
if err := newmeta.Save("adminconsole"); err != nil {

cmd/buildtools/embeddedclusteroperator.go

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"os"
77
"os/exec"
8-
"runtime"
98
"strings"
109

1110
"github.com/replicatedhq/embedded-cluster/pkg/addons/embeddedclusteroperator"
@@ -123,24 +122,11 @@ func updateOperatorAddonImages(ctx context.Context, chartURL string, chartVersio
123122
// chart.
124123
images = append(images, "docker.io/library/busybox:latest")
125124

126-
if err := ApkoLogin(); err != nil {
127-
return fmt.Errorf("failed to apko login: %w", err)
128-
}
129-
130-
for _, image := range images {
131-
component, ok := operatorImageComponents[RemoveTagFromImage(image)]
132-
if !ok {
133-
return fmt.Errorf("no component found for image %s", image)
134-
}
135-
repo, tag, err := component.resolveImageRepoAndTag(ctx, image)
136-
if err != nil {
137-
return fmt.Errorf("failed to resolve image and tag for %s: %w", image, err)
138-
}
139-
newimage := embeddedclusteroperator.Metadata.Images[component.name]
140-
newimage.Repo = repo
141-
newimage.Tag[runtime.GOARCH] = tag
142-
newmeta.Images[component.name] = newimage
125+
metaImages, err := UpdateImages(ctx, operatorImageComponents, embeddedclusteroperator.Metadata.Images, images)
126+
if err != nil {
127+
return fmt.Errorf("failed to update images: %w", err)
143128
}
129+
newmeta.Images = metaImages
144130

145131
logrus.Infof("saving addon manifest")
146132
if err := newmeta.Save("embeddedclusteroperator"); err != nil {

cmd/buildtools/k0s.go

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package main
33
import (
44
"fmt"
55
"os"
6-
"runtime"
76

87
"github.com/Masterminds/semver/v3"
98
k0sv1beta1 "github.com/k0sproject/k0s/pkg/apis/k0s/v1beta1"
@@ -78,29 +77,16 @@ var updateK0sImagesCommand = &cli.Command{
7877
logrus.Infof("updating k0s images")
7978

8079
newmeta := release.K0sMetadata{
81-
Images: make(map[string]release.K0sImage),
80+
Images: make(map[string]release.AddonImage),
8281
}
8382

8483
k0sImages := config.ListK0sImages(k0sv1beta1.DefaultClusterConfig())
8584

86-
if err := ApkoLogin(); err != nil {
87-
return fmt.Errorf("failed to apko login: %w", err)
88-
}
89-
90-
for _, image := range k0sImages {
91-
component, ok := k0sImageComponents[RemoveTagFromImage(image)]
92-
if !ok {
93-
return fmt.Errorf("no component found for image %s", image)
94-
}
95-
repo, tag, err := component.resolveImageRepoAndTag(c.Context, image)
96-
if err != nil {
97-
return fmt.Errorf("failed to resolve image and tag for %s: %w", image, err)
98-
}
99-
newimage := config.Metadata.Images[component.name]
100-
newimage.Image = repo
101-
newimage.Version[runtime.GOARCH] = tag
102-
newmeta.Images[component.name] = newimage
85+
metaImages, err := UpdateImages(c.Context, k0sImageComponents, config.Metadata.Images, k0sImages)
86+
if err != nil {
87+
return fmt.Errorf("failed to update images: %w", err)
10388
}
89+
newmeta.Images = metaImages
10490

10591
logrus.Infof("saving k0s metadata")
10692
if err := newmeta.Save(); err != nil {

cmd/buildtools/openebs.go

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66
"os"
7-
"runtime"
87
"strings"
98

109
"github.com/replicatedhq/embedded-cluster/pkg/addons/openebs"
@@ -129,24 +128,11 @@ func updateOpenEBSAddonImages(ctx context.Context, chartURL string, chartVersion
129128
// make sure we include the linux-utils image.
130129
images = append(images, fmt.Sprintf("docker.io/openebs/linux-utils:%s", linuxUtilsVersion))
131130

132-
if err := ApkoLogin(); err != nil {
133-
return fmt.Errorf("failed to apko login: %w", err)
134-
}
135-
136-
for _, image := range images {
137-
component, ok := openebsImageComponents[RemoveTagFromImage(image)]
138-
if !ok {
139-
return fmt.Errorf("no component found for image %s", image)
140-
}
141-
repo, tag, err := component.resolveImageRepoAndTag(ctx, image)
142-
if err != nil {
143-
return fmt.Errorf("failed to resolve image and tag for %s: %w", image, err)
144-
}
145-
newimage := openebs.Metadata.Images[component.name]
146-
newimage.Repo = repo
147-
newimage.Tag[runtime.GOARCH] = tag
148-
newmeta.Images[component.name] = newimage
131+
metaImages, err := UpdateImages(ctx, openebsImageComponents, openebs.Metadata.Images, images)
132+
if err != nil {
133+
return fmt.Errorf("failed to update images: %w", err)
149134
}
135+
newmeta.Images = metaImages
150136

151137
logrus.Infof("saving addon manifest")
152138
if err := newmeta.Save("openebs"); err != nil {

cmd/buildtools/registry.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package main
33
import (
44
"fmt"
55
"os"
6-
"runtime"
76

87
"github.com/sirupsen/logrus"
98
"github.com/urfave/cli/v2"
@@ -70,20 +69,11 @@ var updateRegistryAddonCommand = &cli.Command{
7069
return fmt.Errorf("failed to get images from chart: %w", err)
7170
}
7271

73-
for _, image := range images {
74-
component, ok := registryImageComponents[RemoveTagFromImage(image)]
75-
if !ok {
76-
return fmt.Errorf("no component found for image %s", image)
77-
}
78-
repo, tag, err := component.resolveImageRepoAndTag(c.Context, image)
79-
if err != nil {
80-
return fmt.Errorf("failed to resolve image and tag for %s: %w", image, err)
81-
}
82-
newimage := registry.Metadata.Images[component.name]
83-
newimage.Repo = repo
84-
newimage.Tag[runtime.GOARCH] = tag
85-
newmeta.Images[component.name] = newimage
72+
metaImages, err := UpdateImages(c.Context, registryImageComponents, registry.Metadata.Images, images)
73+
if err != nil {
74+
return fmt.Errorf("failed to update images: %w", err)
8675
}
76+
newmeta.Images = metaImages
8777

8878
logrus.Infof("saving addon manifest")
8979
if err := newmeta.Save("registry"); err != nil {

cmd/buildtools/seaweedfs.go

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66
"os"
7-
"runtime"
87
"strings"
98

109
"github.com/replicatedhq/embedded-cluster/pkg/addons/seaweedfs"
@@ -114,24 +113,11 @@ func updateSeaweedFSAddonImages(ctx context.Context, chartURL string, chartVersi
114113
return fmt.Errorf("failed to get images from seaweedfs chart: %w", err)
115114
}
116115

117-
if err := ApkoLogin(); err != nil {
118-
return fmt.Errorf("failed to apko login: %w", err)
119-
}
120-
121-
for _, image := range images {
122-
component, ok := seaweedfsImageComponents[RemoveTagFromImage(image)]
123-
if !ok {
124-
return fmt.Errorf("no component found for image %s", image)
125-
}
126-
repo, tag, err := component.resolveImageRepoAndTag(ctx, image)
127-
if err != nil {
128-
return fmt.Errorf("failed to resolve image and tag for %s: %w", image, err)
129-
}
130-
newimage := seaweedfs.Metadata.Images[component.name]
131-
newimage.Repo = repo
132-
newimage.Tag[runtime.GOARCH] = tag
133-
newmeta.Images[component.name] = newimage
116+
metaImages, err := UpdateImages(ctx, seaweedfsImageComponents, seaweedfs.Metadata.Images, images)
117+
if err != nil {
118+
return fmt.Errorf("failed to update images: %w", err)
134119
}
120+
newmeta.Images = metaImages
135121

136122
logrus.Infof("saving addon manifest")
137123
if err := newmeta.Save("seaweedfs"); err != nil {

cmd/buildtools/update.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ var updateAddonCommand = &cli.Command{
2323
},
2424
},
2525
Subcommands: []*cli.Command{
26+
updateAdminConsoleAddonCommand,
2627
updateOpenEBSAddonCommand,
27-
updateSeaweedFSAddonCommand,
28+
updateOperatorAddonCommand,
2829
updateRegistryAddonCommand,
2930
updateVeleroAddonCommand,
30-
updateOperatorAddonCommand,
31-
updateAdminConsoleAddonCommand,
31+
updateSeaweedFSAddonCommand,
3232
},
3333
}
3434

@@ -38,8 +38,8 @@ var updateImagesCommand = &cli.Command{
3838
Subcommands: []*cli.Command{
3939
updateK0sImagesCommand,
4040
updateOpenEBSImagesCommand,
41-
updateVeleroImagesCommand,
4241
updateOperatorImagesCommand,
4342
updateSeaweedFSImagesCommand,
43+
updateVeleroImagesCommand,
4444
},
4545
}

0 commit comments

Comments
 (0)