Skip to content

Commit c26a121

Browse files
committed
Build registry with apko
1 parent 0d7ab53 commit c26a121

File tree

5 files changed

+150
-52
lines changed

5 files changed

+150
-52
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ on:
2020
kubectl_version:
2121
description: 'Kubectl version for discovering image versions'
2222
required: false
23+
registry_version:
24+
description: 'Registry version for discovering image versions'
25+
required: false
2326
seaweedfs_version:
2427
description: 'SeaweedFS version for discovering image versions'
2528
required: false
@@ -57,6 +60,7 @@ jobs:
5760
- openebs
5861
- velero
5962
- embeddedclusteroperator
63+
- registry
6064
- seaweedfs
6165
steps:
6266
- name: Checkout
@@ -78,6 +82,7 @@ jobs:
7882
INPUT_VELERO_VERSION: ${{ github.event.inputs.velero_version }}
7983
INPUT_VELERO_AWS_PLUGIN_VERSION: ${{ github.event.inputs.velero_aws_plugin_version }}
8084
INPUT_KUBECTL_VERSION: ${{ github.event.inputs.kubectl_version }}
85+
INPUT_REGISTRY_VERSION: ${{ github.event.inputs.registry_version }}
8186
INPUT_SEAWEEDFS_VERSION: ${{ github.event.inputs.seaweedfs_version }}
8287
run: |
8388
chmod +x ./output/bin/buildtools

.github/workflows/update-addons.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ on:
1111
velero_chart_version:
1212
description: 'Velero chart version for updating the chart and images'
1313
required: false
14+
registry_chart_version:
15+
description: 'Registry chart version for updating the chart and images'
16+
required: false
1417
seaweedfs_chart_version:
1518
description: 'SeaweedFS chart version for updating the chart and images'
1619
required: false
@@ -67,6 +70,7 @@ jobs:
6770
CHARTS_DESTINATION: registry.replicated.com/ec-charts
6871
INPUT_OPENEBS_CHART_VERSION: ${{ github.event.inputs.openebs_chart_version }}
6972
INPUT_VELERO_CHART_VERSION: ${{ github.event.inputs.velero_chart_version }}
73+
INPUT_REGISTRY_CHART_VERSION: ${{ github.event.inputs.registry_chart_version }}
7074
INPUT_SEAWEEDFS_CHART_VERSION: ${{ github.event.inputs.seaweedfs_chart_version }}
7175
run: |
7276
chmod 755 ./output/bin/buildtools

cmd/buildtools/registry.go

Lines changed: 92 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package main
22

