@@ -10,22 +10,94 @@ import (
10
10
"strings"
11
11
12
12
"github.com/dio/sh"
13
+ "helm.sh/helm/v3/pkg/chart"
14
+ "helm.sh/helm/v3/pkg/chartutil"
13
15
)
14
16
15
17
var FORCED = len (os .Getenv ("FORCED" )) > 0
16
18
var GH_TOKEN = os .Getenv ("GH_TOKEN" )
17
19
var GPG_PASSPHRASE = os .Getenv ("GPG_PASSPHRASE" )
18
20
var GPG_TRUSTEE = "[email protected] "
21
+ var ENV_MAP = map [string ]string {
22
+ "GH_TOKEN" : GH_TOKEN ,
23
+ "TZ" : "UTC" ,
24
+ }
19
25
20
26
// PackIstio packs a versioned Istio Helm chart, for example: 1.16.6-tetrate-v0.
21
27
func PackIstio (ctx context.Context ) error {
28
+ // Export keyring.
29
+ ring , pass , err := exportSecretKey (ctx )
30
+ if err != nil {
31
+ return err
32
+ }
33
+
22
34
dir := filepath .Join ("charts" , "istio" )
23
35
versions , err := os .ReadDir (dir )
24
36
if err != nil {
25
37
return err
26
38
}
27
39
for _ , version := range versions {
28
- if err := packVersioned (ctx , version .Name ()); err != nil {
40
+ if err := packVersionedIstio (ctx , version .Name (), ring , pass ); err != nil {
41
+ return err
42
+ }
43
+ }
44
+ return nil
45
+ }
46
+
47
+ func PackAddons (ctx context.Context ) error {
48
+ // Export keyring.
49
+ ring , pass , err := exportSecretKey (ctx )
50
+ if err != nil {
51
+ return err
52
+ }
53
+
54
+ dir := filepath .Join ("charts" , "addons" )
55
+ entries , err := os .ReadDir (dir )
56
+ if err != nil {
57
+ return err
58
+ }
59
+ for _ , entry := range entries {
60
+ if err := packChart (ctx , dir , entry .Name (), ring , pass ); err != nil {
61
+ return err
62
+ }
63
+ }
64
+ return nil
65
+ }
66
+
67
+ func PackDemos (ctx context.Context ) error {
68
+ // Export keyring.
69
+ ring , pass , err := exportSecretKey (ctx )
70
+ if err != nil {
71
+ return err
72
+ }
73
+
74
+ dir := filepath .Join ("charts" , "demos" )
75
+ entries , err := os .ReadDir (dir )
76
+ if err != nil {
77
+ return err
78
+ }
79
+ for _ , entry := range entries {
80
+ if err := packChart (ctx , dir , entry .Name (), ring , pass ); err != nil {
81
+ return err
82
+ }
83
+ }
84
+ return nil
85
+ }
86
+
87
+ func PackSystem (ctx context.Context ) error {
88
+ // Export keyring.
89
+ ring , pass , err := exportSecretKey (ctx )
90
+ if err != nil {
91
+ return err
92
+ }
93
+
94
+ dir := filepath .Join ("charts" , "system" )
95
+ entries , err := os .ReadDir (dir )
96
+ if err != nil {
97
+ return err
98
+ }
99
+ for _ , entry := range entries {
100
+ if err := packChart (ctx , dir , entry .Name (), ring , pass ); err != nil {
29
101
return err
30
102
}
31
103
}
@@ -51,32 +123,70 @@ func Index(ctx context.Context, url string) error {
51
123
if _ , err := os .Stat (publishedIndexYAML ); err == nil {
52
124
args = append (args , "--merge" , publishedIndexYAML )
53
125
}
54
- if err := sh .Run (ctx , "helm" , args ... ); err != nil {
126
+ if err := sh .RunWithV (ctx , ENV_MAP , "helm" , args ... ); err != nil {
55
127
return err
56
128
}
57
129
b , err := os .ReadFile (indexYAML )
58
130
if err != nil {
59
131
return err
60
132
}
61
- sanitized := strings .ReplaceAll (string (b ), "istio-/" , "istio-" )
133
+
134
+ // TODO(dio): Remove this hack. We should call the modified "helm repo index" function.
135
+ sanitized := strings .ReplaceAll (string (b ), "download/1." , "download/istio-1." )
136
+ _ = os .MkdirAll ("gh-pages" , os .ModePerm )
62
137
return os .WriteFile (publishedIndexYAML , []byte (sanitized ), os .ModePerm )
63
138
}
64
139
65
- func packVersioned (ctx context.Context , version string ) error {
66
- // Export keyring.
67
- ring , pass , err := exportSecretKey (ctx )
140
+ func packChart (ctx context.Context , dir , name , ring , pass string ) error {
141
+ charts , err := chartYAMLs (dir , "Chart.yaml" , "*/Chart.yaml" , "*/*/Chart.yaml" , "*/*/*/Chart.yaml" , "*/*/*/*/Chart.yaml" )
68
142
if err != nil {
69
143
return err
70
144
}
145
+ for _ , chart := range charts {
146
+ metadata , err := chartutil .LoadChartfile (filepath .Join (chart ))
147
+ if err != nil {
148
+ return err
149
+ }
150
+
151
+ if err := resolveDeps (ctx , filepath .Dir (chart ), metadata ); err != nil {
152
+ return err
153
+ }
154
+
155
+ tag := metadata .Name + "-" + metadata .Version
156
+
157
+ // If already published, skip it unless FORCED.
158
+ err = sh .RunWithV (ctx , ENV_MAP , "gh" , "release" , "view" , tag , "-R" , "tetratelabs/legacy-charts" )
159
+ released := err == nil
160
+ if released && ! FORCED {
161
+ fmt .Printf ("%s is already published\n " , tag )
162
+ return nil
163
+ }
71
164
72
- e := map [string ]string {
73
- "GH_TOKEN" : GH_TOKEN ,
165
+ dst := filepath .Join ("dist" , metadata .Name + "-" + metadata .Version )
166
+ _ = os .MkdirAll (dst , os .ModePerm )
167
+
168
+ if err := sh .RunWithV (ctx ,
169
+ ENV_MAP ,
170
+ "helm" ,
171
+ "package" ,
172
+ filepath .Dir (chart ),
173
+ "--destination" , dst ,
174
+ "--sign" ,
175
+ "--keyring" , ring ,
176
+ "--key" , GPG_TRUSTEE ,
177
+ "--passphrase-file" , pass ,
178
+ ); err != nil {
179
+ return err
180
+ }
74
181
}
182
+ return nil
183
+ }
75
184
185
+ func packVersionedIstio (ctx context.Context , version , ring , pass string ) error {
76
186
tag := "istio-" + version
77
187
78
188
// If already published, skip it unless FORCED.
79
- err = sh .RunWithV (ctx , e , "gh" , "release" , "view" , tag , "-R" , "tetratelabs/legacy-charts" )
189
+ err : = sh .RunWithV (ctx , ENV_MAP , "gh" , "release" , "view" , tag , "-R" , "tetratelabs/legacy-charts" )
80
190
released := err == nil
81
191
if released && ! FORCED {
82
192
fmt .Printf ("%s is already published\n " , tag )
@@ -92,7 +202,8 @@ func packVersioned(ctx context.Context, version string) error {
92
202
return err
93
203
}
94
204
for _ , chart := range charts {
95
- if err := sh .Run (ctx ,
205
+ if err := sh .RunWithV (ctx ,
206
+ ENV_MAP ,
96
207
"helm" ,
97
208
"package" ,
98
209
filepath .Dir (chart ),
@@ -117,9 +228,9 @@ func packVersioned(ctx context.Context, version string) error {
117
228
}
118
229
119
230
if released {
120
- return sh .RunWithV (ctx , e , "gh" , append ([]string {"release" , "upload" , tag , "--clobber" , "-R" , "tetratelabs/legacy-charts" }, files ... )... )
231
+ return sh .RunWithV (ctx , ENV_MAP , "gh" , append ([]string {"release" , "upload" , tag , "--clobber" , "-R" , "tetratelabs/legacy-charts" }, files ... )... )
121
232
}
122
- return sh .RunWithV (ctx , e , "gh" , append ([]string {"release" , "create" , tag , "-n" , tag , "-t" , tag , "-R" , "tetratelabs/legacy-charts" }, files ... )... )
233
+ return sh .RunWithV (ctx , ENV_MAP , "gh" , append ([]string {"release" , "create" , tag , "-n" , tag , "-t" , tag , "-R" , "tetratelabs/legacy-charts" }, files ... )... )
123
234
}
124
235
125
236
func chartYAMLs (build string , patterns ... string ) ([]string , error ) {
@@ -155,3 +266,18 @@ func exportSecretKey(ctx context.Context) (string, string, error) {
155
266
"--passphrase" , GPG_PASSPHRASE ,
156
267
"--export-secret-key" , GPG_TRUSTEE )
157
268
}
269
+
270
+ func resolveDeps (ctx context.Context , chart string , metadata * chart.Metadata ) error {
271
+ if len (metadata .Dependencies ) == 0 {
272
+ return nil
273
+ }
274
+
275
+ for _ , dep := range metadata .Dependencies {
276
+ if err := sh .RunWithV (ctx , ENV_MAP , "helm" , "repo" , "add" , dep .Name , dep .Repository , "--force-update" ); err != nil {
277
+ return err
278
+ }
279
+ }
280
+
281
+ // Run helm dependency build for that chart. This step also does fetching updates.
282
+ return sh .RunWithV (ctx , ENV_MAP , "helm" , "dependency" , "build" , chart )
283
+ }
0 commit comments