Skip to content

Commit

Permalink
Build seaweedfs image with Chainguard
Browse files Browse the repository at this point in the history
  • Loading branch information
sgalsaleh committed Jul 25, 2024
1 parent e8d30a1 commit 6d70315
Show file tree
Hide file tree
Showing 7 changed files with 189 additions and 48 deletions.
2 changes: 1 addition & 1 deletion cmd/buildtools/openebs.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ var updateOpenEBSAddonCommand = &cli.Command{
return fmt.Errorf("failed to get the latest openebs chart version: %v", err)
}
nextChartVersion = latest
logrus.Printf("latest velero chart version: %s", latest)
logrus.Printf("latest openebs chart version: %s", latest)
}
nextChartVersion = strings.TrimPrefix(nextChartVersion, "v")

Expand Down
178 changes: 139 additions & 39 deletions cmd/buildtools/seaweedfs.go
Original file line number Diff line number Diff line change
@@ -1,79 +1,179 @@
package main

import (
"context"
"fmt"
"os"
"strings"

"github.com/Masterminds/semver/v3"
"github.com/replicatedhq/embedded-cluster/pkg/addons/seaweedfs"
"github.com/replicatedhq/embedded-cluster/pkg/release"
"github.com/sirupsen/logrus"
"github.com/urfave/cli/v2"
)

var seaweedfsImageComponents = map[string]string{
"docker.io/chrislusf/seaweedfs": "seaweedfs",
}

var seaweedfsComponents = map[string]addonComponent{
"seaweedfs": {
getWolfiPackageName: func(k0sVersion *semver.Version, upstreamVersion *semver.Version) string {
return "seaweedfs"
},
upstreamVersionInputOverride: "INPUT_SEAWEEDFS_VERSION",
},
}

var updateSeaweedFSAddonCommand = &cli.Command{
Name: "seaweedfs",
Usage: "Updates the SeaweedFS addon",
UsageText: environmentUsageText,
Action: func(c *cli.Context) error {
logrus.Infof("updating seaweedfs addon")

latest, err := LatestChartVersion("seaweedfs", "seaweedfs")
nextChartVersion := os.Getenv("INPUT_SEAWEEDFS_VERSION")
if nextChartVersion != "" {
logrus.Infof("using input override from INPUT_SEAWEEDFS_VERSION: %s", nextChartVersion)
} else {
logrus.Infof("fetching the latest seaweedfs chart version")
latest, err := LatestChartVersion("seaweedfs", "seaweedfs")
if err != nil {
return fmt.Errorf("failed to get the latest seaweedfs chart version: %v", err)
}
nextChartVersion = latest
logrus.Printf("latest seaweedfs chart version: %s", latest)
}
nextChartVersion = strings.TrimPrefix(nextChartVersion, "v")

current := seaweedfs.Metadata
if current.Version == nextChartVersion && !c.Bool("force") {
logrus.Infof("seaweedfs chart version is already up-to-date")
} else {
logrus.Infof("mirroring seaweedfs chart version %s", nextChartVersion)
if err := MirrorChart("seaweedfs", "seaweedfs", nextChartVersion); err != nil {
return fmt.Errorf("failed to mirror seaweedfs chart: %v", err)
}
}

upstream := fmt.Sprintf("%s/seaweedfs", os.Getenv("CHARTS_DESTINATION"))
withproto := fmt.Sprintf("oci://proxy.replicated.com/anonymous/%s", upstream)

logrus.Infof("updating seaweedfs images")

err := updateSeaweedFSAddonImages(c.Context, withproto, nextChartVersion)
if err != nil {
return fmt.Errorf("unable to get the latest seaweedfs version: %v", err)
return fmt.Errorf("failed to update seaweedfs images: %w", err)
}
latest = strings.TrimPrefix(latest, "v")
logrus.Infof("found seaweedfs chart version %s", latest)

logrus.Infof("successfully updated seaweedfs addon")

return nil
},
}

