Skip to content

Commit 829562c

Browse files
authored
Merge pull request #52 from chmeliik/buildah-buildargs
Add --build-args and --build-args-file arguments
2 parents 5337ad8 + 5d25dfc commit 829562c

4 files changed

Lines changed: 143 additions & 0 deletions

File tree

integration_tests/build_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ type BuildParams struct {
3030
Push bool
3131
SecretDirs []string
3232
WorkdirMount string
33+
BuildArgs []string
34+
BuildArgsFile string
3335
ExtraArgs []string
3436
}
3537

@@ -147,6 +149,13 @@ func runBuildWithOutput(container *TestRunnerContainer, buildParams BuildParams)
147149
if buildParams.WorkdirMount != "" {
148150
args = append(args, "--workdir-mount", buildParams.WorkdirMount)
149151
}
152+
if len(buildParams.BuildArgs) > 0 {
153+
args = append(args, "--build-args")
154+
args = append(args, buildParams.BuildArgs...)
155+
}
156+
if buildParams.BuildArgsFile != "" {
157+
args = append(args, "--build-args-file", buildParams.BuildArgsFile)
158+
}
150159
// Add separator and extra args if provided
151160
if len(buildParams.ExtraArgs) > 0 {
152161
args = append(args, "--")
@@ -433,4 +442,56 @@ RUN --mount=type=bind,from=builder,src=.,target=/var/tmp \
433442
err = container.ExecuteCommand("buildah", "images", outputRef)
434443
Expect(err).ToNot(HaveOccurred(), fmt.Sprintf("Image %s should exist in local buildah storage", outputRef))
435444
})
445+
446+
t.Run("WithBuildArgs", func(t *testing.T) {
447+
contextDir := setupTestContext(t)
448+
449+
writeContainerfile(contextDir, `
450+
FROM scratch
451+
452+
ARG NAME
453+
ARG VERSION
454+
ARG AUTHOR
455+
ARG VENDOR
456+
457+
LABEL name=$NAME
458+
LABEL version=$VERSION
459+
LABEL author=$AUTHOR
460+
LABEL vendor=$VENDOR
461+
462+
LABEL test.label="build-args-test"
463+
`)
464+
465+
testutil.WriteFileTree(t, contextDir, map[string]string{
466+
"build-args-file": "AUTHOR=John Doe\nVENDOR=konflux-ci.dev",
467+
})
468+
469+
outputRef := "localhost/test-image-build-args:" + GenerateUniqueTag(t)
470+
471+
buildParams := BuildParams{
472+
Context: contextDir,
473+
OutputRef: outputRef,
474+
Push: false,
475+
BuildArgs: []string{"NAME=foo", "VERSION=1.2.3"},
476+
BuildArgsFile: "/workspace/build-args-file",
477+
}
478+
479+
container := setupBuildContainerWithCleanup(t, buildParams, nil)
480+
481+
err := runBuild(container, buildParams)
482+
Expect(err).ToNot(HaveOccurred())
483+
484+
stdout, _, err := container.ExecuteCommandWithOutput(
485+
"buildah", "inspect", "--format", `{{ range $k, $v := .OCIv1.Config.Labels }}{{ printf "%s=%s\n" $k $v }}{{ end }}`, outputRef,
486+
)
487+
Expect(err).ToNot(HaveOccurred())
488+
489+
labelLines := strings.Split(strings.TrimSpace(stdout), "\n")
490+
Expect(labelLines).To(ContainElements(
491+
"name=foo",
492+
"version=1.2.3",
493+
"author=John Doe",
494+
"vendor=konflux-ci.dev",
495+
))
496+
})
436497
}

pkg/cliwrappers/buildah.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ type BuildahBuildArgs struct {
4343
OutputRef string
4444
Secrets []BuildahSecret
4545
Volumes []BuildahVolume
46+
BuildArgs []string
47+
BuildArgsFile string
4648
ExtraArgs []string
4749
}
4850

@@ -119,6 +121,13 @@ func (args *BuildahBuildArgs) MakePathsAbsolute(baseDir string) error {
119121
}
120122
}
121123

