Skip to content

Commit 5290e33

Browse files
committed
feat(bundles): support custom secret values files when publishing bundle
werf bundle publish --secret-values .helm/custom-secret-values.yaml — will merge .helm/secret-values.yaml with .helm/custom-values.yaml and embed resulting secret-values.yaml into the bundle. Signed-off-by: Timofey Kirillov <timofey.kirillov@flant.com>
1 parent 18e958d commit 5290e33

File tree

10 files changed

+174
-57
lines changed

10 files changed

+174
-57
lines changed

cmd/werf/bundle/export/export.go

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"helm.sh/helm/v3/pkg/chart"
1212
"helm.sh/helm/v3/pkg/chart/loader"
1313
"helm.sh/helm/v3/pkg/cli/values"
14-
"helm.sh/helm/v3/pkg/getter"
1514

1615
"github.com/werf/logboek"
1716
"github.com/werf/werf/cmd/werf/common"
@@ -367,22 +366,14 @@ func runExport(ctx context.Context, imagesToProcess build.ImagesToProcess) error
367366
SubchartExtenderFactoryFunc: func() chart.ChartExtender { return chart_extender.NewWerfSubchart() },
368367
}
369368

370-
valueOpts := &values.Options{
369+
chartVersion := fmt.Sprintf("0.0.0-%d", time.Now().Unix())
370+
371+
if _, err := wc.CreateNewBundle(ctx, cmdData.Destination, chartVersion, &values.Options{
371372
ValueFiles: common.GetValues(&commonCmdData),
372373
StringValues: common.GetSetString(&commonCmdData),
373374
Values: common.GetSet(&commonCmdData),
374375
FileValues: common.GetSetFile(&commonCmdData),
375-
}
376-
377-
chartVersion := fmt.Sprintf("0.0.0-%d", time.Now().Unix())
378-
379-
p := getter.All(helm_v3.Settings)
380-
vals, err := valueOpts.MergeValues(p, wc)
381-
if err != nil {
382-
return err
383-
}
384-
385-
if _, err := wc.CreateNewBundle(ctx, cmdData.Destination, chartVersion, vals); err != nil {
376+
}); err != nil {
386377
return fmt.Errorf("unable to create bundle: %w", err)
387378
}
388379

cmd/werf/bundle/publish/publish.go

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"helm.sh/helm/v3/pkg/chart"
1414
"helm.sh/helm/v3/pkg/chart/loader"
1515
"helm.sh/helm/v3/pkg/cli/values"
16-
"helm.sh/helm/v3/pkg/getter"
1716

1817
"github.com/werf/logboek"
1918
"github.com/werf/werf/cmd/werf/common"
@@ -23,6 +22,7 @@ import (
2322
"github.com/werf/werf/pkg/deploy/helm/chart_extender"
2423
"github.com/werf/werf/pkg/deploy/helm/chart_extender/helpers"
2524
"github.com/werf/werf/pkg/deploy/helm/command_helpers"
25+
"github.com/werf/werf/pkg/deploy/secrets_manager"
2626
"github.com/werf/werf/pkg/git_repo"
2727
"github.com/werf/werf/pkg/git_repo/gitdata"
2828
"github.com/werf/werf/pkg/image"
@@ -111,8 +111,11 @@ func NewCmd(ctx context.Context) *cobra.Command {
111111
common.SetupSetString(&commonCmdData, cmd)
112112
common.SetupSetFile(&commonCmdData, cmd)
113113
common.SetupValues(&commonCmdData, cmd)
114+
common.SetupSecretValues(&commonCmdData, cmd)
115+
common.SetupIgnoreSecretKey(&commonCmdData, cmd)
114116

115117
commonCmdData.SetupDisableDefaultValues(cmd)
118+
commonCmdData.SetupDisableDefaultSecretValues(cmd)
116119
commonCmdData.SetupSkipDependenciesRepoRefresh(cmd)
117120

118121
common.SetupSaveBuildReport(&commonCmdData, cmd)
@@ -334,13 +337,23 @@ func runPublish(ctx context.Context, imagesToProcess build.ImagesToProcess) erro
334337
return err
335338
}
336339

337-
wc := chart_extender.NewWerfChart(ctx, giterminismManager, nil, chartDir, helm_v3.Settings, helmRegistryClient, chart_extender.WerfChartOptions{
340+
secretsManager := secrets_manager.NewSecretsManager(secrets_manager.SecretsManagerOptions{
341+
DisableSecretsDecryption: *commonCmdData.IgnoreSecretKey,
342+
})
343+
344+
// FIXME(1.3): compatibility mode with older 1.2 versions, which do not require WERF_SECRET_KEY in the 'werf bundle publish' command
345+
if err := secretsManager.AllowMissedSecretKeyMode(giterminismManager.ProjectDir()); err != nil {
346+
return err
347+
}
348+
349+
wc := chart_extender.NewWerfChart(ctx, giterminismManager, secretsManager, chartDir, helm_v3.Settings, helmRegistryClient, chart_extender.WerfChartOptions{
338350
BuildChartDependenciesOpts: command_helpers.BuildChartDependenciesOptions{SkipUpdate: *commonCmdData.SkipDependenciesRepoRefresh},
351+
SecretValueFiles: common.GetSecretValues(&commonCmdData),
339352
ExtraAnnotations: userExtraAnnotations,
340353
ExtraLabels: userExtraLabels,
341354
IgnoreInvalidAnnotationsAndLabels: true,
342355
DisableDefaultValues: *commonCmdData.DisableDefaultValues,
343-
DisableDefaultSecretValues: true,
356+
DisableDefaultSecretValues: *commonCmdData.DisableDefaultSecretValues,
344357
})
345358

346359
if err := wc.SetEnv(*commonCmdData.Environment); err != nil {
@@ -377,13 +390,6 @@ func runPublish(ctx context.Context, imagesToProcess build.ImagesToProcess) erro
377390
SubchartExtenderFactoryFunc: func() chart.ChartExtender { return chart_extender.NewWerfSubchart() },
378391
}
379392

380-
valueOpts := &values.Options{
381-
ValueFiles: *commonCmdData.Values,
382-
StringValues: *commonCmdData.SetString,
383-
Values: *commonCmdData.Set,
384-
FileValues: *commonCmdData.SetFile,
385-
}
386-
387393
sv, err := bundles.BundleTagToChartVersion(ctx, cmdData.Tag, time.Now())
388394
if err != nil {
389395
return fmt.Errorf("unable to set chart version from bundle tag %q: %w", cmdData.Tag, err)
@@ -393,13 +399,12 @@ func runPublish(ctx context.Context, imagesToProcess build.ImagesToProcess) erro
393399
bundleTmpDir := filepath.Join(werf.GetServiceDir(), "tmp", "bundles", uuid.NewV4().String())
394400
defer os.RemoveAll(bundleTmpDir)
395401

396-
p := getter.All(helm_v3.Settings)
397-
vals, err := valueOpts.MergeValues(p, wc)
398-
if err != nil {
399-
return err
400-
}
401-
402-
bundle, err := wc.CreateNewBundle(ctx, bundleTmpDir, chartVersion, vals)
402+
bundle, err := wc.CreateNewBundle(ctx, bundleTmpDir, chartVersion, &values.Options{
403+
ValueFiles: *commonCmdData.Values,
404+
StringValues: *commonCmdData.SetString,
405+
Values: *commonCmdData.Set,
406+
FileValues: *commonCmdData.SetFile,
407+
})
403408
if err != nil {
404409
return fmt.Errorf("unable to create bundle: %w", err)
405410
}

pkg/deploy/helm/chart_extender/bundle.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,9 @@ func (bundle *Bundle) MakeValues(inputVals map[string]interface{}) (map[string]i
146146
chartutil.CoalesceTables(vals, bundle.ServiceValues)
147147

148148
if debugSecretValues() {
149-
debugPrintValues(bundle.ChartExtenderContext, "secret", bundle.SecretsRuntimeData.DecodedSecretValues)
149+
debugPrintValues(bundle.ChartExtenderContext, "secret", bundle.SecretsRuntimeData.DecryptedSecretValues)
150150
}
151-
chartutil.CoalesceTables(vals, bundle.SecretsRuntimeData.DecodedSecretValues)
151+
chartutil.CoalesceTables(vals, bundle.SecretsRuntimeData.DecryptedSecretValues)
152152

153153
debugPrintValues(bundle.ChartExtenderContext, "input", inputVals)
154154
chartutil.CoalesceTables(vals, inputVals)

pkg/deploy/helm/chart_extender/helpers/common_template_funcs.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ func SetupWerfSecretFile(secretsRuntimeData *secrets.SecretsRuntimeData, funcMap
3737
return "", fmt.Errorf("expected relative secret file path, given path %v", secretRelativePath)
3838
}
3939

40-
decodedData, ok := secretsRuntimeData.DecodedSecretFilesData[secretRelativePath]
40+
decodedData, ok := secretsRuntimeData.DecryptedSecretFilesData[secretRelativePath]
4141

4242
if !ok {
4343
var secretFiles []string
44-
for key := range secretsRuntimeData.DecodedSecretFilesData {
44+
for key := range secretsRuntimeData.DecryptedSecretFilesData {
4545
secretFiles = append(secretFiles, key)
4646
}
4747

pkg/deploy/helm/chart_extender/helpers/secrets/secrets_runtime_data.go

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io/ioutil"
77

88
"helm.sh/helm/v3/pkg/chart"
9+
"sigs.k8s.io/yaml"
910

1011
"github.com/werf/werf/pkg/deploy/secrets_manager"
1112
"github.com/werf/werf/pkg/giterminism_manager"
@@ -14,14 +15,14 @@ import (
1415
)
1516

1617
type SecretsRuntimeData struct {
17-
DecodedSecretValues map[string]interface{}
18-
DecodedSecretFilesData map[string]string
19-
SecretValuesToMask []string
18+
DecryptedSecretValues map[string]interface{}
19+
DecryptedSecretFilesData map[string]string
20+
SecretValuesToMask []string
2021
}
2122

2223
func NewSecretsRuntimeData() *SecretsRuntimeData {
2324
return &SecretsRuntimeData{
24-
DecodedSecretFilesData: make(map[string]string),
25+
DecryptedSecretFilesData: make(map[string]string),
2526
}
2627
}
2728

@@ -51,14 +52,12 @@ func (secretsRuntimeData *SecretsRuntimeData) DecodeAndLoadSecrets(ctx context.C
5152
if err != nil {
5253
return fmt.Errorf("unable to read custom secret values file %q from local filesystem: %w", customSecretValuesFileName, err)
5354
}
54-
5555
file.Data = data
5656
} else {
5757
data, err := opts.GiterminismManager.FileReader().ReadChartFile(ctx, customSecretValuesFileName)
5858
if err != nil {
5959
return fmt.Errorf("unable to read custom secret values file %q: %w", customSecretValuesFileName, err)
6060
}
61-
6261
file.Data = data
6362
}
6463

@@ -68,7 +67,7 @@ func (secretsRuntimeData *SecretsRuntimeData) DecodeAndLoadSecrets(ctx context.C
6867
var encoder *secret.YamlEncoder
6968
if len(secretDirFiles)+len(loadedSecretValuesFiles) > 0 {
7069
if enc, err := secretsManager.GetYamlEncoder(ctx, secretsWorkingDir); err != nil {
71-
return err
70+
return fmt.Errorf("error getting secrets yaml encoder: %w", err)
7271
} else {
7372
encoder = enc
7473
}
@@ -78,8 +77,8 @@ func (secretsRuntimeData *SecretsRuntimeData) DecodeAndLoadSecrets(ctx context.C
7877
if data, err := LoadChartSecretDirFilesData(chartDir, secretDirFiles, encoder); err != nil {
7978
return fmt.Errorf("error loading secret files data: %w", err)
8079
} else {
81-
secretsRuntimeData.DecodedSecretFilesData = data
82-
for _, fileData := range secretsRuntimeData.DecodedSecretFilesData {
80+
secretsRuntimeData.DecryptedSecretFilesData = data
81+
for _, fileData := range secretsRuntimeData.DecryptedSecretFilesData {
8382
secretsRuntimeData.SecretValuesToMask = append(secretsRuntimeData.SecretValuesToMask, fileData)
8483
}
8584
}
@@ -89,10 +88,42 @@ func (secretsRuntimeData *SecretsRuntimeData) DecodeAndLoadSecrets(ctx context.C
8988
if values, err := LoadChartSecretValueFiles(chartDir, loadedSecretValuesFiles, encoder); err != nil {
9089
return fmt.Errorf("error loading secret value files: %w", err)
9190
} else {
92-
secretsRuntimeData.DecodedSecretValues = values
91+
secretsRuntimeData.DecryptedSecretValues = values
9392
secretsRuntimeData.SecretValuesToMask = append(secretsRuntimeData.SecretValuesToMask, secretvalues.ExtractSecretValuesFromMap(values)...)
9493
}
9594
}
9695

9796
return nil
9897
}
98+
99+
func (secretsRuntimeData *SecretsRuntimeData) GetEncodedSecretValues(ctx context.Context, secretsManager *secrets_manager.SecretsManager, secretsWorkingDir string) (map[string]interface{}, error) {
100+
if len(secretsRuntimeData.DecryptedSecretValues) == 0 {
101+
return nil, nil
102+
}
103+
104+
// FIXME: secrets encoder should receive interface{} raw data instead of []byte yaml data
105+
106+
var encoder *secret.YamlEncoder
107+
if enc, err := secretsManager.GetYamlEncoder(ctx, secretsWorkingDir); err != nil {
108+
return nil, fmt.Errorf("error getting secrets yaml encoder: %w", err)
109+
} else {
110+
encoder = enc
111+
}
112+
113+
decryptedSecretsData, err := yaml.Marshal(secretsRuntimeData.DecryptedSecretValues)
114+
if err != nil {
115+
return nil, fmt.Errorf("unable to marshal decrypted secrets yaml: %w", err)
116+
}
117+
118+
encryptedSecretsData, err := encoder.EncryptYamlData(decryptedSecretsData)
119+
if err != nil {
120+
return nil, fmt.Errorf("unable to encrypt secrets data: %w", err)
121+
}
122+
123+
var encryptedData map[string]interface{}
124+
if err := yaml.Unmarshal(encryptedSecretsData, &encryptedData); err != nil {
125+
return nil, fmt.Errorf("unable to unmarshal encrypted secrets data: %w", err)
126+
}
127+
128+
return encryptedData, nil
129+
}

0 commit comments

Comments
 (0)