Skip to content

Commit a1b0722

Browse files
sambhavryanmoran
authored andcommitted
Add support for process launch env. vars.
Signed-off-by: Sambhav Kothari <skothari44@bloomberg.net>
1 parent d2e6638 commit a1b0722

File tree

6 files changed

+148
-35
lines changed

6 files changed

+148
-35
lines changed

build.go

+8
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,14 @@ func Build(f BuildFunc, options ...Option) {
331331
config.exitHandler.Error(err)
332332
return
333333
}
334+
335+
for process, processEnv := range layer.ProcessLaunchEnv {
336+
err = config.envWriter.Write(filepath.Join(layer.Path, "env.launch", process), processEnv)
337+
if err != nil {
338+
config.exitHandler.Error(err)
339+
return
340+
}
341+
}
334342
}
335343

336344
if !result.Launch.isEmpty() {

build_test.go

+35
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,41 @@ api = "0.4"
711711
Expect(string(contents)).To(Equal(fmt.Sprintf("%s-value", modifier)))
712712
}
713713
})
714+
it("writes env vars into env.launch/<process> directory", func() {
715+
packit.Build(func(ctx packit.BuildContext) (packit.BuildResult, error) {
716+
return packit.BuildResult{
717+
Layers: []packit.Layer{
718+
{
719+
Path: filepath.Join(ctx.Layers.Path, "some-layer"),
720+
ProcessLaunchEnv: map[string]packit.Environment{
721+
"process-name": {
722+
"SOME_VAR.append": "append-value",
723+
"SOME_VAR.default": "default-value",
724+
"SOME_VAR.delim": "delim-value",
725+
"SOME_VAR.prepend": "prepend-value",
726+
"SOME_VAR.override": "override-value",
727+
},
728+
"another-process-name": {
729+
"SOME_VAR.append": "append-value",
730+
"SOME_VAR.default": "default-value",
731+
"SOME_VAR.delim": "delim-value",
732+
"SOME_VAR.prepend": "prepend-value",
733+
"SOME_VAR.override": "override-value",
734+
},
735+
},
736+
},
737+
},
738+
}, nil
739+
}, packit.WithArgs([]string{binaryPath, layersDir, "", planPath}))
740+
741+
for _, process := range []string{"process-name", "another-process-name"} {
742+
for _, modifier := range []string{"append", "default", "delim", "prepend", "override"} {
743+
contents, err := ioutil.ReadFile(filepath.Join(layersDir, "some-layer", "env.launch", process, fmt.Sprintf("SOME_VAR.%s", modifier)))
744+
Expect(err).NotTo(HaveOccurred())
745+
Expect(string(contents)).To(Equal(fmt.Sprintf("%s-value", modifier)))
746+
}
747+
}
748+
})
714749
})
715750