124+
if args.BuildArgsFile != "" {
125+
err = ensureAbsolute(&args.BuildArgsFile)
126+
if err != nil {
127+
return err
128+
}
129+
}
130+
122131
return nil
123132
}
124133

@@ -142,6 +151,14 @@ func (b *BuildahCli) Build(args *BuildahBuildArgs) error {
142151
buildahArgs = append(buildahArgs, "--volume="+volumeArg)
143152
}
144153

154+
for _, buildArg := range args.BuildArgs {
155+
buildahArgs = append(buildahArgs, "--build-arg="+buildArg)
156+
}
157+
158+
if args.BuildArgsFile != "" {
159+
buildahArgs = append(buildahArgs, "--build-arg-file="+args.BuildArgsFile)
160+
}
161+
145162
// Append extra arguments before the context directory
146163
buildahArgs = append(buildahArgs, args.ExtraArgs...)
147164
// Context directory must be the last argument

pkg/cliwrappers/buildah_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,31 @@ func TestBuildahCli_Build(t *testing.T) {
131131
g.Expect(capturedArgs).To(ContainElement("--volume=/host/dir2:/container/dir2:ro"))
132132
})
133133

134+
t.Run("should turn BuildArgs(File) into --build-arg(-file) params", func(t *testing.T) {
135+
buildahCli, executor := setupBuildahCli()
136+
var capturedArgs []string
137+
executor.executeWithOutput = func(command string, args ...string) (string, string, int, error) {
138+
g.Expect(command).To(Equal("buildah"))
139+
capturedArgs = args
140+
return "", "", 0, nil
141+
}
142+
143+
buildArgs := &cliwrappers.BuildahBuildArgs{
144+
Containerfile: containerfile,
145+
ContextDir: contextDir,
146+
OutputRef: outputRef,
147+
BuildArgs: []string{"VERSION=1.0.0", "BUILD_DATE=2024-01-01"},
148+
BuildArgsFile: "/path/to/build-args-file",
149+
}
150+
151+
err := buildahCli.Build(buildArgs)
152+
g.Expect(err).ToNot(HaveOccurred())
153+
154+
g.Expect(capturedArgs).To(ContainElement("--build-arg=VERSION=1.0.0"))
155+
g.Expect(capturedArgs).To(ContainElement("--build-arg=BUILD_DATE=2024-01-01"))
156+
g.Expect(capturedArgs).To(ContainElement("--build-arg-file=/path/to/build-args-file"))
157+
})
158+
134159
t.Run("should append extra args before context directory", func(t *testing.T) {
135160
buildahCli, executor := setupBuildahCli()
136161
var capturedArgs []string
@@ -309,6 +334,7 @@ func TestBuildahBuildArgs_MakePathsAbsolute(t *testing.T) {
309334
Volumes: []cliwrappers.BuildahVolume{
310335
{HostDir: "/absolute/path/volume", ContainerDir: "/container/dir", Options: ""},
311336
},
337+
BuildArgsFile: "/absolute/path/build-args-file",
312338
}
313339

314340
err := args.MakePathsAbsolute("/base/dir")
@@ -317,6 +343,7 @@ func TestBuildahBuildArgs_MakePathsAbsolute(t *testing.T) {
317343
g.Expect(args.ContextDir).To(Equal("/absolute/path/context"))
318344
g.Expect(args.Secrets[0].Src).To(Equal("/absolute/path/secret"))
319345
g.Expect(args.Volumes[0].HostDir).To(Equal("/absolute/path/volume"))
346+
g.Expect(args.BuildArgsFile).To(Equal("/absolute/path/build-args-file"))
320347
})
321348

322349
t.Run("should make relative paths absolute", func(t *testing.T) {
@@ -329,6 +356,7 @@ func TestBuildahBuildArgs_MakePathsAbsolute(t *testing.T) {
329356
Volumes: []cliwrappers.BuildahVolume{
330357
{HostDir: "relative/volume", ContainerDir: "/container/dir", Options: ""},
331358
},
359+
BuildArgsFile: "relative/build-args-file",
332360
}
333361

334362
err := args.MakePathsAbsolute("/base/dir")
@@ -337,6 +365,7 @@ func TestBuildahBuildArgs_MakePathsAbsolute(t *testing.T) {
337365
g.Expect(args.ContextDir).To(Equal("/base/dir"))
338366
g.Expect(args.Secrets[0].Src).To(Equal("/base/dir/relative/secret"))
339367
g.Expect(args.Volumes[0].HostDir).To(Equal("/base/dir/relative/volume"))
368+
g.Expect(args.BuildArgsFile).To(Equal("/base/dir/relative/build-args-file"))
340369
})
341370

342371
t.Run("should handle a mix of relative and absolute paths", func(t *testing.T) {
@@ -378,6 +407,18 @@ func TestBuildahBuildArgs_MakePathsAbsolute(t *testing.T) {
378407
g.Expect(args.Containerfile).To(Equal(filepath.Join(cwd, "Containerfile")))
379408
g.Expect(args.ContextDir).To(Equal(filepath.Join(cwd, "context")))
380409
})
410+
411+
t.Run("should not modify empty BuildArgsFile", func(t *testing.T) {
412+
args := &cliwrappers.BuildahBuildArgs{
413+
Containerfile: "/absolute/path/Containerfile",
414+
ContextDir: "/absolute/path/context",
415+
BuildArgsFile: "",
416+
}
417+
418+
err := args.MakePathsAbsolute("/base/dir")
419+
g.Expect(err).ToNot(HaveOccurred())
420+
g.Expect(args.BuildArgsFile).To(Equal(""))
421+
})
381422
}
382423

383424
func TestBuildahBuildArgs_Validate(t *testing.T) {

pkg/commands/build.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,20 @@ var BuildParamsConfig = map[string]common.Parameter{
6262
DefaultValue: "",
6363
Usage: "Mount the context directory (which is also the workdir) into the build with '--volume $PWD:$WORKDIR_MOUNT'.",
6464
},
65+
"build-args": {
66+
Name: "build-args",
67+
ShortName: "",
68+
EnvVarName: "KBC_BUILD_BUILD_ARGS",
69+
TypeKind: reflect.Slice,
70+
Usage: "Arguments to pass to the build using buildah's --build-arg option.",
71+
},
72+
"build-args-file": {
73+
Name: "build-args-file",
74+
ShortName: "",
75+
EnvVarName: "KBC_BUILD_BUILD_ARGS_FILE",
76+
TypeKind: reflect.String,
77+
Usage: "Path to a file with build arguments, see https://www.mankier.com/1/buildah-build#--build-arg-file",
78+
},
6579
}
6680

6781
type BuildParams struct {
@@ -71,6 +85,8 @@ type BuildParams struct {
7185
Push bool `paramName:"push"`
7286
SecretDirs []string `paramName:"secret-dirs"`
7387
WorkdirMount string `paramName:"workdir-mount"`
88+
BuildArgs []string `paramName:"build-args"`
89+
BuildArgsFile string `paramName:"build-args-file"`
7490
ExtraArgs []string // Additional arguments to pass to buildah build
7591
}
7692

@@ -177,6 +193,12 @@ func (c *Build) logParams() {
177193
if c.Params.WorkdirMount != "" {
178194
l.Logger.Infof("[param] WorkdirMount: %s", c.Params.WorkdirMount)
179195
}
196+
if len(c.Params.BuildArgs) > 0 {
197+
l.Logger.Infof("[param] BuildArgs: %v", c.Params.BuildArgs)
198+
}
199+
if c.Params.BuildArgsFile != "" {
200+
l.Logger.Infof("[param] BuildArgsFile: %s", c.Params.BuildArgsFile)
201+
}
180202
if len(c.Params.ExtraArgs) > 0 {
181203
l.Logger.Infof("[param] ExtraArgs: %v", c.Params.ExtraArgs)
182204
}
@@ -377,6 +399,8 @@ func (c *Build) buildImage() error {
377399
ContextDir: c.Params.Context,
378400
OutputRef: c.Params.OutputRef,
379401
Secrets: c.buildahSecrets,
402+
BuildArgs: c.Params.BuildArgs,
403+
BuildArgsFile: c.Params.BuildArgsFile,
380404
ExtraArgs: c.Params.ExtraArgs,
381405
}
382406
if c.Params.WorkdirMount != "" {

0 commit comments

Comments
 (0)