diff --git a/cmd/kaniko-ecr/custom_string_slice.go b/cmd/kaniko-ecr/custom_string_slice.go new file mode 100644 index 0000000..5e43581 --- /dev/null +++ b/cmd/kaniko-ecr/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/kaniko-ecr/main.go b/cmd/kaniko-ecr/main.go index 110cb92..3a3d633 100644 --- a/cmd/kaniko-ecr/main.go +++ b/cmd/kaniko-ecr/main.go @@ -125,6 +125,17 @@ func main() { Usage: "build args", EnvVar: "PLUGIN_BUILD_ARGS", }, + 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.StringFlag{ Name: "target", Usage: "build target", @@ -464,6 +475,8 @@ func run(c *cli.Context) error { AutoTagSuffix: c.String("auto-tag-suffix"), ExpandTag: c.Bool("expand-tag"), Args: c.StringSlice("args"), + ArgsNew: c.Generic("args-new").(*CustomStringSliceFlag).GetValue(), + IsMultipleBuildArgs: c.Bool("plugin-multiple-build-agrs"), Target: c.String("target"), Repo: fmt.Sprintf("%s/%s", c.String("registry"), c.String("repo")), Mirrors: c.StringSlice("registry-mirrors"), diff --git a/kaniko.go b/kaniko.go index 5437277..412a475 100644 --- a/kaniko.go +++ b/kaniko.go @@ -16,30 +16,32 @@ import ( type ( // Build defines Docker build parameters. Build struct { - DroneCommitRef string // Drone git commit reference - DroneRepoBranch string // Drone repo branch - Dockerfile string // Docker build Dockerfile - Context string // Docker build context - Tags []string // Docker build tags - AutoTag bool // Set this to auto detect tags from git commits and semver-tagged labels - AutoTagSuffix string // Suffix to append to the auto detect tags - ExpandTag bool // Set this to expand the `Tags` into semver-tagged labels - Args []string // Docker build args - Target string // Docker build target - Repo string // Docker build repository - Mirrors []string // Docker repository mirrors - Labels []string // Label map - SkipTlsVerify bool // Docker skip tls certificate verify for registry - SnapshotMode string // Kaniko snapshot mode - EnableCache bool // Whether to enable kaniko cache - CacheRepo string // Remote repository that will be used to store cached layers - CacheTTL int // Cache timeout in hours - DigestFile string // Digest file location - NoPush bool // Set this flag if you only want to build the image, without pushing to a registry - Verbosity string // Log level - Platform string // Allows to build with another default platform than the host, similarly to docker build --platform - SkipUnusedStages bool // Build only used stages - TarPath string // Set this flag to save the image as a tarball at path + DroneCommitRef string // Drone git commit reference + DroneRepoBranch string // Drone repo branch + Dockerfile string // Docker build Dockerfile + Context string // Docker build context + Tags []string // Docker build tags + AutoTag bool // Set this to auto detect tags from git commits and semver-tagged labels + AutoTagSuffix string // Suffix to append to the auto detect tags + ExpandTag bool // Set this to expand the `Tags` into semver-tagged labels + Args []string // Docker build args + ArgsNew []string // docker build args with comma seperated values + IsMultipleBuildArgs bool // env variable for fallback for docker build args + Target string // Docker build target + Repo string // Docker build repository + Mirrors []string // Docker repository mirrors + Labels []string // Label map + SkipTlsVerify bool // Docker skip tls certificate verify for registry + SnapshotMode string // Kaniko snapshot mode + EnableCache bool // Whether to enable kaniko cache + CacheRepo string // Remote repository that will be used to store cached layers + CacheTTL int // Cache timeout in hours + DigestFile string // Digest file location + NoPush bool // Set this flag if you only want to build the image, without pushing to a registry + Verbosity string // Log level + Platform string // Allows to build with another default platform than the host, similarly to docker build --platform + SkipUnusedStages bool // Build only used stages + TarPath string // Set this flag to save the image as a tarball at path Cache bool // Enable or disable caching during the build process. CacheDir string // Directory to store cached layers. @@ -202,8 +204,14 @@ func (p Plugin) Exec() error { } // Set the build arguments - for _, arg := range p.Build.Args { - cmdArgs = append(cmdArgs, fmt.Sprintf("--build-arg=%s", arg)) + if p.Build.IsMultipleBuildArgs { + for _, arg := range p.Build.ArgsNew { + cmdArgs = append(cmdArgs, "--build-arg", arg) + } + } else { + for _, arg := range p.Build.Args { + cmdArgs = append(cmdArgs, "--build-arg", arg) + } } // Set the labels for _, label := range p.Build.Labels {