716751
context("writes to build folder", func() {

layer.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ type Layer struct {
4848
// https://github.com/buildpacks/spec/blob/main/buildpack.md#provided-by-the-buildpacks.
4949
LaunchEnv Environment `toml:"-"`
5050

51+
// ProcessLaunchEnv is a map of environment variables attached to the layer and
52+
// made available to specified proccesses in the launch phase accoring to the specification:
53+
// https://github.com/buildpacks/spec/blob/main/buildpack.md#provided-by-the-buildpacks
54+
ProcessLaunchEnv map[string]Environment `toml:"-"`
55+
5156
// Metadata is an unspecified field allowing buildpacks to communicate extra
5257
// details about the layer. Examples of this type of metadata might include
5358
// details about what versions of software are included in the layer such
@@ -69,7 +74,7 @@ func (l Layer) Reset() (Layer, error) {
6974
l.SharedEnv = Environment{}
7075
l.BuildEnv = Environment{}
7176
l.LaunchEnv = Environment{}
72-
77+
l.ProcessLaunchEnv = make(map[string]Environment)
7378
l.Metadata = nil
7479

7580
err := os.RemoveAll(l.Path)

layer_test.go

+18-16
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,15 @@ func testLayer(t *testing.T, context spec.G, it spec.S) {
4949
Expect(err).NotTo(HaveOccurred())
5050

5151
Expect(layer).To(Equal(packit.Layer{
52-
Name: "some-layer",
53-
Path: filepath.Join(layersDir, "some-layer"),
54-
Launch: false,
55-
Build: false,
56-
Cache: false,
57-
SharedEnv: packit.Environment{},
58-
BuildEnv: packit.Environment{},
59-
LaunchEnv: packit.Environment{},
52+
Name: "some-layer",
53+
Path: filepath.Join(layersDir, "some-layer"),
54+
Launch: false,
55+
Build: false,
56+
Cache: false,
57+
SharedEnv: packit.Environment{},
58+
BuildEnv: packit.Environment{},
59+
LaunchEnv: packit.Environment{},
60+
ProcessLaunchEnv: map[string]packit.Environment{},
6061
}))
6162

6263
Expect(filepath.Join(layersDir, "some-layer")).To(BeADirectory())
@@ -118,14 +119,15 @@ func testLayer(t *testing.T, context spec.G, it spec.S) {
118119
Expect(err).NotTo(HaveOccurred())
119120

120121
Expect(layer).To(Equal(packit.Layer{
121-
Name: "some-layer",
122-
Path: filepath.Join(layersDir, "some-layer"),
123-
Launch: false,
124-
Build: false,
125-
Cache: false,
126-
SharedEnv: packit.Environment{},
127-
BuildEnv: packit.Environment{},
128-
LaunchEnv: packit.Environment{},
122+
Name: "some-layer",
123+
Path: filepath.Join(layersDir, "some-layer"),
124+
Launch: false,
125+
Build: false,
126+
Cache: false,
127+
SharedEnv: packit.Environment{},
128+
BuildEnv: packit.Environment{},
129+
LaunchEnv: packit.Environment{},
130+
ProcessLaunchEnv: map[string]packit.Environment{},
129131
}))
130132

131133
Expect(filepath.Join(layersDir, "some-layer")).To(BeADirectory())

layers.go

+23-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package packit
22

33
import (
44
"fmt"
5+
"io/ioutil"
56
"os"
67
"path/filepath"
78

@@ -20,11 +21,12 @@ type Layers struct {
2021
// disk and returned instead.
2122
func (l Layers) Get(name string) (Layer, error) {
2223
layer := Layer{
23-
Path: filepath.Join(l.Path, name),
24-
Name: name,
25-
SharedEnv: Environment{},
26-
BuildEnv: Environment{},
27-
LaunchEnv: Environment{},
24+
Path: filepath.Join(l.Path, name),
25+
Name: name,
26+
SharedEnv: Environment{},
27+
BuildEnv: Environment{},
28+
LaunchEnv: Environment{},
29+
ProcessLaunchEnv: make(map[string]Environment),
2830
}
2931

3032
_, err := toml.DecodeFile(filepath.Join(l.Path, fmt.Sprintf("%s.toml", name)), &layer)
@@ -49,5 +51,21 @@ func (l Layers) Get(name string) (Layer, error) {
4951
return Layer{}, err
5052
}
5153

54+
if _, err := os.Stat(filepath.Join(l.Path, name, "env.launch")); !os.IsNotExist(err) {
55+
paths, err := ioutil.ReadDir(filepath.Join(l.Path, name, "env.launch"))
56+
if err != nil {
57+
return Layer{}, err
58+
}
59+
60+
for _, path := range paths {
61+
if path.IsDir() {
62+
layer.ProcessLaunchEnv[path.Name()], err = newEnvironmentFromPath(filepath.Join(l.Path, name, "env.launch", path.Name()))
63+
if err != nil {
64+
return Layer{}, err
65+
}
66+
}
67+
}
68+
}
69+
5270
return layer, nil
5371
}

layers_test.go

+58-13
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,12 @@ func testLayers(t *testing.T, context spec.G, it spec.S) {
3939
layer, err := layers.Get("some-layer")
4040
Expect(err).NotTo(HaveOccurred())
4141
Expect(layer).To(Equal(packit.Layer{
42-
Name: "some-layer",
43-
Path: filepath.Join(layersDir, "some-layer"),
44-
SharedEnv: packit.Environment{},
45-
BuildEnv: packit.Environment{},
46-
LaunchEnv: packit.Environment{},
42+
Name: "some-layer",
43+
Path: filepath.Join(layersDir, "some-layer"),
44+
SharedEnv: packit.Environment{},
45+
BuildEnv: packit.Environment{},
46+
LaunchEnv: packit.Environment{},
47+
ProcessLaunchEnv: map[string]packit.Environment{},
4748
}))
4849
})
4950

@@ -63,14 +64,15 @@ some-key = "some-value"`), 0644)
6364
layer, err := layers.Get("some-layer")
6465
Expect(err).NotTo(HaveOccurred())
6566
Expect(layer).To(Equal(packit.Layer{
66-
Name: "some-layer",
67-
Path: filepath.Join(layersDir, "some-layer"),
68-
Launch: true,
69-
Build: true,
70-
Cache: true,
71-
SharedEnv: packit.Environment{},
72-
BuildEnv: packit.Environment{},
73-
LaunchEnv: packit.Environment{},
67+
Name: "some-layer",
68+
Path: filepath.Join(layersDir, "some-layer"),
69+
Launch: true,
70+
Build: true,
71+
Cache: true,
72+
SharedEnv: packit.Environment{},
73+
BuildEnv: packit.Environment{},
74+
LaunchEnv: packit.Environment{},
75+
ProcessLaunchEnv: map[string]packit.Environment{},
7476
Metadata: map[string]interface{}{
7577
"some-key": "some-value",
7678
},
@@ -108,6 +110,35 @@ some-key = "some-value"`), 0644)
108110

109111
err = ioutil.WriteFile(filepath.Join(launchEnvDir, "PREPEND_VAR.delim"), []byte("#"), 0644)
110112
Expect(err).NotTo(HaveOccurred())
113+
114+
processLaunchEnvDir := filepath.Join(layersDir, "some-layer", "env.launch", "process")
115+
Expect(os.MkdirAll(processLaunchEnvDir, os.ModePerm)).To(Succeed())
116+
117+
err = ioutil.WriteFile(filepath.Join(processLaunchEnvDir, "APPEND_VAR.append"), []byte("append-value"), 0644)
118+
Expect(err).NotTo(HaveOccurred())
119+
120+
err = ioutil.WriteFile(filepath.Join(processLaunchEnvDir, "APPEND_VAR.delim"), []byte("!"), 0644)
121+
Expect(err).NotTo(HaveOccurred())
122+
123+
err = ioutil.WriteFile(filepath.Join(processLaunchEnvDir, "PREPEND_VAR.prepend"), []byte("prepend-value"), 0644)
124+
Expect(err).NotTo(HaveOccurred())
125+
126+
err = ioutil.WriteFile(filepath.Join(processLaunchEnvDir, "PREPEND_VAR.delim"), []byte("#"), 0644)
127+
Expect(err).NotTo(HaveOccurred())
128+
anotherProcessLaunchEnvDir := filepath.Join(layersDir, "some-layer", "env.launch", "another-process")
129+
Expect(os.MkdirAll(anotherProcessLaunchEnvDir, os.ModePerm)).To(Succeed())
130+
131+
err = ioutil.WriteFile(filepath.Join(anotherProcessLaunchEnvDir, "APPEND_VAR.append"), []byte("append-value"), 0644)
132+
Expect(err).NotTo(HaveOccurred())
133+
134+
err = ioutil.WriteFile(filepath.Join(anotherProcessLaunchEnvDir, "APPEND_VAR.delim"), []byte("!"), 0644)
135+
Expect(err).NotTo(HaveOccurred())
136+
137+
err = ioutil.WriteFile(filepath.Join(anotherProcessLaunchEnvDir, "PREPEND_VAR.prepend"), []byte("prepend-value"), 0644)
138+
Expect(err).NotTo(HaveOccurred())
139+
140+
err = ioutil.WriteFile(filepath.Join(anotherProcessLaunchEnvDir, "PREPEND_VAR.delim"), []byte("#"), 0644)
141+
Expect(err).NotTo(HaveOccurred())
111142
})
112143

113144
it("returns a layer with the existing metadata", func() {
@@ -119,6 +150,20 @@ some-key = "some-value"`), 0644)
119150
Launch: true,
120151
Build: true,
121152
Cache: true,
153+
ProcessLaunchEnv: map[string]packit.Environment{
154+
"process": {
155+
"APPEND_VAR.append": "append-value",
156+
"APPEND_VAR.delim": "!",
157+
"PREPEND_VAR.prepend": "prepend-value",
158+
"PREPEND_VAR.delim": "#",
159+
},
160+
"another-process": {
161+
"APPEND_VAR.append": "append-value",
162+
"APPEND_VAR.delim": "!",
163+
"PREPEND_VAR.prepend": "prepend-value",
164+
"PREPEND_VAR.delim": "#",
165+
},
166+
},
122167
SharedEnv: packit.Environment{
123168
"OVERRIDE_VAR.override": "override-value",
124169
},

0 commit comments

Comments
 (0)