Skip to content

Commit c6ad25c

Browse files
committed
image-deps-updater
1 parent 5dbea4d commit c6ad25c

File tree

4 files changed

+177
-10
lines changed

4 files changed

+177
-10
lines changed

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ on:
88
k0s-version:
99
description: 'K0s version for discovering image versions'
1010
required: false
11+
push:
12+
branches:
13+
- emosbaugh/sc-108755/use-chainguard-openebs
1114

1215
jobs:
1316
update-k0s-images:
@@ -24,12 +27,19 @@ jobs:
2427
- name: Compile buildtools
2528
run: make buildtools
2629

27-
- name: Update k0s images
30+
# - name: Update k0s images
31+
# env:
32+
# REGISTRY_SERVER: docker.io
33+
# REGISTRY_USER: ${{ secrets.DOCKERHUB_USER }}
34+
# REGISTRY_PASS: ${{ secrets.DOCKERHUB_PASSWORD }}
35+
# run: ./output/bin/buildtools update images k0s
36+
37+
- name: Update OpenEBS images
2838
env:
2939
REGISTRY_SERVER: docker.io
3040
REGISTRY_USER: ${{ secrets.DOCKERHUB_USER }}
3141
REGISTRY_PASS: ${{ secrets.DOCKERHUB_PASSWORD }}
32-
run: ./output/bin/buildtools update images k0s
42+
run: ./output/bin/buildtools update images openebs
3343

3444
- name: Create Pull Request # creates a PR if there are differences
3545
uses: peter-evans/create-pull-request@v6

Makefile

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ EMBEDDED_OPERATOR_UTILS_IMAGE_VERSION ?= $(subst +,-,$(VERSION))
2020
EMBEDDED_OPERATOR_UTILS_IMAGE_LOCATION = proxy.replicated.com/anonymous/$(EMBEDDED_OPERATOR_UTILS_IMAGE):$(EMBEDDED_OPERATOR_UTILS_IMAGE_VERSION)
2121
EMBEDDED_CLUSTER_OPERATOR_IMAGE_OVERRIDE =
2222
OPENEBS_CHART_VERSION = 4.1.0
23-
OPENEBS_IMAGE_REPO_OVERRIDE = ttl.sh/replicated/ec-openebs-provisioner-localpv
24-
OPENEBS_IMAGE_TAG = 4.1.0
25-
OPENEBS_UTILS_IMAGE_REPO_OVERRIDE = ttl.sh/replicated/ec-openebs-linux-utils
26-
OPENEBS_UTILS_IMAGE_TAG = 4.1.0
23+
OPENEBS_IMAGE_VERSION = 4.1.0
24+
OPENEBS_KUBECTL_IMAGE_VERSION = 1.29
25+
OPENEBS_PROVISIONER_LOCALPV_IMAGE_REPO_OVERRIDE = ttl.sh/replicated/ec-openebs-provisioner-localpv
26+
OPENEBS_PROVISIONER_LOCALPV_IMAGE_TAG = 4.1.0
27+
OPENEBS_LINUX_UTILS_IMAGE_REPO_OVERRIDE = ttl.sh/replicated/ec-openebs-linux-utils
28+
OPENEBS_LINUX_UTILS_IMAGE_TAG = 4.1.0
2729
OPENEBS_KUBECTL_IMAGE_REPO_OVERRIDE = ttl.sh/replicated/ec-openebs-kubectl
2830
OPENEBS_KUBECTL_IMAGE_TAG = 1.29
2931
SEAWEEDFS_CHART_VERSION = 4.0.0
@@ -65,10 +67,10 @@ LD_FLAGS = -X github.com/replicatedhq/embedded-cluster/pkg/defaults.K0sVersion=$
6567
-X github.com/replicatedhq/embedded-cluster/pkg/addons/embeddedclusteroperator.UtilsImage=$(EMBEDDED_OPERATOR_UTILS_IMAGE_LOCATION) \
6668
-X github.com/replicatedhq/embedded-cluster/pkg/addons/embeddedclusteroperator.ImageOverride=$(EMBEDDED_CLUSTER_OPERATOR_IMAGE_OVERRIDE) \
6769
-X github.com/replicatedhq/embedded-cluster/pkg/addons/openebs.OpenEBSChartVersion=$(OPENEBS_CHART_VERSION) \
68-
-X github.com/replicatedhq/embedded-cluster/pkg/addons/openebs.OpenEBSImageRepoOverride=$(OPENEBS_IMAGE_REPO_OVERRIDE) \
69-
-X github.com/replicatedhq/embedded-cluster/pkg/addons/openebs.OpenEBSImageTag=$(OPENEBS_IMAGE_TAG) \
70-
-X github.com/replicatedhq/embedded-cluster/pkg/addons/openebs.OpenEBSUtilsImageRepoOverride=$(OPENEBS_UTILS_IMAGE_REPO_OVERRIDE) \
71-
-X github.com/replicatedhq/embedded-cluster/pkg/addons/openebs.OpenEBSUtilsImageTag=$(OPENEBS_UTILS_IMAGE_TAG) \
70+
-X github.com/replicatedhq/embedded-cluster/pkg/addons/openebs.OpenEBSImageRepoOverride=$(OPENEBS_PROVISIONER_LOCALPV_IMAGE_REPO_OVERRIDE) \
71+
-X github.com/replicatedhq/embedded-cluster/pkg/addons/openebs.OpenEBSImageTag=$(OPENEBS_PROVISIONER_LOCALPV_IMAGE_TAG) \
72+
-X github.com/replicatedhq/embedded-cluster/pkg/addons/openebs.OpenEBSUtilsImageRepoOverride=$(OPENEBS_LINUX_UTILS_IMAGE_REPO_OVERRIDE) \
73+
-X github.com/replicatedhq/embedded-cluster/pkg/addons/openebs.OpenEBSUtilsImageTag=$(OPENEBS_LINUX_UTILS_IMAGE_TAG) \
7274
-X github.com/replicatedhq/embedded-cluster/pkg/addons/openebs.OpenEBSKubectlImageRepoOverride=$(OPENEBS_KUBECTL_IMAGE_REPO_OVERRIDE) \
7375
-X github.com/replicatedhq/embedded-cluster/pkg/addons/openebs.OpenEBSKubectlImageTag=$(OPENEBS_KUBECTL_IMAGE_TAG) \
7476
-X github.com/replicatedhq/embedded-cluster/pkg/addons/seaweedfs.Version=$(SEAWEEDFS_CHART_VERSION) \

