diff --git a/cmd/drone-docker/custom_string_slice.go b/cmd/drone-docker/custom_string_slice.go new file mode 100644 index 0000000..5e43581 --- /dev/null +++ b/cmd/drone-docker/custom_string_slice.go @@ -0,0 +1,33 @@ +package main + +import ( + "strings" +) + +// CustomStringSliceFlag is like a regular StringSlice flag but with +// semicolon as a delimiter +type CustomStringSliceFlag struct { + Value []string +} + +func (f *CustomStringSliceFlag) GetValue() []string { + if f.Value == nil { + return make([]string, 0) + } + return f.Value +} + +func (f *CustomStringSliceFlag) String() string { + if f.Value == nil { + return "" + } + return strings.Join(f.Value, ";") +} + +func (f *CustomStringSliceFlag) Set(v string) error { + for _, s := range strings.Split(v, ";") { + s = strings.TrimSpace(s) + f.Value = append(f.Value, s) + } + return nil +} diff --git a/cmd/drone-docker/main.go b/cmd/drone-docker/main.go index 2e5d649..0d319bb 100644 --- a/cmd/drone-docker/main.go +++ b/cmd/drone-docker/main.go @@ -151,6 +151,17 @@ func main() { Usage: "build args", EnvVar: "PLUGIN_BUILD_ARGS_FROM_ENV", }, + cli.GenericFlag{ + Name: "args-new", + Usage: "build args new", + EnvVar: "PLUGIN_BUILD_ARGS_NEW", + Value: new(CustomStringSliceFlag), + }, + cli.BoolFlag{ + Name: "plugin-multiple-build-agrs", + Usage: "plugin multiple build agrs", + EnvVar: "PLUGIN_MULTIPLE_BUILD_ARGS", + }, cli.BoolFlag{ Name: "quiet", Usage: "quiet docker build", @@ -339,32 +350,34 @@ func run(c *cli.Context) error { CardPath: c.String("drone-card-path"), ArtifactFile: c.String("artifact-file"), Build: docker.Build{ - Remote: c.String("remote.url"), - Name: c.String("commit.sha"), - TempTag: generateTempTag(), - Dockerfile: c.String("dockerfile"), - Context: c.String("context"), - Tags: c.StringSlice("tags"), - Args: c.StringSlice("args"), - ArgsEnv: c.StringSlice("args-from-env"), - Target: c.String("target"), - Squash: c.Bool("squash"), - Pull: c.BoolT("pull-image"), - CacheFrom: c.StringSlice("cache-from"), - Compress: c.Bool("compress"), - Repo: c.String("repo"), - Labels: c.StringSlice("custom-labels"), - LabelSchema: c.StringSlice("label-schema"), - AutoLabel: c.BoolT("auto-label"), - Link: c.String("link"), - NoCache: c.Bool("no-cache"), - Secret: c.String("secret"), - SecretEnvs: c.StringSlice("secrets-from-env"), - SecretFiles: c.StringSlice("secrets-from-file"), - AddHost: c.StringSlice("add-host"), - Quiet: c.Bool("quiet"), - Platform: c.String("platform"), - SSHAgentKey: c.String("ssh-agent-key"), + Remote: c.String("remote.url"), + Name: c.String("commit.sha"), + TempTag: generateTempTag(), + Dockerfile: c.String("dockerfile"), + Context: c.String("context"), + Tags: c.StringSlice("tags"), + Args: c.StringSlice("args"), + ArgsEnv: c.StringSlice("args-from-env"), + ArgsNew: c.Generic("args-new").(*CustomStringSliceFlag).GetValue(), + IsMultipleBuildArgs: c.Bool("plugin-multiple-build-agrs"), + Target: c.String("target"), + Squash: c.Bool("squash"), + Pull: c.BoolT("pull-image"), + CacheFrom: c.StringSlice("cache-from"), + Compress: c.Bool("compress"), + Repo: c.String("repo"), + Labels: c.StringSlice("custom-labels"), + LabelSchema: c.StringSlice("label-schema"), + AutoLabel: c.BoolT("auto-label"), + Link: c.String("link"), + NoCache: c.Bool("no-cache"), + Secret: c.String("secret"), + SecretEnvs: c.StringSlice("secrets-from-env"), + SecretFiles: c.StringSlice("secrets-from-file"), + AddHost: c.StringSlice("add-host"), + Quiet: c.Bool("quiet"), + Platform: c.String("platform"), + SSHAgentKey: c.String("ssh-agent-key"), }, Daemon: docker.Daemon{ Registry: c.String("docker.registry"), diff --git a/docker.go b/docker.go index 9790de9..d7286c1 100644 --- a/docker.go +++ b/docker.go @@ -45,33 +45,35 @@ type ( // Build defines Docker build parameters. Build struct { - Remote string // Git remote URL - Name string // Docker build using default named tag - TempTag string // Temporary tag used during docker build - Dockerfile string // Docker build Dockerfile - Context string // Docker build context - Tags []string // Docker build tags - Args []string // Docker build args - ArgsEnv []string // Docker build args from env - Target string // Docker build target - Squash bool // Docker build squash - Pull bool // Docker build pull - CacheFrom []string // Docker build cache-from - Compress bool // Docker build compress - Repo string // Docker build repository - LabelSchema []string // label-schema Label map - AutoLabel bool // auto-label bool - Labels []string // Label map - Link string // Git repo link - NoCache bool // Docker build no-cache - Secret string // secret keypair - SecretEnvs []string // Docker build secrets with env var as source - SecretFiles []string // Docker build secrets with file as source - AddHost []string // Docker build add-host - Quiet bool // Docker build quiet - Platform string // Docker build platform - SSHAgentKey string // Docker build ssh agent key - SSHKeyPath string // Docker build ssh key path + Remote string // Git remote URL + Name string // Docker build using default named tag + TempTag string // Temporary tag used during docker build + Dockerfile string // Docker build Dockerfile + Context string // Docker build context + Tags []string // Docker build tags + Args []string // Docker build args + ArgsEnv []string // Docker build args from env + ArgsNew []string // docker build args which has comma seperated values + IsMultipleBuildArgs bool // env variable for fall back to old build args + Target string // Docker build target + Squash bool // Docker build squash + Pull bool // Docker build pull + CacheFrom []string // Docker build cache-from + Compress bool // Docker build compress + Repo string // Docker build repository + LabelSchema []string // label-schema Label map + AutoLabel bool // auto-label bool + Labels []string // Label map + Link string // Git repo link + NoCache bool // Docker build no-cache + Secret string // secret keypair + SecretEnvs []string // Docker build secrets with env var as source + SecretFiles []string // Docker build secrets with file as source + AddHost []string // Docker build add-host + Quiet bool // Docker build quiet + Platform string // Docker build platform + SSHAgentKey string // Docker build ssh agent key + SSHKeyPath string // Docker build ssh key path } // Plugin defines the Docker plugin parameters. @@ -413,8 +415,16 @@ func commandBuild(build Build) *exec.Cmd { for _, arg := range build.ArgsEnv { addProxyValue(&build, arg) } - for _, arg := range build.Args { - args = append(args, "--build-arg", arg) + if build.IsMultipleBuildArgs { + for _, arg := range build.ArgsNew { + fmt.Println(arg) + fmt.Println("hehe") + args = append(args, "--build-arg", arg) + } + } else { + for _, arg := range build.Args { + args = append(args, "--build-arg", arg) + } } for _, host := range build.AddHost { args = append(args, "--add-host", host) @@ -519,6 +529,10 @@ func addProxyValue(build *Build, key string) { build.Args = append(build.Args, fmt.Sprintf("%s=%s", key, value)) build.Args = append(build.Args, fmt.Sprintf("%s=%s", strings.ToUpper(key), value)) } + if len(value) > 0 && !hasProxyBuildArgNew(build, key) { + build.ArgsNew = append(build.ArgsNew, fmt.Sprintf("%s=%s", key, value)) + build.ArgsNew = append(build.ArgsNew, fmt.Sprintf("%s=%s", strings.ToUpper(key), value)) + } } // helper function to get a proxy value from the environment. @@ -546,6 +560,17 @@ func hasProxyBuildArg(build *Build, key string) bool { return false } +func hasProxyBuildArgNew(build *Build, key string) bool { + keyUpper := strings.ToUpper(key) + + for _, s := range build.ArgsNew { + if strings.HasPrefix(s, key) || strings.HasPrefix(s, keyUpper) { + return true + } + } + + return false +} // helper function to create the docker tag command. func commandTag(build Build, tag string) *exec.Cmd {