Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .builder-image-version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.2.3
0.2.6
22 changes: 11 additions & 11 deletions images/builder/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,20 @@
# If you make changes to this Dockerfile run `make builder-image-push`.

# Install Lychee
FROM docker.io/library/alpine:3.23.0@sha256:51183f2cfa6320055da30872f211093f9ff1d3cf06f39a0bdb212314c5dc7375 as lychee
FROM docker.io/library/alpine:3.23.4@sha256:4d889c14e7d5a73929ab00be2ef8ff22437e7cbc545931e52554a7b00e123d8b as lychee
# update: datasource=github-tags depName=lycheeverse/lychee versioning=semver
ENV LYCHEE_VERSION="v0.15.1"
ENV LYCHEE_VERSION="v0.24.2"
# hadolint ignore=DL3018
RUN apk add --no-cache curl && \
curl -L -o /tmp/lychee-${LYCHEE_VERSION}.tgz https://github.com/lycheeverse/lychee/releases/download/${LYCHEE_VERSION}/lychee-${LYCHEE_VERSION}-x86_64-unknown-linux-gnu.tar.gz && \
curl -L -o /tmp/lychee-${LYCHEE_VERSION}.tgz https://github.com/lycheeverse/lychee/releases/download/lychee-${LYCHEE_VERSION}/lychee-x86_64-unknown-linux-gnu.tar.gz && \
tar -xz -C /tmp -f /tmp/lychee-${LYCHEE_VERSION}.tgz && \
mv /tmp/lychee /usr/bin/lychee && \
mv /tmp/lychee-x86_64-unknown-linux-gnu/lychee /usr/bin/lychee && \
rm -rf /tmp/linux-amd64 /tmp/lychee-${LYCHEE_VERSION}.tgz

# Install Golang CI Lint
FROM docker.io/library/alpine:3.23.0@sha256:51183f2cfa6320055da30872f211093f9ff1d3cf06f39a0bdb212314c5dc7375 as golangci
FROM docker.io/library/alpine:3.23.4@sha256:4d889c14e7d5a73929ab00be2ef8ff22437e7cbc545931e52554a7b00e123d8b as golangci
# update: datasource=github-tags depName=golangci/golangci-lint versioning=semver
ENV GOLANGCI_VERSION="v2.7.2"
ENV GOLANGCI_VERSION="v2.9.0"
WORKDIR /
# hadolint ignore=DL3018,DL4006
RUN apk add --no-cache curl && \
Expand All @@ -40,17 +40,17 @@ RUN apk add --no-cache curl && \
FROM docker.io/hadolint/hadolint:v2.14.0-alpine@sha256:7aba693c1442eb31c0b015c129697cb3b6cb7da589d85c7562f9deb435a6657c as hadolint

# Install Trivy
FROM docker.io/aquasec/trivy:0.68.2@sha256:05d0126976bdedcd0782a0336f77832dbea1c81b9cc5e4b3a5ea5d2ec863aca7 as trivy
FROM docker.io/aquasec/trivy:0.70.0@sha256:be1190afcb28352bfddc4ddeb71470835d16462af68d310f9f4bca710961a41e as trivy

############################
# csctl Build Image Base #
############################
FROM docker.io/library/golang:1.22-bullseye
FROM docker.io/library/golang:1.25-bookworm

# update: datasource=repology depName=debian_11/skopeo versioning=loose
ENV SKOPEO_VERSION="1.2.2+dfsg1-1+b6"
ENV SKOPEO_VERSION="1.9.3+ds1-1+b10"
# update: datasource=github-tags depName=adrienverge/yamllint versioning=semver
ENV YAMLLINT_VERSION="v1.37.1"
ENV YAMLLINT_VERSION="v1.38.0"
# update: datasource=github-tags depName=opt-nc/yamlfixer versioning=semver
ENV YAMLFIXER_VERSION="0.9.15"

Expand All @@ -63,7 +63,7 @@ RUN apt-get update && \
protobuf-compiler libprotobuf-dev \
libsystemd-dev jq && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
pip install --no-cache-dir \
pip install --break-system-packages --no-cache-dir \
yamllint==${YAMLLINT_VERSION} \
yamlfixer-opt-nc==${YAMLFIXER_VERSION}

Expand Down
1 change: 1 addition & 0 deletions pkg/clusterstack/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
type Component struct {
ClusterAddon string `yaml:"clusterAddon"`
NodeImage string `yaml:"nodeImage,omitempty"`
ClusterClass string `yaml:"clusterClass"`
}

// Versions contains version information.
Expand Down
28 changes: 26 additions & 2 deletions pkg/clusterstack/mode.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ func HandleStableMode(gitHubReleasePath string, currentReleaseHash, latestReleas
return nil, fmt.Errorf("failed to bump cluster stack: %w", err)
}