33
import (
4+
"context"
45
"fmt"
56
"os"
7+
"strings"
68

79
"github.com/sirupsen/logrus"
810
"github.com/urfave/cli/v2"
@@ -20,10 +22,10 @@ var registryRepo = &repo.Entry{
2022
var registryImageComponents = map[string]addonComponent{
2123
"docker.io/library/registry": {
2224
name: "registry",
23-
getCustomImageName: func(opts addonComponentOptions) (string, error) {
24-
// TODO (@salah): build with apko once distribution is out of beta: https://github.com/wolfi-dev/os/blob/main/distribution.yaml
25-
return "docker.io/library/registry:2.8.3", nil
25+
getWolfiPackageName: func(opts addonComponentOptions) string {
26+
return "distribution"
2627
},
28+
upstreamVersionInputOverride: "INPUT_REGISTRY_VERSION",
2729
},
2830
}
2931

@@ -33,70 +35,109 @@ var updateRegistryAddonCommand = &cli.Command{
3335
UsageText: environmentUsageText,
3436
Action: func(c *cli.Context) error {
3537
logrus.Infof("updating registry addon")
36-
latest, err := LatestChartVersion(registryRepo, "docker-registry")
37-
if err != nil {
38-
return fmt.Errorf("unable to get the latest registry version: %v", err)
39-
}
40-
logrus.Printf("latest registry chart version: %s", latest)
4138

42-
current := registry.Metadata
43-
if current.Version == latest && !c.Bool("force") {
44-
logrus.Infof("registry version is already up-to-date")
45-
return nil
39+
nextChartVersion := os.Getenv("INPUT_REGISTRY_CHART_VERSION")
40+
if nextChartVersion != "" {
41+
logrus.Infof("using input override from INPUT_REGISTRY_CHART_VERSION: %s", nextChartVersion)
42+
} else {
43+
logrus.Infof("fetching the latest registry chart version")
44+
latest, err := LatestChartVersion(registryRepo, "docker-registry")
45+
if err != nil {
46+
return fmt.Errorf("failed to get the latest registry chart version: %v", err)
47+
}
48+
nextChartVersion = latest
49+
logrus.Printf("latest registry chart version: %s", latest)
4650
}
51+
nextChartVersion = strings.TrimPrefix(nextChartVersion, "v")
4752

48-
logrus.Infof("mirroring registry chart version %s", latest)
49-
if err := MirrorChart(registryRepo, "docker-registry", latest); err != nil {
50-
return fmt.Errorf("unable to mirror chart: %w", err)
53+
current := registry.Metadata
54+
if current.Version == nextChartVersion && !c.Bool("force") {
55+
logrus.Infof("registry chart version is already up-to-date")
56+
} else {
57+
logrus.Infof("mirroring registry chart version %s", nextChartVersion)
58+
if err := MirrorChart(registryRepo, "docker-registry", nextChartVersion); err != nil {
59+
return fmt.Errorf("failed to mirror registry chart: %v", err)
60+
}
5161
}
5262

5363
upstream := fmt.Sprintf("%s/docker-registry", os.Getenv("CHARTS_DESTINATION"))
54-
newmeta := release.AddonMetadata{
55-
Version: latest,
56-
Location: fmt.Sprintf("oci://proxy.replicated.com/anonymous/%s", upstream),
57-
Images: make(map[string]release.AddonImage),
58-
}
64+
withproto := fmt.Sprintf("oci://proxy.replicated.com/anonymous/%s", upstream)
5965

60-
values, err := release.GetValuesWithOriginalImages("registry")
61-
if err != nil {
62-
return fmt.Errorf("unable to get openebs values: %v", err)
63-
}
66+
logrus.Infof("updating registry images")
6467

65-
logrus.Infof("extracting images from chart")
66-
withproto := fmt.Sprintf("oci://%s", upstream)
67-
images, err := GetImagesFromOCIChart(withproto, "docker-registry", latest, values)
68+
err := updateRegistryAddonImages(c.Context, withproto, nextChartVersion)
6869
if err != nil {
69-
return fmt.Errorf("failed to get images from chart: %w", err)
70+
return fmt.Errorf("failed to update registry images: %w", err)
7071
}
7172

72-
for _, image := range images {
73-
component, ok := registryImageComponents[RemoveTagFromImage(image)]
74-
if !ok {
75-
return fmt.Errorf("no component found for image %s", image)
76-
}
77-
repo, tag, err := component.resolveImageRepoAndTag(c.Context, image)
78-
if err != nil {
79-
return fmt.Errorf("failed to resolve image and tag for %s: %w", image, err)
80-
}
81-
newmeta.Images[component.name] = release.AddonImage{
82-
Repo: repo,
83-
Tag: tag,
84-
}
85-
}
73+
logrus.Infof("successfully updated registry addon")
8674

87-
logrus.Infof("saving addon manifest")
88-
newmeta.ReplaceImages = true
89-
if err := newmeta.Save("registry"); err != nil {
90-
return fmt.Errorf("failed to save metadata: %w", err)
91-
}
75+
return nil
76+
},
77+
}
9278

93-
logrus.Infof("rendering values for registry ha")
94-
err = newmeta.RenderValues("registry", "values-ha.tpl.yaml", "values-ha.yaml")
79+
var updateRegistryImagesCommand = &cli.Command{
80+
Name: "registry",
81+
Usage: "Updates the registry images",
82+
UsageText: environmentUsageText,
83+
Action: func(c *cli.Context) error {
84+
logrus.Infof("updating registry images")
85+
86+
current := registry.Metadata
87+
88+
err := updateRegistryAddonImages(c.Context, current.Location, current.Version)
9589
if err != nil {
96-
return fmt.Errorf("failed to render values-ha: %w", err)
90+
return fmt.Errorf("failed to update registry images: %w", err)
9791
}
9892

99-
logrus.Infof("successfully updated registry addon")
93+
logrus.Infof("successfully updated registry images")
94+
10095
return nil
10196
},
10297
}
98+
99+
func updateRegistryAddonImages(ctx context.Context, chartURL string, chartVersion string) error {
100+
newmeta := release.AddonMetadata{
101+
Version: chartVersion,
102+
Location: chartURL,
103+
Images: make(map[string]release.AddonImage),
104+
}
105+
106+
values, err := release.GetValuesWithOriginalImages("registry")
107+
if err != nil {
108+
return fmt.Errorf("failed to get registry values: %v", err)
109+
}
110+
111+
logrus.Infof("extracting images from chart version %s", chartVersion)
112+
images, err := GetImagesFromOCIChart(chartURL, "docker-registry", chartVersion, values)
113+
if err != nil {
114+
return fmt.Errorf("failed to get images from registry chart: %w", err)
115+
}
116+
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 := registryImageComponents[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+
newmeta.Images[component.name] = release.AddonImage{
131+
Repo: repo,
132+
Tag: tag,
133+
}
134+
}
135+
136+
logrus.Infof("saving addon manifest")
137+
newmeta.ReplaceImages = true
138+
if err := newmeta.Save("registry"); err != nil {
139+
return fmt.Errorf("failed to save metadata: %w", err)
140+
}
141+
142+
return nil
143+
}

cmd/buildtools/utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func ComponentImageTag(componentName, packageName, packageVersion string) (strin
7474
}
7575
tag, err := ResolveApkoPackageVersion(componentName, packageName, packageVersion)
7676
if err != nil {
77-
return "", fmt.Errorf("apko output tag: %w", err)
77+
return "", fmt.Errorf("resolve apko package version: %w", err)
7878
}
7979
return tag, nil
8080
}

deploy/images/registry/apko.tmpl.yaml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
contents:
2+
repositories:
3+
- https://packages.wolfi.dev/os
4+
keyring:
5+
- https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
6+
packages:
7+
- busybox
8+
- distribution
9+
- distribution-compat
10+
11+
accounts:
12+
groups:
13+
- groupname: nonroot
14+
gid: 65532
15+
users:
16+
- username: nonroot
17+
uid: 65532
18+
gid: 65532
19+
run-as: 65532
20+
21+
paths:
22+
- path: /etc/docker/registry
23+
type: directory
24+
uid: 65532
25+
gid: 65532
26+
permissions: 0o755
27+
recursive: true
28+
- path: /var/lib/registry
29+
type: directory
30+
uid: 65532
31+
gid: 65532
32+
permissions: 0o755
33+
recursive: true
34+
- path: /etc/ssl/docker
35+
type: directory
36+
uid: 65532
37+
gid: 65532
38+
permissions: 0o755
39+
recursive: true
40+
- path: /auth
41+
type: directory
42+
uid: 65532
43+
gid: 65532
44+
permissions: 0o755
45+
recursive: true
46+
47+
entrypoint:
48+
command: /entrypoint.sh

0 commit comments

Comments
 (0)