Skip to content

Commit 259eb0b

Browse files
feat: start publishing release metadata json file (#199)
whenever a release is built we now publish a metadata json file with a content similar to this: ```json { "Versions": { "AdminConsole": "v1.104.3", "EmbeddedClusterOperator": "v0.4.1", "Installer": "v1.28.4+ec.0-dirty", "Kubernetes": "v1.28.4+k0s.0", "OpenEBS": "v3.9.0" }, "K0sSHA": "926bcb68478f0eb5bb8479bf01d39524102346d9f24b9f536aeddf71fdd5a975" } ``` a new hidden topic has been added to the version topic, this is how we generate the version (or release) metadata: ``` $ embedded-cluster version metadata { "Versions": { "AdminConsole": "v1.104.3", "EmbeddedClusterOperator": "v0.4.1", "Installer": "v1.28.4+ec.0-dirty", "Kubernetes": "v1.28.4+k0s.0", "OpenEBS": "v3.9.0" }, "K0sSHA": "926bcb68478f0eb5bb8479bf01d39524102346d9f24b9f536aeddf71fdd5a975" } $ ```
1 parent 06bce22 commit 259eb0b

File tree

4 files changed

+62
-2
lines changed

4 files changed

+62
-2
lines changed

.github/workflows/release-dev.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ jobs:
2121
run: |
2222
make embedded-cluster-linux-amd64
2323
tar -C output/bin -czvf embedded-cluster-linux-amd64.tgz embedded-cluster
24+
./output/bin/embedded-cluster version metadata > metadata.json
2425
make clean
2526
- name: Build darwin-amd64
2627
run: |
@@ -41,3 +42,4 @@ jobs:
4142
title: Development Release Build
4243
files: |
4344
*.tgz
45+
metadata.json

.github/workflows/release-prod.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ jobs:
2323
run: |
2424
make embedded-cluster-linux-amd64 VERSION=$TAG_NAME
2525
tar -C output/bin -czvf embedded-cluster-linux-amd64.tgz embedded-cluster
26+
./output/bin/embedded-cluster version metadata > metadata.json
2627
make clean
2728
- name: Build darwin-amd64
2829
run: |
@@ -41,3 +42,4 @@ jobs:
4142
prerelease: false
4243
files: |
4344
*.tgz
45+
metadata.json

cmd/embedded-cluster/version.go

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"strings"
67

@@ -9,11 +10,13 @@ import (
910

1011
"github.com/replicatedhq/embedded-cluster/pkg/addons"
1112
"github.com/replicatedhq/embedded-cluster/pkg/defaults"
13+
"github.com/replicatedhq/embedded-cluster/pkg/goods"
1214
)
1315

1416
var versionCommand = &cli.Command{
15-
Name: "version",
16-
Usage: fmt.Sprintf("Shows the %s installer version", defaults.BinaryName()),
17+
Name: "version",
18+
Usage: fmt.Sprintf("Shows the %s installer version", defaults.BinaryName()),
19+
Subcommands: []*cli.Command{metadataCommand},
1720
Action: func(c *cli.Context) error {
1821
opts := []addons.Option{addons.Quiet(), addons.WithoutPrompt()}
1922
versions, err := addons.NewApplier(opts...).Versions()
@@ -34,3 +37,36 @@ var versionCommand = &cli.Command{
3437
return nil
3538
},
3639
}
40+
41+
// ReleaseMetadata holds the metadata about a specific release, including addons and
42+
// their versions.
43+
type ReleaseMetadata struct {
44+
Versions map[string]string
45+
K0sSHA string
46+
}
47+
48+
var metadataCommand = &cli.Command{
49+
Name: "metadata",
50+
Usage: "Print metadata about this release",
51+
Hidden: true,
52+
Action: func(c *cli.Context) error {
53+
opts := []addons.Option{addons.Quiet(), addons.WithoutPrompt()}
54+
versions, err := addons.NewApplier(opts...).Versions()
55+
if err != nil {
56+
return fmt.Errorf("unable to get versions: %w", err)
57+
}
58+
versions["Kubernetes"] = defaults.K0sVersion
59+
versions["Installer"] = defaults.Version
60+
sha, err := goods.K0sBinarySHA256()
61+
if err != nil {
62+
return fmt.Errorf("unable to get k0s binary sha256: %w", err)
63+
}
64+
meta := ReleaseMetadata{Versions: versions, K0sSHA: sha}
65+
data, err := json.MarshalIndent(meta, "", "\t")
66+
if err != nil {
67+
return fmt.Errorf("unable to marshal versions: %w", err)
68+
}
69+
fmt.Println(string(data))
70+
return nil
71+
},
72+
}

pkg/goods/goods.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
package goods
44

55
import (
6+
"crypto/sha256"
67
"embed"
8+
"encoding/hex"
79
"fmt"
10+
"io"
811
"os"
12+
"path"
913
"runtime"
1014
"strings"
1115

@@ -15,6 +19,22 @@ import (
1519
//go:embed bins/*
1620
var binfs embed.FS
1721

22+
// K0sBinarySHA256 returns the SHA256 checksum of the embedded k0s binary.
23+
func K0sBinarySHA256() (string, error) {
24+
fname := fmt.Sprintf("k0s-%s", defaults.K0sVersion)
25+
binpath := path.Join("bins", "k0sctl", fname)
26+
fp, err := binfs.Open(binpath)
27+
if err != nil {
28+
return "", fmt.Errorf("unable to open embedded k0s binary: %w", err)
29+
}
30+
defer fp.Close()
31+
hasher := sha256.New()
32+
if _, err := io.Copy(hasher, fp); err != nil {
33+
return "", fmt.Errorf("unable to copy embedded k0s binary: %w", err)
34+
}
35+
return hex.EncodeToString(hasher.Sum(nil)), nil
36+
}
37+
1838
// Materialize writes to disk embed assets.
1939
func Materialize() error {
2040
entries, err := binfs.ReadDir("bins/k0sctl")

0 commit comments

Comments
 (0)