Skip to content

Commit 6fc13ad

Browse files
authored
Merge pull request #42 from tomjw64/labels-support
Labels support
2 parents 579cc81 + 57ccdc8 commit 6fc13ad

File tree

9 files changed

+120
-8
lines changed

9 files changed

+120
-8
lines changed

Diff for: README.md

+6
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ Next, any of the following optional parameters may be specified:
6969
DO_THING=false
7070
```
7171
72+
* `$LABEL_*`: params prefixed with `LABEL_` will be set as image labels.
73+
For example `LABEL_foo=bar`, will set the `foo` label to `bar`.
74+
75+
* `$LABELS_FILE` (default empty): path to a file containing labels in
76+
the form `foo=bar`, one per line. Empty lines are skipped.
77+
7278
* `$TARGET` (default empty): a target build stage to build.
7379
7480
* `$TARGET_FILE` (default empty): path to a file containing the name of the

Diff for: cmd/build/main.go

+13-8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
)
1414

1515
const buildArgPrefix = "BUILD_ARG_"
16+
const labelPrefix = "LABEL_"
1617

1718
func main() {
1819
req := task.Request{
@@ -22,16 +23,20 @@ func main() {
2223
err := envconfig.Init(&req.Config)
2324
failIf("parse config from env", err)
2425

25-
// carry over BUILD_ARG_* vars manually
26+
// carry over BUILD_ARG_* and LABEL_* vars manually
2627
for _, env := range os.Environ() {
27-
if !strings.HasPrefix(env, buildArgPrefix) {
28-
continue
28+
if strings.HasPrefix(env, buildArgPrefix) {
29+
req.Config.BuildArgs = append(
30+
req.Config.BuildArgs,
31+
strings.TrimPrefix(env, buildArgPrefix),
32+
)
33+
}
34+
if strings.HasPrefix(env, labelPrefix) {
35+
req.Config.Labels = append(
36+
req.Config.Labels,
37+
strings.TrimPrefix(env, labelPrefix),
38+
)
2939
}
30-
31-
req.Config.BuildArgs = append(
32-
req.Config.BuildArgs,
33-
strings.TrimPrefix(env, buildArgPrefix),
34-
)
3540
}
3641

3742
logrus.Debugf("read config from env: %#v\n", req.Config)

Diff for: task.go

+22
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,12 @@ func Build(buildkitd *Buildkitd, outputsDir string, req Request) (Response, erro
7979
)
8080
}
8181

82+
for _, arg := range cfg.Labels {
83+
buildctlArgs = append(buildctlArgs,
84+
"--opt", "label:"+arg,
85+
)
86+
}
87+
8288
logrus.WithFields(logrus.Fields{
8389
"buildctl-args": buildctlArgs,
8490
}).Debug("building")
@@ -195,6 +201,22 @@ func sanitize(cfg *Config) error {
195201
}
196202
}
197203

204+
if cfg.LabelsFile != "" {
205+
Labels, err := ioutil.ReadFile(cfg.LabelsFile)
206+
if err != nil {
207+
return errors.Wrap(err, "read labels file")
208+
}
209+
210+
for _, arg := range strings.Split(string(Labels), "\n") {
211+
if len(arg) == 0 {
212+
// skip blank lines
213+
continue
214+
}
215+
216+
cfg.Labels = append(cfg.Labels, arg)
217+
}
218+
}
219+
198220
return nil
199221
}
200222

Diff for: task_test.go

+68
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/url"
99
"os"
1010
"path/filepath"
11+
"reflect"
1112
"testing"
1213

1314
"github.com/google/go-containerregistry/pkg/name"
@@ -149,6 +150,73 @@ func (s *TaskSuite) TestBuildArgsStaticAndFile() {
149150
s.NoError(err)
150151
}
151152

153+
func (s *TaskSuite) TestLabels() {
154+
s.req.Config.ContextDir = "testdata/labels"
155+
expectedLabels := map[string]string{
156+
"some_label": "some_value",
157+
"some_other_label": "some_other_value",
158+
}
159+
s.req.Config.Labels = make([]string, 0, len(expectedLabels))
160+
161+
for k, v := range expectedLabels {
162+
s.req.Config.Labels = append(s.req.Config.Labels, fmt.Sprintf("%s=%s", k, v))
163+
}
164+
165+
_, err := s.build()
166+
s.NoError(err)
167+
168+
image, err := tarball.ImageFromPath(s.imagePath("image.tar"), nil)
169+
s.NoError(err)
170+
171+
configFile, err := image.ConfigFile()
172+
s.NoError(err)
173+
174+
s.True(reflect.DeepEqual(expectedLabels, configFile.Config.Labels))
175+
}
176+
177+
func (s *TaskSuite) TestLabelsFile() {
178+
s.req.Config.ContextDir = "testdata/labels"
179+
expectedLabels := map[string]string{
180+
"some_label": "some_value",
181+
"some_other_label": "some_other_value",
182+
}
183+
s.req.Config.LabelsFile = "testdata/labels/labels_file"
184+
185+
_, err := s.build()
186+
s.NoError(err)
187+
188+
image, err := tarball.ImageFromPath(s.imagePath("image.tar"), nil)
189+
s.NoError(err)
190+
191+
configFile, err := image.ConfigFile()
192+
s.NoError(err)
193+
194+
s.True(reflect.DeepEqual(expectedLabels, configFile.Config.Labels))
195+
}
196+
197+
func (s *TaskSuite) TestLabelsStaticAndFileAndLayer() {
198+
s.req.Config.ContextDir = "testdata/labels"
199+
s.req.Config.DockerfilePath = "testdata/labels/label_layer.dockerfile"
200+
expectedLabels := map[string]string{
201+
"some_label": "some_value",
202+
"some_other_label": "some_other_value",
203+
"label_layer": "some_label_layer_value",
204+
}
205+
s.req.Config.Labels = []string{"some_label=some_value"}
206+
s.req.Config.LabelsFile = "testdata/labels/label_file"
207+
208+
_, err := s.build()
209+
s.NoError(err)
210+
211+
image, err := tarball.ImageFromPath(s.imagePath("image.tar"), nil)
212+
s.NoError(err)
213+
214+
configFile, err := image.ConfigFile()
215+
s.NoError(err)
216+
217+
s.True(reflect.DeepEqual(expectedLabels, configFile.Config.Labels))
218+
}
219+
152220
func (s *TaskSuite) TestUnpackRootfs() {
153221
s.req.Config.ContextDir = "testdata/unpack-rootfs"
154222
s.req.Config.UnpackRootfs = true

Diff for: testdata/labels/Dockerfile

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
FROM scratch
2+
COPY Dockerfile /

Diff for: testdata/labels/label_file

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
some_other_label=some_other_value

Diff for: testdata/labels/label_layer.dockerfile

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM scratch
2+
COPY Dockerfile /
3+
LABEL label_layer=some_label_layer_value

Diff for: testdata/labels/labels_file

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
some_label=some_value
2+
some_other_label=some_other_value

Diff for: types.go

+3
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ type Config struct {
5757

5858
RegistryMirrors []string `json:"registry_mirrors" envconfig:"REGISTRY_MIRRORS,optional"`
5959

60+
Labels []string `json:"labels" envconfig:"optional"`
61+
LabelsFile string `json:"labels_file" envconfig:"optional"`
62+
6063
// Unpack the OCI image into Concourse's rootfs/ + metadata.json image scheme.
6164
//
6265
// Theoretically this would go away if/when we standardize on OCI.

0 commit comments

Comments
 (0)