var updateSeaweedFSImagesCommand = &cli.Command{
Name: "seaweedfs",
Usage: "Updates the seaweedfs images",
UsageText: environmentUsageText,
Action: func(c *cli.Context) error {
logrus.Infof("updating seaweedfs images")

current := seaweedfs.Metadata
if current.Version == latest && !c.Bool("force") {
logrus.Infof("seaweedfs chart is up to date")
return nil

err := updateSeaweedFSAddonImages(c.Context, current.Location, current.Version)
if err != nil {
return fmt.Errorf("failed to update seaweedfs images: %w", err)
}

logrus.Infof("mirroring seaweedfs chart")
if err := MirrorChart("seaweedfs", "seaweedfs", latest); err != nil {
return fmt.Errorf("unable to mirror seaweedfs chart: %w", err)
logrus.Infof("successfully updated seaweedfs images")

return nil
},
}

func updateSeaweedFSAddonImages(ctx context.Context, chartURL string, chartVersion string) error {
newmeta := release.AddonMetadata{
Version: chartVersion,
Location: chartURL,
Images: make(map[string]string),
}

k0sVersion, err := getK0sVersion()
if err != nil {
return fmt.Errorf("failed to get k0s version: %w", err)
}

logrus.Infof("fetching wolfi apk index")
wolfiAPKIndex, err := GetWolfiAPKIndex()
if err != nil {
return fmt.Errorf("failed to get APK index: %w", err)
}

values, err := release.GetValuesWithOriginalImages("seaweedfs")
if err != nil {
return fmt.Errorf("failed to get seaweedfs values: %v", err)
}

logrus.Infof("extracting images from chart version %s", chartVersion)
images, err := GetImagesFromOCIChart(chartURL, "seaweedfs", chartVersion, values)
if err != nil {
return fmt.Errorf("failed to get images from seaweedfs chart: %w", err)
}

if err := ApkoLogin(); err != nil {
return fmt.Errorf("failed to apko login: %w", err)
}

for _, image := range images {
logrus.Infof("updating image %s", image)

upstreamVersion := TagFromImage(image)
image = RemoveTagFromImage(image)

componentName, ok := seaweedfsImageComponents[image]
if !ok {
return fmt.Errorf("no component found for image %s", image)
}

upstream := fmt.Sprintf("%s/seaweedfs", os.Getenv("CHARTS_DESTINATION"))
newmeta := release.AddonMetadata{
Version: latest,
Location: fmt.Sprintf("oci://proxy.replicated.com/anonymous/%s", upstream),
Images: make(map[string]string),
component, ok := seaweedfsComponents[componentName]
if !ok {
return fmt.Errorf("no component found for component name %s", componentName)
}

values, err := release.GetValuesWithOriginalImages("seaweedfs")
if err != nil {
return fmt.Errorf("unable to get openebs values: %v", err)
if component.upstreamVersionInputOverride != "" {
v := os.Getenv(component.upstreamVersionInputOverride)
if v != "" {
logrus.Infof("using input override from %s: %s", component.upstreamVersionInputOverride, v)
upstreamVersion = v
}
}

logrus.Infof("extracting images from chart")
withproto := fmt.Sprintf("oci://%s", upstream)
images, err := GetImagesFromOCIChart(withproto, "seaweedfs", latest, values)
packageName, packageVersion, err := component.getPackageNameAndVersion(wolfiAPKIndex, k0sVersion, upstreamVersion)
if err != nil {
return fmt.Errorf("failed to get images from admin console chart: %w", err)
return fmt.Errorf("failed to get package name and version for %s: %w", componentName, err)
}

logrus.Infof("fetching digest for images")
for _, image := range images {
sha, err := GetImageDigest(c.Context, image)
if err != nil {
return fmt.Errorf("failed to get image %s digest: %w", image, err)
}
logrus.Infof("image %s digest: %s", image, sha)
tag := TagFromImage(image)
image = RemoveTagFromImage(image)
newmeta.Images[image] = fmt.Sprintf("%s@%s", tag, sha)
logrus.Infof("building and publishing %s, %s=%s", componentName, packageName, packageVersion)

if err := ApkoBuildAndPublish(componentName, packageName, packageVersion, upstreamVersion); err != nil {
return fmt.Errorf("failed to apko build and publish for %s: %w", componentName, err)
}

logrus.Infof("saving addon manifest")
newmeta.ReplaceImages = true
if err := newmeta.Save("seaweedfs"); err != nil {
return fmt.Errorf("failed to save metadata: %w", err)
digest, err := GetDigestFromBuildFile()
if err != nil {
return fmt.Errorf("failed to get digest from build file: %w", err)
}

logrus.Infof("successfully updated seaweed addon")
return nil
},
newmeta.Images[componentName] = fmt.Sprintf("%s@%s", packageVersion, digest)
}

logrus.Infof("saving addon manifest")
newmeta.ReplaceImages = true
if err := newmeta.Save("seaweedfs"); err != nil {
return fmt.Errorf("failed to save metadata: %w", err)
}

return nil
}
1 change: 1 addition & 0 deletions cmd/buildtools/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,6 @@ var updateImagesCommand = &cli.Command{
updateK0sImagesCommand,
updateOpenEBSImagesCommand,
updateVeleroImagesCommand,
updateSeaweedFSImagesCommand,
},
}
40 changes: 40 additions & 0 deletions deploy/images/seaweedfs/apko.tmpl.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# adapted from:
# https://github.com/seaweedfs/seaweedfs/blob/8b402fb4b956ac8b10db3453d8a205cda392b372/docker/Dockerfile.go_build
contents:
repositories:
- https://packages.wolfi.dev/os
keyring:
- https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
packages:
- wolfi-base
- seaweedfs=${PACKAGE_VERSION}
- fuse3 # for weed mount

accounts:
groups:
- groupname: nonroot
gid: 65532
users:
- username: nonroot
uid: 65532
gid: 65532
run-as: 65532

paths:
- path: /data
type: directory
uid: 65532
gid: 65532
permissions: 0o755
recursive: true
- path: /data/filerldb2
type: directory
uid: 65532
gid: 65532
permissions: 0o755
recursive: true

work-dir: /data

entrypoint:
command: /usr/bin/entrypoint.sh
4 changes: 2 additions & 2 deletions pkg/addons/seaweedfs/static/metadata.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
# $ output/bin/buildtools update addon <addon name>
#
version: 4.0.0
location: oci://proxy.replicated.com/anonymous/registry.replicated.com/ec-charts/seaweedfs
location: oci://proxy.replicated.com/anonymous/ttl.sh/sgalsaleh/seaweedfs
images:
chrislusf/seaweedfs: 3.71@sha256:2829e52cd2f653cfb900cbbbc72f4c3fda0e8ab785429a80514090cdd73dec8c
seaweedfs: 3.71-r1@sha256:d7af55530b590fbc136a6a4942e23d964080997392b8aac964b83926937b36b4
6 changes: 3 additions & 3 deletions pkg/addons/seaweedfs/static/values.tpl.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ global:
{{- end }}
master:
{{- if .ReplaceImages }}
imageOverride: 'proxy.replicated.com/anonymous/chrislusf/seaweedfs:{{ index .Images "chrislusf/seaweedfs" }}'
imageOverride: 'proxy.replicated.com/anonymous/replicated/ec-seaweedfs:{{ index .Images "seaweedfs" }}'
{{- end }}
replicas: 1
disableHttp: true
Expand Down Expand Up @@ -35,7 +35,7 @@ volume:
# replicas must be at least replication (2) + 1 = 3
replicas: 3
{{- if .ReplaceImages }}
imageOverride: 'proxy.replicated.com/anonymous/chrislusf/seaweedfs:{{ index .Images "chrislusf/seaweedfs" }}'
imageOverride: 'proxy.replicated.com/anonymous/replicated/ec-seaweedfs:{{ index .Images "seaweedfs" }}'
{{- end }}
podAnnotations:
backup.velero.io/backup-volumes: data
Expand Down Expand Up @@ -72,7 +72,7 @@ volume:
filer:
replicas: 3
{{- if .ReplaceImages }}
imageOverride: 'proxy.replicated.com/anonymous/chrislusf/seaweedfs:{{ index .Images "chrislusf/seaweedfs" }}'
imageOverride: 'proxy.replicated.com/anonymous/replicated/ec-seaweedfs:{{ index .Images "seaweedfs" }}'
{{- end }}
podAnnotations:
backup.velero.io/backup-volumes: data-filer,seaweedfs-filer-log-volume
Expand Down
6 changes: 3 additions & 3 deletions pkg/addons/seaweedfs/static/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ global:
replicationPlacment: "001"
registry: "proxy.replicated.com/anonymous/"
master:
imageOverride: 'proxy.replicated.com/anonymous/chrislusf/seaweedfs:3.71@sha256:2829e52cd2f653cfb900cbbbc72f4c3fda0e8ab785429a80514090cdd73dec8c'
imageOverride: 'proxy.replicated.com/anonymous/replicated/ec-seaweedfs:3.71-r1@sha256:d7af55530b590fbc136a6a4942e23d964080997392b8aac964b83926937b36b4'
replicas: 1
disableHttp: true
volumeSizeLimitMB: 30000
Expand All @@ -43,7 +43,7 @@ master:
volume:
# replicas must be at least replication (2) + 1 = 3
replicas: 3
imageOverride: 'proxy.replicated.com/anonymous/chrislusf/seaweedfs:3.71@sha256:2829e52cd2f653cfb900cbbbc72f4c3fda0e8ab785429a80514090cdd73dec8c'
imageOverride: 'proxy.replicated.com/anonymous/replicated/ec-seaweedfs:3.71-r1@sha256:d7af55530b590fbc136a6a4942e23d964080997392b8aac964b83926937b36b4'
podAnnotations:
backup.velero.io/backup-volumes: data
affinity: |
Expand Down Expand Up @@ -78,7 +78,7 @@ volume:
maxVolumes: 50
filer:
replicas: 3
imageOverride: 'proxy.replicated.com/anonymous/chrislusf/seaweedfs:3.71@sha256:2829e52cd2f653cfb900cbbbc72f4c3fda0e8ab785429a80514090cdd73dec8c'
imageOverride: 'proxy.replicated.com/anonymous/replicated/ec-seaweedfs:3.71-r1@sha256:d7af55530b590fbc136a6a4942e23d964080997392b8aac964b83926937b36b4'
podAnnotations:
backup.velero.io/backup-volumes: data-filer,seaweedfs-filer-log-volume
data:
Expand Down

0 comments on commit 6d70315

Please sign in to comment.