diff --git a/README.md b/README.md index fd47bde..6ba82e6 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ docker build \ ## Plugin step usage -Provide uses, with & env of github action to use in plugin step settings. +Provide uses, with & env of github action to use in plugin step settings. Provide GITHUB_TOKEN as environment variable if it is required for an action. ```console steps: diff --git a/plugin.go b/plugin.go index d8c691e..7a5aaa4 100644 --- a/plugin.go +++ b/plugin.go @@ -11,9 +11,13 @@ import ( ) const ( - workflowFile = "/tmp/workflow.yml" - webhookFile = "/tmp/webhook" envFile = "/tmp/action.env" + secretFile = "/tmp/action.secrets" + workflowFile = "/tmp/workflow.yml" +) + +var ( + secrets = []string{"GITHUB_TOKEN"} ) type ( @@ -42,11 +46,19 @@ func (p Plugin) Exec() error { return err } + if err := utils.CreateEnvAndSecretFile(envFile, secretFile, secrets); err != nil { + return err + } + cmdArgs := []string{ "-W", workflowFile, "-P", fmt.Sprintf("ubuntu-latest=%s", p.Action.Image), + "--secret-file", + secretFile, + "--env-file", + envFile, "-b", "--detect-event", } diff --git a/utils/env.go b/utils/env.go new file mode 100644 index 0000000..7a6a89d --- /dev/null +++ b/utils/env.go @@ -0,0 +1,55 @@ +package utils + +import ( + "os" + "strings" + + "github.com/joho/godotenv" + "github.com/pkg/errors" +) + +func CreateEnvAndSecretFile(envFile, secretFile string, secrets []string) error { + envVars := getEnvVars() + + actionEnvVars := make(map[string]string) + for key, val := range envVars { + if !strings.HasPrefix(key, "PLUGIN_") && !Exists(secrets, key) { + actionEnvVars[key] = val + } + } + + secretEnvVars := make(map[string]string) + for _, secretName := range secrets { + if os.Getenv(secretName) != "" { + secretEnvVars[secretName] = os.Getenv(secretName) + } + } + + if err := godotenv.Write(actionEnvVars, envFile); err != nil { + return errors.Wrap(err, "failed to write environment variables file") + } + if err := godotenv.Write(secretEnvVars, secretFile); err != nil { + return errors.Wrap(err, "failed to write secret variables file") + } + return nil +} + +// Return environment variables set in a map format +func getEnvVars() map[string]string { + m := make(map[string]string) + for _, e := range os.Environ() { + if i := strings.Index(e, "="); i >= 0 { + m[e[:i]] = e[i+1:] + } + } + return m +} + +func Exists(slice []string, val string) bool { + for _, item := range slice { + if item == val { + return true + } + } + return false +}