Skip to content

Commit 455e5ca

Browse files
authored
fix: set buildpack versions (#215)
1 parent 7593552 commit 455e5ca

10 files changed

Lines changed: 301 additions & 98 deletions

File tree

.github/workflows/update-versions.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ jobs:
149149
fetch-depth: 0
150150
token: ${{ secrets.GITHUB_TOKEN }}
151151

152+
- uses: actions/setup-go@v6
153+
152154
- name: Update buildpack.toml versions
153155
run: make update-buildpack-versions RELEASE_VERSION=${{ github.event.inputs.version }}${{ (github.event.inputs.test_mode == 'true' && '-test') || '' }}
154156

Makefile

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -134,22 +134,17 @@ lint: shellcheck golang_ci_lint
134134

135135
.PHONY: update-buildpack-versions
136136
update-buildpack-versions:
137-
@echo "Updating buildpack versions to $(RELEASE_VERSION)..."
138-
@for bp in $(BUILDPACKS); do \
139-
FILE="buildpacks/$$bp/buildpack.toml"; \
140-
./scripts/update_buildpack_versions.sh "$(RELEASE_VERSION)" "$$FILE"; \
141-
done
137+
@echo "Updating buildpack versions to $(RELEASE_VERSION)..."; \
138+
go run ./scripts/*go buildpacks set-version "$(RELEASE_VERSION)"
142139

143140
.PHONY: update-builder-versions
144141
update-builder-versions:
145142
@echo "Updating builder versions to $(RELEASE_VERSION)..."
146143
@for builder in $(BUILDERS); do \
147144
FILE="builders/$$builder/builder.toml"; \
148-
if [ $$(grep $(REGISTRY_REPO) $$FILE|wc -l) -eq 2 ];then \
149-
./scripts/update_builder_versions.sh "$(RELEASE_VERSION)" "$$FILE" true; \
150-
else \
151-
./scripts/update_builder_versions.sh "$(RELEASE_VERSION)" "$$FILE"; \
152-
fi \
145+
go run ./scripts/*go builder -f $$FILE set-buildpacks "$(RELEASE_VERSION)"; \
146+
go run ./scripts/*go builder -f $$FILE set-builder "$(RELEASE_VERSION)"; \
147+
go run ./scripts/*go builder -f $$FILE set-runner "$(RELEASE_VERSION)"; \
153148
done
154149

155150
.PHONY: update-action-versions

builders/cuda-selector/builder.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ value = "vscodium"
7171
version = "0.5.0"
7272

7373
[lifecycle]
74-
version = "0.5.0"
74+
version = "0.20.19"
7575

7676
[[order]]
7777

builders/selector/builder.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ value = "vscodium"
7171
version = "0.5.0"
7272

7373
[lifecycle]
74-
version = "0.5.0"
74+
version = "0.20.19"
7575

7676
[[order]]
7777

@@ -205,7 +205,7 @@ value = "vscodium"
205205
optional = true
206206

207207
[build]
208-
image = "index.docker.io/paketobuildpacks/ubuntu-noble-build:0.0.38"
208+
image = "ghcr.io/swissdatasciencecenter/renku-frontend-buildpacks/run-image:0.5.0"
209209

210210
[run]
211211
[[run.images]]

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ tool (
1010
)
1111

1212
require (
13+
github.com/BurntSushi/toml v1.6.0
14+
github.com/alecthomas/kong v1.15.0
1315
github.com/docker/docker v28.5.2+incompatible
1416
github.com/docker/go-connections v0.6.0
1517
github.com/oklog/ulid/v2 v2.1.1
@@ -21,7 +23,6 @@ require (
2123
github.com/Masterminds/semver/v3 v3.4.0 // indirect
2224
github.com/Microsoft/go-winio v0.4.21 // indirect
2325
github.com/a8m/envsubst v1.4.2 // indirect
24-
github.com/alecthomas/assert/v2 v2.11.0 // indirect
2526
github.com/alecthomas/participle/v2 v2.1.1 // indirect
2627
github.com/containerd/errdefs v1.0.0 // indirect
2728
github.com/containerd/errdefs/pkg v0.3.0 // indirect

go.sum

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=
22
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
3+
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
4+
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
35
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
46
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
57
github.com/Microsoft/go-winio v0.4.21 h1:+6mVbXh4wPzUrl1COX9A+ZCvEpYsOBZ6/+kwDnvLyro=
@@ -8,10 +10,12 @@ github.com/a8m/envsubst v1.4.2 h1:4yWIHXOLEJHQEFd4UjrWDrYeYlV7ncFWJOCBRLOZHQg=
810
github.com/a8m/envsubst v1.4.2/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY=
911
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
1012
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
13+
github.com/alecthomas/kong v1.15.0 h1:BVJstKbpO73zKpmIu+m/aLRrNmWwxXPIGTNin9VmLVI=
14+
github.com/alecthomas/kong v1.15.0/go.mod h1:wrlbXem1CWqUV5Vbmss5ISYhsVPkBb1Yo7YKJghju2I=
1115
github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8=
1216
github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c=
13-
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
14-
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
17+
github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs=
18+
github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
1519
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
1620
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
1721
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=

scripts/buildpack_api.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package main
2+
3+
import "github.com/BurntSushi/toml"
4+
5+
type BuilderConfig struct {
6+
Description string `toml:"description,omitempty"`
7+
Buildpacks []BuilderBuildpack `toml:"buildpacks,omitempty"`
8+
Extensions []BuilderBuildpack `toml:"extensions,omitempty"`
9+
Order []Order `toml:"order,omitempty"`
10+
OrderExtensions []Order `toml:"order-extensions,omitempty"`
11+
Stack *toml.Primitive `toml:"stack,omitempty"`
12+
Build *BuildImage `toml:"build,omitempty"`
13+
Run *RunConfig `toml:"run,omitempty"`
14+
Lifecycle *toml.Primitive `toml:"lifecycle,omitempty"`
15+
Targets *toml.Primitive `toml:"targets,omitempty"`
16+
}
17+
18+
type BuilderBuildpack struct {
19+
URI string `toml:"uri,omitempty"`
20+
ID string `toml:"id,omitempty"`
21+
Version string `toml:"version,omitempty"`
22+
}
23+
24+
type Order struct {
25+
Group []GroupEntry `toml:"group,omitempty"`
26+
}
27+
28+
type GroupEntry struct {
29+
ID string `toml:"id"`
30+
Version string `toml:"version,omitempty"`
31+
Optional bool `toml:"optional,omitempty"`
32+
}
33+
34+
type BuildImage struct {
35+
Image string `toml:"image,omitempty"`
36+
Env *toml.Primitive `toml:"env,omitempty"`
37+
}
38+
39+
type RunConfig struct {
40+
Images []RunImage `toml:"images,omitempty"`
41+
}
42+
43+
type RunImage struct {
44+
Image string `toml:"image,omitempty"`
45+
Mirrors *toml.Primitive `toml:"mirrors,omitempty"`
46+
}
47+
48+
type BuildpackSpec struct {
49+
Api *toml.Primitive `toml:"api,omitempty"`
50+
Targets *toml.Primitive `toml:"targets,omitempty"`
51+
Buildpack map[string]string `toml:"buildpack,omitempty"`
52+
}

scripts/main.go

Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
8+
"github.com/BurntSushi/toml"
9+
"github.com/alecthomas/kong"
10+
)
11+
12+
var cli struct {
13+
Builder BuildersCmds `cmd:"" help:"Commands to modify builders"`
14+
Buildpacks BuildpackCmds `cmd:"" help:"Commands to modify buildpacks"`
15+
}
16+
17+
type BuildersCmds struct {
18+
File string `short:"f" default:"builder.toml" help:"Path to builder.toml." type:"existingfile"`
19+
SetBuildpacks SetBuildpacksCmd `cmd:"" help:"Update the version of the renku buildpacks in a builder."`
20+
SetBuilder SetBuilderCmd `cmd:"" help:"Update the version of the builder image."`
21+
SetRunner SetRunnerCmd `cmd:"" help:"Update the version of the runner image."`
22+
}
23+
24+
type BuildpackCmds struct {
25+
SetVersion SetBuildpackVersionCmd `cmd:"" help:"Update the version of all buildpacks image."`
26+
}
27+
28+
type SetBuildpacksCmd struct {
29+
Version string `arg:"" help:"New version (tag) to set."`
30+
}
31+
32+
type SetBuilderCmd struct {
33+
Version string `arg:"" help:"New version (tag) to set."`
34+
}
35+
36+
type SetRunnerCmd struct {
37+
Version string `arg:"" help:"New version (tag) to set."`
38+
}
39+
40+
type SetBuildpackVersionCmd struct {
41+
Version string `arg:"" help:"New version (tag) to set."`
42+
}
43+
44+
func main() {
45+
ctx := kong.Parse(&cli,
46+
kong.Name("bpu"),
47+
kong.Description("Buildpack Utilities (bpu)"),
48+
kong.UsageOnError(),
49+
)
50+
51+
switch ctx.Command() {
52+
case "builder set-buildpacks <version>":
53+
cfg := mustLoadBuilder(cli.Builder.File)
54+
cli.Builder.SetBuildpacks.Run(cfg, cli.Builder.File)
55+
case "builder set-builder <version>":
56+
cfg := mustLoadBuilder(cli.Builder.File)
57+
cli.Builder.SetBuilder.Run(cfg, cli.Builder.File)
58+
case "builder set-runner <version>":
59+
cfg := mustLoadBuilder(cli.Builder.File)
60+
cli.Builder.SetRunner.Run(cfg, cli.Builder.File)
61+
case "buildpacks set-version <version>":
62+
cli.Buildpacks.SetVersion.Run()
63+
}
64+
}
65+
66+
func (c *SetBuildpacksCmd) Run(cfg *BuilderConfig, path string) {
67+
changed := 0
68+
buildpacks := getBuildpacks()
69+
70+
for _, bp := range buildpacks {
71+
applyToBuildpacks(cfg.Buildpacks, fmt.Sprintf("../../buildpacks/%s", bp), c.Version, "[[buildpacks]]", &changed)
72+
}
73+
for _, bp := range buildpacks {
74+
applyToOrder(cfg.Order, fmt.Sprintf("renku/%s", bp), c.Version, "[[order]]", &changed)
75+
}
76+
77+
if changed == 0 {
78+
fmt.Fprintf(os.Stderr, "warning: no entries matching found in builder at %q\n", path)
79+
os.Exit(1)
80+
}
81+
82+
mustSaveBuilder(path, cfg)
83+
fmt.Printf("\n✓ Updated %d field(s) in %s\n", changed, path)
84+
}
85+
86+
func (c *SetBuilderCmd) Run(cfg *BuilderConfig, path string) {
87+
oldImg := cfg.Build.Image
88+
newImg, _ := updateTag(oldImg, c.Version)
89+
cfg.Build.Image = newImg
90+
fmt.Printf("✓ Updated builder at %s %s -> %s\n", path, oldImg, newImg)
91+
mustSaveBuilder(path, cfg)
92+
}
93+
94+
func (c *SetRunnerCmd) Run(cfg *BuilderConfig, path string) {
95+
for runImgInd, runImg := range cfg.Run.Images {
96+
oldImg := runImg.Image
97+
newImg, _ := updateTag(oldImg, c.Version)
98+
cfg.Run.Images[runImgInd].Image = newImg
99+
fmt.Printf("✓ Updated runner at %s with ind %d %s -> %s\n", path, runImgInd, oldImg, newImg)
100+
mustSaveBuilder(path, cfg)
101+
}
102+
}
103+
104+
func (c *SetBuildpackVersionCmd) Run() {
105+
bps := getBuildpacks()
106+
for _, bp := range bps {
107+
path := fmt.Sprintf("buildpacks/%s/buildpack.toml", bp)
108+
spec := mustLoadBuildpack(path)
109+
spec.Buildpack["version"] = c.Version
110+
fmt.Printf("Updated buildpack at %s to %s\n", path, c.Version)
111+
mustSaveBuildpack(path, spec)
112+
}
113+
}
114+
115+
// mutation helpers
116+
117+
func applyToBuildpacks(bps []BuilderBuildpack, target, newVer, section string, changed *int) {
118+
for i := range bps {
119+
bp := &bps[i]
120+
if !matchesTarget(bp, target) {
121+
continue
122+
}
123+
if bp.Version != "" && bp.Version != newVer {
124+
fmt.Printf(" %s uri=%s version %q -> %q\n", section, target, bp.Version, newVer)
125+
bp.Version = newVer
126+
(*changed)++
127+
}
128+
}
129+
}
130+
131+
func applyToOrder(orders []Order, target, newVer, section string, changed *int) {
132+
for oi := range orders {
133+
for gi := range orders[oi].Group {
134+
g := &orders[oi].Group[gi]
135+
if g.ID != target {
136+
continue
137+
}
138+
if g.Version != newVer {
139+
fmt.Printf(" %s id=%s version %q -> %q\n", section, g.ID, g.Version, newVer)
140+
g.Version = newVer
141+
(*changed)++
142+
}
143+
}
144+
}
145+
}
146+
147+
// toml I/O
148+
149+
func mustLoadBuilder(path string) *BuilderConfig {
150+
var cfg BuilderConfig
151+
if _, err := toml.DecodeFile(path, &cfg); err != nil {
152+
fmt.Fprintf(os.Stderr, "error: cannot parse %s: %v\n", path, err)
153+
os.Exit(1)
154+
}
155+
return &cfg
156+
}
157+
158+
func mustSaveBuilder(path string, cfg *BuilderConfig) {
159+
f, err := os.Create(path)
160+
if err != nil {
161+
fmt.Fprintf(os.Stderr, "error: cannot write %s: %v\n", path, err)
162+
os.Exit(1)
163+
}
164+
defer func() {
165+
err := f.Close()
166+
fmt.Fprintf(os.Stderr, "error: cannot close file: %v\n", err)
167+
os.Exit(1)
168+
}()
169+
if err := toml.NewEncoder(f).Encode(cfg); err != nil {
170+
fmt.Fprintf(os.Stderr, "error: cannot encode toml: %v\n", err)
171+
os.Exit(1)
172+
}
173+
}
174+
175+
func mustLoadBuildpack(path string) *BuildpackSpec {
176+
var cfg BuildpackSpec
177+
_, err := toml.DecodeFile(path, &cfg)
178+
if err != nil {
179+
fmt.Fprintf(os.Stderr, "error: cannot parse %s: %v\n", path, err)
180+
os.Exit(1)
181+
}
182+
return &cfg
183+
}
184+
185+
func mustSaveBuildpack(path string, cfg *BuildpackSpec) {
186+
f, err := os.Create(path)
187+
if err != nil {
188+
fmt.Fprintf(os.Stderr, "error: cannot write %s: %v\n", path, err)
189+
os.Exit(1)
190+
}
191+
defer func() {
192+
err := f.Close()
193+
fmt.Fprintf(os.Stderr, "error: cannot close file: %v\n", err)
194+
os.Exit(1)
195+
}()
196+
if err := toml.NewEncoder(f).Encode(cfg); err != nil {
197+
fmt.Fprintf(os.Stderr, "error: cannot encode toml: %v\n", err)
198+
os.Exit(1)
199+
}
200+
}
201+
202+
// utilities
203+
204+
func matchesTarget(bp *BuilderBuildpack, target string) bool {
205+
return strings.Trim(bp.URI, " \n\t") == target || strings.Trim(bp.ID, " \n\t") == target
206+
}
207+
208+
func updateTag(ref, newTag string) (string, bool) {
209+
i := strings.LastIndex(ref, ":")
210+
if i < 0 {
211+
return ref, false
212+
}
213+
if ref[i+1:] == newTag {
214+
return ref, false
215+
}
216+
return ref[:i+1] + newTag, true
217+
}
218+
219+
func getBuildpacks() []string {
220+
buildpackDirsRaw, err := os.ReadDir("buildpacks")
221+
buildpackDirs := []string{}
222+
if err != nil {
223+
fmt.Fprintf(os.Stderr, "error: %v", err)
224+
}
225+
for _, e := range buildpackDirsRaw {
226+
if e.IsDir() {
227+
buildpackDirs = append(buildpackDirs, e.Name())
228+
}
229+
}
230+
return buildpackDirs
231+
}

0 commit comments

Comments
 (0)