if currentReleaseHash.ClusterAddonDir != latestReleaseHash.ClusterAddonDir || currentReleaseHash.ClusterAddonValues != latestReleaseHash.ClusterAddonValues {
if currentReleaseHash.ClusterAddonDir != latestReleaseHash.ClusterAddonDir ||
currentReleaseHash.ClusterAddonValues != latestReleaseHash.ClusterAddonValues ||
currentReleaseHash.ClusterClassDir != latestReleaseHash.ClusterClassDir {
metadata.Versions.Components.ClusterAddon, err = BumpVersion(metadata.Versions.Components.ClusterAddon)
if err != nil {
return nil, fmt.Errorf("failed to bump cluster addon: %w", err)
Expand All @@ -58,6 +60,22 @@ func HandleStableMode(gitHubReleasePath string, currentReleaseHash, latestReleas
fmt.Printf("NodeImage Version unchanged: %s\n", metadata.Versions.Components.NodeImage)
}
}
if currentReleaseHash.ClusterClassDir != latestReleaseHash.ClusterClassDir {
metadata.Versions.Components.ClusterClass, err = BumpVersion(metadata.Versions.Components.ClusterClass)
if err != nil {
metadata.Versions.Components.ClusterClass = "v1"
fmt.Printf("Initial ClusterClass Version: %s\n", metadata.Versions.Components.ClusterClass)
//return nil, fmt.Errorf("failed to bump cluster class: %w", err)
} else {
fmt.Printf("Bumped ClusterClass Version: %s\n", metadata.Versions.Components.ClusterClass)
}
} else {
if metadata.Versions.Components.ClusterClass == "" {
fmt.Println("No ClusterClass Version.")
} else {
fmt.Printf("ClusterClass Version unchanged: %s\n", metadata.Versions.Components.ClusterClass)
}
}

return metadata, nil
}
Expand All @@ -75,19 +93,24 @@ func HandleHashMode(currentRelease cshash.ReleaseHash, kubernetesVersion string)
Components: Component{
ClusterAddon: clusterStackHash,
NodeImage: clusterStackHash,
ClusterClass: clusterStackHash,
},
},
}
}

