-
Notifications
You must be signed in to change notification settings - Fork 145
/
Copy pathhelm-chart-pipeline.go
117 lines (100 loc) · 2.82 KB
/
helm-chart-pipeline.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package main
import (
"context"
"fmt"
"log"
"os"
"strings"
"dagger.io/dagger"
)
var (
// the container registry for the multi-platform image
CONTAINER_REGISTRY = getEnv("CONTAINER_REGISTRY", "docker.io")
CONTAINER_REGISTRY_USER = getEnv("CONTAINER_REGISTRY_USER", "salaboy")
CONTAINER_REGISTRY_PASSWORD = getEnv("CONTAINER_REGISTRY_PASSWORD", "")
)
func main() {
var err error
ctx := context.Background()
if len(os.Args) < 2 {
panic(fmt.Errorf("invalid number of arguments: expected command (package, test, publish, all)"))
}
client := getDaggerClient(ctx)
defer client.Close()
switch os.Args[1] {
case "package":
_, _, err := helmPackage(ctx, client)
if err != nil {
fmt.Println("Packaging error: %v ", err)
}
case "test":
err = helmTest(ctx)
case "publish":
hc, chart, err := helmPackage(ctx, client)
if err != nil {
fmt.Println("Packaging error: %v ", err)
}
err = helmPublish(ctx, hc, chart)
if err != nil {
fmt.Println("Publishing error: %v ", err)
}
case "all":
hc, chart, err := helmPackage(ctx, client)
if err != nil {
panic(err)
}
err = helmTest(ctx)
if err != nil {
panic(err)
}
err = helmPublish(ctx, hc, chart)
if err != nil {
panic(err)
}
default:
log.Fatalln("invalid command specified")
}
if err != nil {
panic(err)
}
}
func getDaggerClient(ctx context.Context) *dagger.Client {
c, err := dagger.Connect(ctx, dagger.WithLogOutput(os.Stderr))
if err != nil {
panic(err)
}
return c
}
func helmPackage(ctx context.Context, c *dagger.Client) (*dagger.Container, string, error) {
chartDir := c.Host().Directory("./helm/conference-app")
helm := c.Container().From("alpine/helm:3.12.1").
WithMountedDirectory(".", chartDir).
WithExec([]string{"repo", "add", "bitnami", "https://charts.bitnami.com/bitnami"}).
WithExec([]string{"dependency", "build"}).
WithExec([]string{"package", "-u", "."})
chartOut, err := helm.Stdout(ctx)
if err != nil {
return nil, "", err
}
return helm, chartOut, nil
}
func helmTest(ctx context.Context) error {
// run helm test
return nil
}
func helmPublish(ctx context.Context, c *dagger.Container, chart string) error {
chartPackagePath := strings.TrimSpace(strings.Split(chart, ":")[1])
helm := c.WithExec([]string{"registry", "login", "-u", CONTAINER_REGISTRY_USER, CONTAINER_REGISTRY, "--password-stdin"}, dagger.ContainerWithExecOpts{Stdin: CONTAINER_REGISTRY_PASSWORD}).
WithExec([]string{"push", chartPackagePath, fmt.Sprintf("%s%s/%s", "oci://", CONTAINER_REGISTRY, CONTAINER_REGISTRY_USER)})
out, err := helm.Stdout(ctx)
fmt.Sprintln("Publish out: %s ", out)
return err
}
// getEnv returns the value of an environment variable, or a fallback value if it is not set.
func getEnv(key, fallback string) string {
value, exists := os.LookupEnv(key)
if !exists {
value = fallback
}
return value
}