Support helm-secrets v4.0.0 (#360)
Support helm-secret v4.0.0 Signed-off-by: KqLLL <lllkq546449541@gmail.com>
This commit is contained in:
parent
3ff98c02a1
commit
0fbcb07bad
|
|
@ -59,6 +59,9 @@ jobs:
|
||||||
- v3.7.2
|
- v3.7.2
|
||||||
- v3.8.2
|
- v3.8.2
|
||||||
- v3.9.0
|
- v3.9.0
|
||||||
|
plugin-secrets-version:
|
||||||
|
- 3.15.0
|
||||||
|
- 4.0.0
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Cache libraries
|
- name: Cache libraries
|
||||||
|
|
@ -96,6 +99,7 @@ jobs:
|
||||||
uses: medyagh/setup-minikube@master
|
uses: medyagh/setup-minikube@master
|
||||||
- name: Execute integration tests
|
- name: Execute integration tests
|
||||||
env:
|
env:
|
||||||
|
HELM_SECRETS_VERSION: ${{ matrix.plugin-secrets-version }}
|
||||||
HELMFILE_HELM3: 1
|
HELMFILE_HELM3: 1
|
||||||
TERM: xterm
|
TERM: xterm
|
||||||
run: make integration
|
run: make integration
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,8 @@ import (
|
||||||
"github.com/Masterminds/semver/v3"
|
"github.com/Masterminds/semver/v3"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"go.uber.org/zap/zapcore"
|
"go.uber.org/zap/zapcore"
|
||||||
|
"helm.sh/helm/v3/pkg/cli"
|
||||||
|
"helm.sh/helm/v3/pkg/plugin"
|
||||||
|
|
||||||
"github.com/helmfile/helmfile/pkg/envvar"
|
"github.com/helmfile/helmfile/pkg/envvar"
|
||||||
)
|
)
|
||||||
|
|
@ -84,6 +86,20 @@ func getHelmVersion(helmBinary string, runner Runner) (semver.Version, error) {
|
||||||
return parseHelmVersion(string(outBytes))
|
return parseHelmVersion(string(outBytes))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetPluginVersion(name, pluginsDir string) (*semver.Version, error) {
|
||||||
|
plugins, err := plugin.FindPlugins(pluginsDir)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, plugin := range plugins {
|
||||||
|
if plugin.Metadata.Name == name {
|
||||||
|
return semver.NewVersion(plugin.Metadata.Version)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("plugin %s not installed", name)
|
||||||
|
}
|
||||||
|
|
||||||
func redactedURL(chart string) string {
|
func redactedURL(chart string) string {
|
||||||
chartURL, err := url.ParseRequestURI(chart)
|
chartURL, err := url.ParseRequestURI(chart)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -281,7 +297,18 @@ func (helm *execer) DecryptSecret(context HelmContext, name string, flags ...str
|
||||||
helm.logger.Infof("Decrypting secret %v", absPath)
|
helm.logger.Infof("Decrypting secret %v", absPath)
|
||||||
preArgs := context.GetTillerlessArgs(helm)
|
preArgs := context.GetTillerlessArgs(helm)
|
||||||
env := context.getTillerlessEnv()
|
env := context.getTillerlessEnv()
|
||||||
secretBytes, err := helm.exec(append(append(preArgs, "secrets", "view", absPath), flags...), env)
|
settings := cli.New()
|
||||||
|
pluginVersion, err := GetPluginVersion("secrets", settings.PluginsDirectory)
|
||||||
|
if err != nil {
|
||||||
|
secret.err = err
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
secretArg := "view"
|
||||||
|
// helm secret view command. The helm secret decrypt command is a drop-in replacement in 4.0.0 version
|
||||||
|
if pluginVersion.Major() > 3 {
|
||||||
|
secretArg = "decrypt"
|
||||||
|
}
|
||||||
|
secretBytes, err := helm.exec(append(append(preArgs, "secrets", secretArg, absPath), flags...), env)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
secret.err = err
|
secret.err = err
|
||||||
return "", err
|
return "", err
|
||||||
|
|
|
||||||
|
|
@ -353,6 +353,15 @@ exec: helm --kube-context dev dependency build ./chart/foo --verify
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_DecryptSecret(t *testing.T) {
|
func Test_DecryptSecret(t *testing.T) {
|
||||||
|
// Set secrets plugin version to 4.0.0
|
||||||
|
if err := os.Setenv("HELM_PLUGINS", "../../test/plugins/secrets/4.0.0"); err != nil {
|
||||||
|
t.Errorf("failed to set environment HELM_PLUGINS error: %s", err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err := os.Unsetenv("HELM_PLUGINS"); err != nil {
|
||||||
|
t.Errorf("failed to unset environment HELM_PLUGINS error: %s", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
logger := NewLogger(&buffer, "debug")
|
logger := NewLogger(&buffer, "debug")
|
||||||
helm := MockExecer(logger, "dev")
|
helm := MockExecer(logger, "dev")
|
||||||
|
|
@ -375,7 +384,7 @@ func Test_DecryptSecret(t *testing.T) {
|
||||||
|
|
||||||
expected := fmt.Sprintf(`Preparing to decrypt secret %v/secretName
|
expected := fmt.Sprintf(`Preparing to decrypt secret %v/secretName
|
||||||
Decrypting secret %s/secretName
|
Decrypting secret %s/secretName
|
||||||
exec: helm --kube-context dev secrets view %s/secretName
|
exec: helm --kube-context dev secrets decrypt %s/secretName
|
||||||
Decrypted %s/secretName into %s
|
Decrypted %s/secretName into %s
|
||||||
Preparing to decrypt secret %s/secretName
|
Preparing to decrypt secret %s/secretName
|
||||||
Found secret in cache %s/secretName
|
Found secret in cache %s/secretName
|
||||||
|
|
@ -393,6 +402,15 @@ Decrypted %s/secretName into %s
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_DecryptSecretWithGotmpl(t *testing.T) {
|
func Test_DecryptSecretWithGotmpl(t *testing.T) {
|
||||||
|
// Set secrets plugin version to 4.0.0
|
||||||
|
if err := os.Setenv("HELM_PLUGINS", "../../test/plugins/secrets/4.0.0"); err != nil {
|
||||||
|
t.Errorf("failed to set environment HELM_PLUGINS error: %s", err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err := os.Unsetenv("HELM_PLUGINS"); err != nil {
|
||||||
|
t.Errorf("failed to unset environment HELM_PLUGINS error: %s", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
logger := NewLogger(&buffer, "debug")
|
logger := NewLogger(&buffer, "debug")
|
||||||
helm := MockExecer(logger, "dev")
|
helm := MockExecer(logger, "dev")
|
||||||
|
|
@ -414,7 +432,7 @@ func Test_DecryptSecretWithGotmpl(t *testing.T) {
|
||||||
|
|
||||||
expected := fmt.Sprintf(`Preparing to decrypt secret %v/secretName.yaml.gotmpl
|
expected := fmt.Sprintf(`Preparing to decrypt secret %v/secretName.yaml.gotmpl
|
||||||
Decrypting secret %s/secretName.yaml.gotmpl
|
Decrypting secret %s/secretName.yaml.gotmpl
|
||||||
exec: helm --kube-context dev secrets view %s/secretName.yaml.gotmpl
|
exec: helm --kube-context dev secrets decrypt %s/secretName.yaml.gotmpl
|
||||||
Decrypted %s/secretName.yaml.gotmpl into %s
|
Decrypted %s/secretName.yaml.gotmpl into %s
|
||||||
`, cwd, cwd, cwd, cwd, tmpFilePath)
|
`, cwd, cwd, cwd, cwd, tmpFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -897,6 +915,29 @@ func Test_IsHelm3(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_GetPluginVersion(t *testing.T) {
|
||||||
|
v3ExpectedVersion := "3.15.0"
|
||||||
|
v4ExpectedVersion := "4.0.0"
|
||||||
|
v3PluginDirPath := "../../test/plugins/secrets/3.15.0"
|
||||||
|
v4PluginDirPath := "../../test/plugins/secrets/4.0.0"
|
||||||
|
|
||||||
|
v3SecretPluginVersion, err := GetPluginVersion("secrets", v3PluginDirPath)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf(err.Error())
|
||||||
|
}
|
||||||
|
if v3SecretPluginVersion.String() != v3ExpectedVersion {
|
||||||
|
t.Errorf("secrets v3 plugin version is %v, expected %v", v3SecretPluginVersion.String(), v3ExpectedVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
v4SecretPluginVersion, err := GetPluginVersion("secrets", v4PluginDirPath)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf(err.Error())
|
||||||
|
}
|
||||||
|
if v4SecretPluginVersion.String() != v4ExpectedVersion {
|
||||||
|
t.Errorf("secrets v4 plugin version is %v, expected %v", v4SecretPluginVersion.String(), v4ExpectedVersion)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func Test_GetVersion(t *testing.T) {
|
func Test_GetVersion(t *testing.T) {
|
||||||
helm2Runner := mockRunner{output: []byte("Client: v2.16.1+ge13bc94\n")}
|
helm2Runner := mockRunner{output: []byte("Client: v2.16.1+ge13bc94\n")}
|
||||||
helm := New("helm", NewLogger(os.Stdout, "info"), "dev", &helm2Runner)
|
helm := New("helm", NewLogger(os.Stdout, "info"), "dev", &helm2Runner)
|
||||||
|
|
|
||||||
|
|
@ -25,8 +25,9 @@ export HELM_DATA_HOME="${helm_dir}/data"
|
||||||
export HELM_HOME="${HELM_DATA_HOME}"
|
export HELM_HOME="${HELM_DATA_HOME}"
|
||||||
export HELM_PLUGINS="${HELM_DATA_HOME}/plugins"
|
export HELM_PLUGINS="${HELM_DATA_HOME}/plugins"
|
||||||
export HELM_CONFIG_HOME="${helm_dir}/config"
|
export HELM_CONFIG_HOME="${helm_dir}/config"
|
||||||
HELM_SECRETS_VERSION=3.5.0
|
|
||||||
HELM_DIFF_VERSION=3.3.1
|
HELM_DIFF_VERSION=3.3.1
|
||||||
|
HELM_SECRETS_DEFAULT_VERSION=3.15.0
|
||||||
|
HELM_SECRETS_VERSION="${HELM_SECRETS_VERSION:-$HELM_SECRETS_DEFAULT_VERSION}"
|
||||||
export GNUPGHOME="${PWD}/${dir}/.gnupg"
|
export GNUPGHOME="${PWD}/${dir}/.gnupg"
|
||||||
export SOPS_PGP_FP="B2D6D7BBEC03B2E66571C8C00AD18E16CFDEF700"
|
export SOPS_PGP_FP="B2D6D7BBEC03B2E66571C8C00AD18E16CFDEF700"
|
||||||
|
|
||||||
|
|
@ -194,7 +195,7 @@ if [[ helm_major_version -eq 3 ]]; then
|
||||||
test_start "secretssops.2 - should succeed with secrets plugin"
|
test_start "secretssops.2 - should succeed with secrets plugin"
|
||||||
|
|
||||||
info "Ensure helm-secrets is installed"
|
info "Ensure helm-secrets is installed"
|
||||||
${helm} plugin install https://github.com/jkroepke/helm-secrets --version v3.5.0
|
${helm} plugin install https://github.com/jkroepke/helm-secrets --version v${HELM_SECRETS_VERSION}
|
||||||
|
|
||||||
info "Ensure helmfile succeed when helm-secrets is installed"
|
info "Ensure helmfile succeed when helm-secrets is installed"
|
||||||
${helmfile} -f ${dir}/secretssops.yaml -e direct build || fail "\"helmfile build\" shouldn't fail"
|
${helmfile} -f ${dir}/secretssops.yaml -e direct build || fail "\"helmfile build\" shouldn't fail"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
name: "secrets"
|
||||||
|
version: "3.15.0"
|
||||||
|
usage: "Secrets encryption in Helm for Git storing"
|
||||||
|
description: |-
|
||||||
|
This plugin provides secrets values encryption for Helm charts secure storing
|
||||||
|
useTunnel: false
|
||||||
|
command: "$HELM_PLUGIN_DIR/scripts/run.sh"
|
||||||
|
platformCommand:
|
||||||
|
- os: windows
|
||||||
|
command: "cmd /c $HELM_PLUGIN_DIR\\scripts\\wrapper\\sh.cmd $HELM_PLUGIN_DIR\\scripts\\run.sh"
|
||||||
|
|
||||||
|
downloaders:
|
||||||
|
- command: "scripts/run.sh downloader"
|
||||||
|
protocols:
|
||||||
|
- "sops"
|
||||||
|
- "secret"
|
||||||
|
- "secrets"
|
||||||
|
- "secrets+gpg-import"
|
||||||
|
- "secrets+gpg-import-kubernetes"
|
||||||
|
- "secrets+age-import"
|
||||||
|
- "secrets+age-import-kubernetes"
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
name: "secrets"
|
||||||
|
version: "4.0.0"
|
||||||
|
usage: "Secrets encryption in Helm for Git storing"
|
||||||
|
description: |-
|
||||||
|
This plugin provides secrets values encryption for Helm charts secure storing
|
||||||
|
useTunnel: false
|
||||||
|
command: "$HELM_PLUGIN_DIR/scripts/run.sh"
|
||||||
|
platformCommand:
|
||||||
|
- os: windows
|
||||||
|
command: "cmd /c $HELM_PLUGIN_DIR\\scripts\\wrapper\\sh.cmd $HELM_PLUGIN_DIR\\scripts\\run.sh"
|
||||||
|
|
||||||
|
downloaders:
|
||||||
|
- command: "scripts/run.sh downloader"
|
||||||
|
protocols:
|
||||||
|
- "secrets"
|
||||||
|
- "secrets+gpg-import"
|
||||||
|
- "secrets+gpg-import-kubernetes"
|
||||||
|
- "secrets+age-import"
|
||||||
|
- "secrets+age-import-kubernetes"
|
||||||
Loading…
Reference in New Issue