cmd/buildtools/openebs.go

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ package main
22

33
import (
44
"fmt"
5+
"os"
6+
"os/exec"
7+
"path/filepath"
58
"strings"
69

710
"github.com/sirupsen/logrus"
@@ -78,3 +81,154 @@ var updateOpenEBSAddonCommand = &cli.Command{
7881
return nil
7982
},
8083
}
84+
85+
type addonComponent struct {
86+
name string
87+
wolfiPackageName string
88+
upstreamVersionMakefileVar string
89+
upstreamVersionFlagOverride string
90+
}
91+
92+
var openebsComponents = []addonComponent{
93+
{
94+
name: "openebs-provisioner-localpv",
95+
wolfiPackageName: "dynamic-localpv-provisioner",
96+
upstreamVersionMakefileVar: "OPENEBS_IMAGE_VERSION",
97+
upstreamVersionFlagOverride: "openebs-version",
98+
},
99+
{
100+
name: "openebs-linux-utils",
101+
upstreamVersionMakefileVar: "OPENEBS_IMAGE_VERSION",
102+
upstreamVersionFlagOverride: "openebs-version",
103+
},
104+
{
105+
name: "openebs-kubectl",
106+
wolfiPackageName: "kubectl",
107+
upstreamVersionMakefileVar: "OPENEBS_KUBECTL_IMAGE_VERSION",
108+
upstreamVersionFlagOverride: "kubectl-version",
109+
},
110+
}
111+
112+
var updateOpenEBSImagesCommand = &cli.Command{
113+
Name: "openebs",
114+
Usage: "Updates the openebs images",
115+
UsageText: environmentUsageText,
116+
Flags: []cli.Flag{
117+
&cli.StringFlag{
118+
Name: "openebs-version",
119+
Usage: "The version of openebs to use to determine image versions",
120+
},
121+
&cli.StringFlag{
122+
Name: "kubectl-version",
123+
Usage: "The version of kubectl to use to determine image versions",
124+
},
125+
},
126+
Action: func(c *cli.Context) error {
127+
logrus.Infof("updating openebs images")
128+
129+
if err := ApkoLogin(); err != nil {
130+
return fmt.Errorf("failed to apko login: %w", err)
131+
}
132+
133+
wolfiAPKIndex, err := GetWolfiAPKIndex()
134+
if err != nil {
135+
return fmt.Errorf("failed to get APK index: %w", err)
136+
}
137+
138+
for _, component := range openebsComponents {
139+
upstreamVersion, err := getAddonComponentUpstreamVersion(c, component)
140+
if err != nil {
141+
return fmt.Errorf("failed to get upstream version for %s: %w", component.name, err)
142+
}
143+
144+
packageVersion := upstreamVersion
145+
if component.wolfiPackageName != "" {
146+
packageVersion, err = GetWolfiPackageVersion(wolfiAPKIndex, component.name, upstreamVersion)
147+
if err != nil {
148+
return fmt.Errorf("failed to get package version for %s: %w", component.name, err)
149+
}
150+
}
151+
152+
if err := ApkoBuildAndPublish(component.name, packageVersion); err != nil {
153+
return fmt.Errorf("failed to apko build and publish for %s: %w", component.name, err)
154+
}
155+
156+
digest, err := GetDigestFromBuildFile()
157+
if err != nil {
158+
return fmt.Errorf("failed to get digest from build file: %w", err)
159+
}
160+
161+
makefileVar := getAddonComponentImageTagMakefileVar(component)
162+
if err := SetMakefileVariable(makefileVar, fmt.Sprintf("%s@%s", packageVersion, digest)); err != nil {
163+
return fmt.Errorf("failed to set %s version: %w", component.name, err)
164+
}
165+
}
166+
167+
return nil
168+
},
169+
}
170+
171+
func getAddonComponentUpstreamVersion(c *cli.Context, component addonComponent) (string, error) {
172+
if ver := c.String(component.upstreamVersionFlagOverride); ver != "" {
173+
return ver, nil
174+
}
175+
ver, err := GetMakefileVariable(component.upstreamVersionMakefileVar)
176+
if err != nil {
177+
return "", fmt.Errorf("get version from makefile: %w", err)
178+
}
179+
return ver, nil
180+
}
181+
182+
func getAddonComponentImageTagMakefileVar(component addonComponent) string {
183+
return fmt.Sprintf("%s_IMAGE_TAG", strings.ReplaceAll(strings.ToUpper(component.name), "-", "_"))
184+
}
185+
186+
func ApkoLogin() error {
187+
if err := RunCommand("make", "apko"); err != nil {
188+
return fmt.Errorf("make apko: %w", err)
189+
}
190+
if os.Getenv("REGISTRY_PASS") != "" {
191+
if err := RunCommand(
192+
"make",
193+
"apko-login",
194+
fmt.Sprintf("REGISTRY=%s", os.Getenv("REGISTRY_SERVER")),
195+
fmt.Sprintf("USERNAME=%s", os.Getenv("REGISTRY_USER")),
196+
fmt.Sprintf("PASSWORD=%s", os.Getenv("REGISTRY_PASS")),
197+
); err != nil {
198+
return err
199+
}
200+
}
201+
return nil
202+
}
203+
204+
func ApkoBuildAndPublish(componentName string, packageVersion string) error {
205+
if err := RunCommand(
206+
"make",
207+
"apko-build-and-publish",
208+
fmt.Sprintf("IMAGE=%s/replicated/ec-%s:%s", os.Getenv("REGISTRY_SERVER"), componentName, packageVersion),
209+
fmt.Sprintf("APKO_CONFIG=%s", filepath.Join("deploy", "images", componentName, "apko.tmpl.yaml")),
210+
fmt.Sprintf("PACKAGE_VERSION=%s", packageVersion),
211+
); err != nil {
212+
return err
213+
}
214+
return nil
215+
}
216+
217+
func GetDigestFromBuildFile() (string, error) {
218+
contents, err := os.ReadFile("build/digest")
219+
if err != nil {
220+
return "", fmt.Errorf("read build file: %w", err)
221+
}
222+
parts := strings.Split(string(contents), "@")
223+
if len(parts) != 2 {
224+
return "", fmt.Errorf("incorrect number of parts in build file")
225+
}
226+
return strings.TrimSpace(parts[1]), nil
227+
}
228+
229+
func RunCommand(name string, args ...string) error {
230+
cmd := exec.Command(name, args...)
231+
cmd.Stdout = os.Stdout
232+
cmd.Stderr = os.Stderr
233+
return cmd.Run()
234+
}

cmd/buildtools/update.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,6 @@ var updateImagesCommand = &cli.Command{
3535
Usage: "Update embedded cluster images",
3636
Subcommands: []*cli.Command{
3737
updateK0sImagesCommand,
38+
updateOpenEBSImagesCommand,
3839
},
3940
}

0 commit comments

Comments
 (0)