From 2b14db2af3a07ecce5fd0b212b354dd21eec381a Mon Sep 17 00:00:00 2001 From: Ygal Blum Date: Thu, 29 Aug 2024 15:07:49 -0400 Subject: [PATCH] Quadlet - Support multiple image tags in .build files Signed-off-by: Ygal Blum --- docs/source/markdown/podman-systemd.unit.5.md | 2 ++ pkg/systemd/quadlet/quadlet.go | 10 +++++++--- test/e2e/quadlet/build.multiple-tags.container | 4 ++++ test/e2e/quadlet/multiple-tags.build | 7 +++++++ test/e2e/quadlet_test.go | 2 ++ 5 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 test/e2e/quadlet/build.multiple-tags.container create mode 100644 test/e2e/quadlet/multiple-tags.build diff --git a/docs/source/markdown/podman-systemd.unit.5.md b/docs/source/markdown/podman-systemd.unit.5.md index a86553081a..6e6afaf18b 100644 --- a/docs/source/markdown/podman-systemd.unit.5.md +++ b/docs/source/markdown/podman-systemd.unit.5.md @@ -1621,6 +1621,8 @@ successfully. This is equivalent to the `--tag` option of `podman build`. +This key can be listed multiple times. The first instance will be used as the name of the created artifact when the `.build` file is referenced by another Quadlet unit. + ### `Label=` Add an image *label* (e.g. label=*value*) to the image metadata. Can be used multiple times. diff --git a/pkg/systemd/quadlet/quadlet.go b/pkg/systemd/quadlet/quadlet.go index 6720c99724..837f76dc03 100644 --- a/pkg/systemd/quadlet/quadlet.go +++ b/pkg/systemd/quadlet/quadlet.go @@ -1494,7 +1494,10 @@ func ConvertBuild(build *parser.UnitFile, unitsInfoMap map[string]*UnitInfo) (*p labels := build.LookupAllKeyVal(BuildGroup, KeyLabel) podman.addLabels(labels) - podman.addf("--tag=%s", unitInfo.ResourceName) + imageTags := build.LookupAll(BuildGroup, KeyImageTag) + for _, imageTag := range imageTags { + podman.addf("--tag=%s", imageTag) + } if err := addNetworks(build, BuildGroup, service, unitsInfoMap, podman); err != nil { return nil, err @@ -1555,8 +1558,9 @@ func ConvertBuild(build *parser.UnitFile, unitsInfoMap map[string]*UnitInfo) (*p } func GetBuiltImageName(buildUnit *parser.UnitFile) string { - if builtImageName, ok := buildUnit.Lookup(BuildGroup, KeyImageTag); ok { - return builtImageName + imageTags := buildUnit.LookupAll(BuildGroup, KeyImageTag) + if len(imageTags) > 0 { + return imageTags[0] } return "" } diff --git a/test/e2e/quadlet/build.multiple-tags.container b/test/e2e/quadlet/build.multiple-tags.container new file mode 100644 index 0000000000..d8ba492104 --- /dev/null +++ b/test/e2e/quadlet/build.multiple-tags.container @@ -0,0 +1,4 @@ +## assert-podman-final-args localhost/imagename:v1 + +[Container] +Image=multiple-tags.build diff --git a/test/e2e/quadlet/multiple-tags.build b/test/e2e/quadlet/multiple-tags.build new file mode 100644 index 0000000000..19eacca872 --- /dev/null +++ b/test/e2e/quadlet/multiple-tags.build @@ -0,0 +1,7 @@ +## assert-podman-args --tag=localhost/imagename:v1 +## assert-podman-args --tag=localhost/imagename:latest + +[Build] +ImageTag=localhost/imagename:v1 +ImageTag=localhost/imagename:latest +SetWorkingDirectory=unit diff --git a/test/e2e/quadlet_test.go b/test/e2e/quadlet_test.go index 6c13ace201..0f092cdcce 100644 --- a/test/e2e/quadlet_test.go +++ b/test/e2e/quadlet_test.go @@ -984,6 +984,7 @@ BOGUS=foo Entry("Build - GroupAdd Key", "group-add.build"), Entry("Build - Containers Conf Modules", "containersconfmodule.build"), Entry("Build - Label Key", "label.build"), + Entry("Build - Multiple Tags", "multiple-tags.build"), Entry("Build - Network Key host", "network.build"), Entry("Build - PodmanArgs", "podmanargs.build"), Entry("Build - Pull Key", "pull.build"), @@ -1075,6 +1076,7 @@ BOGUS=foo Entry("Container - Mount overriding service name", "mount.servicename.container", []string{"service-name.volume"}), Entry("Container - Quadlet Network overriding service name", "network.quadlet.servicename.container", []string{"service-name.network"}), Entry("Container - Quadlet Volume overriding service name", "volume.servicename.container", []string{"service-name.volume"}), + Entry("Container - Quadlet build with multiple tags", "build.multiple-tags.container", []string{"multiple-tags.build"}), Entry("Volume - Quadlet image (.build)", "build.quadlet.volume", []string{"basic.build"}), Entry("Volume - Quadlet image (.image)", "image.quadlet.volume", []string{"basic.image"}),