// HandleCustomMode handles custom mode with version for all components.
func HandleCustomMode(kubernetesVersion, clusterStackVersion, clusterAddonVersion, nodeImageVersion string) (*MetaData, error) {
func HandleCustomMode(kubernetesVersion, clusterStackVersion, clusterAddonVersion,
clusterClassVersion, nodeImageVersion string) (*MetaData, error) {
if _, err := version.New(clusterStackVersion); err != nil {
return nil, fmt.Errorf("failed to verify custom version for cluster stack: %q: %w", clusterStackVersion, err)
}
if _, err := version.New(clusterAddonVersion); err != nil {
return nil, fmt.Errorf("failed to verify custom version for cluster addon: %q: %w", clusterAddonVersion, err)
}
if _, err := version.New(clusterClassVersion); err != nil {
return nil, fmt.Errorf("failed to verify custom version for cluster class: %q: %w", clusterClassVersion, err)
}
if _, err := version.New(nodeImageVersion); err != nil {
return nil, fmt.Errorf("failed to verify custom version for node image: %q: %w", nodeImageVersion, err)
}
Expand All @@ -99,6 +122,7 @@ func HandleCustomMode(kubernetesVersion, clusterStackVersion, clusterAddonVersio
ClusterStack: clusterStackVersion,
Components: Component{
ClusterAddon: clusterAddonVersion,
ClusterClass: clusterClassVersion,
NodeImage: nodeImageVersion,
},
},
Expand Down
10 changes: 9 additions & 1 deletion pkg/cmd/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ var (
nodeImageRegistry string
clusterStackVersion string
clusterAddonVersion string
clusterClassVersion string
nodeImageVersion string
remote string
publish bool
Expand Down Expand Up @@ -95,6 +96,7 @@ func init() {
createCmd.Flags().StringVarP(&nodeImageRegistry, "node-image-registry", "r", "", "It defines the node image registry. For example oci://ghcr.io/foo/bar/node-images/staging/")
createCmd.Flags().StringVar(&clusterStackVersion, "cluster-stack-version", "", "It is used to specify the semver version for the cluster stack in the custom mode")
createCmd.Flags().StringVar(&clusterAddonVersion, "cluster-addon-version", "", "It is used to specify the semver version for the cluster addon in the custom mode")
createCmd.Flags().StringVar(&clusterClassVersion, "cluster-class-version", "", "It is used to specify the semver version for the cluster class in the custom mode")
createCmd.Flags().StringVar(&nodeImageVersion, "node-image-version", "", "It is used to specify the semver version for the node images in the custom mode")
createCmd.Flags().StringVar(&remote, "remote", "github", "Which remote repository to use and thus which credentials are required. Currently supported are 'github' and 'oci'.")
createCmd.Flags().BoolVar(&publish, "publish", false, "Publish release after creation is done. This is only implemented for OCI currently.")
Expand Down Expand Up @@ -168,6 +170,7 @@ func GetCreateOptions(ctx context.Context, clusterStackPath string) (*CreateOpti
createOption.Metadata.Versions.ClusterStack = "v1"
createOption.Metadata.Versions.Components.ClusterAddon = "v1"
createOption.Metadata.Versions.Components.NodeImage = "v1"
createOption.Metadata.Versions.Components.ClusterClass = "v1"
} else {
if err := downloadReleaseAssets(ctx, latestRepoRelease, "./.tmp/release/", ac); err != nil {
return nil, fmt.Errorf("failed to download release asset: %w", err)
Expand Down Expand Up @@ -196,8 +199,12 @@ func GetCreateOptions(ctx context.Context, clusterStackPath string) (*CreateOpti
if nodeImageVersion == "" {
return nil, errors.New("please specify a semver for custom version with --node-image-version flag")
}
if clusterClassVersion == "" {
return nil, errors.New("please specify a semver for custom version with --cluster-class-version flag")
}

createOption.Metadata, err = clusterstack.HandleCustomMode(createOption.Config.Config.KubernetesVersion, clusterStackVersion, clusterAddonVersion, nodeImageVersion)
createOption.Metadata, err = clusterstack.HandleCustomMode(createOption.Config.Config.KubernetesVersion,
clusterStackVersion, clusterAddonVersion, clusterClassVersion, nodeImageVersion)
if err != nil {
return nil, fmt.Errorf("failed to handle custom mode: %w", err)
}
Expand Down Expand Up @@ -257,6 +264,7 @@ func createAction(cmd *cobra.Command, args []string) error {
func (c *CreateOptions) validateHash() error {
if c.CurrentReleaseHash.ClusterAddonDir == c.LatestReleaseHash.ClusterAddonDir &&
c.CurrentReleaseHash.ClusterAddonValues == c.LatestReleaseHash.ClusterAddonValues &&
c.CurrentReleaseHash.ClusterClassDir == c.LatestReleaseHash.ClusterClassDir &&
c.CurrentReleaseHash.NodeImageDir == c.LatestReleaseHash.NodeImageDir {
return errors.New("no change in the cluster stack")
}
Expand Down
9 changes: 8 additions & 1 deletion pkg/cshash/hash.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,15 @@ const (
clusterAddonDirName = "cluster-addon"
nodeImageDirName = "node-image"
clusterAddonValuesFileName = "cluster-addon-values.yaml"
clusterClassDirName = "cluster-class"
)

// ReleaseHash contains the information of release hash.
type ReleaseHash struct {
ClusterStack string `json:"clusterStack"`
ClusterAddonDir string `json:"clusterAddonDir"`
ClusterAddonValues string `json:"clusterAddonValues"`
ClusterClassDir string `json:"clusterClassDir"`
NodeImageDir string `json:"nodeImageDir,omitempty"`
}

Expand Down Expand Up @@ -80,7 +82,9 @@ func GetHash(path string) (ReleaseHash, error) {

for _, entry := range entries {
entryPath := filepath.Join(path, entry.Name())
if entry.IsDir() && (entry.Name() == clusterAddonDirName || entry.Name() == nodeImageDirName) {
if entry.IsDir() && (entry.Name() == clusterAddonDirName ||
entry.Name() == nodeImageDirName ||
entry.Name() == clusterClassDirName) {
hash, err := dirhash.HashDir(entryPath, "", dirhash.DefaultHash)
if err != nil {
return ReleaseHash{}, fmt.Errorf("failed to hash dir: %w", err)
Expand All @@ -92,6 +96,8 @@ func GetHash(path string) (ReleaseHash, error) {
releaseHash.ClusterAddonDir = hash
case nodeImageDirName:
releaseHash.NodeImageDir = hash
case clusterClassDirName:
releaseHash.ClusterClassDir = hash
default:
// Should not happen
return ReleaseHash{}, fmt.Errorf("unknown name type %s", entryPath)
Expand All @@ -114,6 +120,7 @@ func GetHash(path string) (ReleaseHash, error) {
func (r ReleaseHash) ValidateWithLatestReleaseHash(latestReleaseHash ReleaseHash) error {
if r.ClusterAddonDir == latestReleaseHash.ClusterAddonDir &&
r.ClusterAddonValues == latestReleaseHash.ClusterAddonValues &&
r.ClusterClassDir == latestReleaseHash.ClusterClassDir &&
r.NodeImageDir == latestReleaseHash.NodeImageDir {
return errors.New("no change in the cluster stack")
}
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading