Skip to content

Commit 82ffbc9

Browse files
authored
Fix FeatureContexts keys (#243)
1 parent b1e4be1 commit 82ffbc9

File tree

2 files changed

+44
-7
lines changed

2 files changed

+44
-7
lines changed

devcontainer/devcontainer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ func (s *Spec) compileFeatures(fs billy.Filesystem, devcontainerDir, scratchDir
295295
}
296296
featureDirectives = append(featureDirectives, directive)
297297
if useBuildContexts {
298-
featureContexts[featureName] = featureDir
298+
featureContexts[featureRef] = featureDir
299299
lines = append(lines, fromDirective)
300300
}
301301
}

devcontainer/devcontainer_test.go

+43-6
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ import (
2424

2525
const magicDir = "/.envbuilder"
2626

27+
func stubLookupEnv(string) (string, bool) {
28+
return "", false
29+
}
30+
2731
func TestParse(t *testing.T) {
2832
t.Parallel()
2933
raw := `{
@@ -87,16 +91,17 @@ func TestCompileWithFeatures(t *testing.T) {
8791
dc, err := devcontainer.Parse([]byte(raw))
8892
require.NoError(t, err)
8993
fs := memfs.New()
90-
params, err := dc.Compile(fs, "", magicDir, "", "", false, os.LookupEnv)
91-
require.NoError(t, err)
9294

93-
// We have to SHA because we get a different MD5 every time!
9495
featureOneMD5 := md5.Sum([]byte(featureOne))
9596
featureOneDir := fmt.Sprintf("/.envbuilder/features/one-%x", featureOneMD5[:4])
9697
featureTwoMD5 := md5.Sum([]byte(featureTwo))
9798
featureTwoDir := fmt.Sprintf("/.envbuilder/features/two-%x", featureTwoMD5[:4])
9899

99-
require.Equal(t, `FROM localhost:5000/envbuilder-test-codercom-code-server:latest
100+
t.Run("WithoutBuildContexts", func(t *testing.T) {
101+
params, err := dc.Compile(fs, "", magicDir, "", "", false, stubLookupEnv)
102+
require.NoError(t, err)
103+
104+
require.Equal(t, `FROM localhost:5000/envbuilder-test-codercom-code-server:latest
100105
101106
USER root
102107
# Rust tomato - Example description!
@@ -108,6 +113,38 @@ WORKDIR `+featureTwoDir+`
108113
ENV POTATO=example
109114
RUN VERSION="potato" _CONTAINER_USER="1000" _REMOTE_USER="1000" ./install.sh
110115
USER 1000`, params.DockerfileContent)
116+
})
117+
118+
t.Run("WithBuildContexts", func(t *testing.T) {
119+
params, err := dc.Compile(fs, "", magicDir, "", "", true, stubLookupEnv)
120+
require.NoError(t, err)
121+
122+
registryHost := strings.TrimPrefix(registry, "http://")
123+
124+
require.Equal(t, `FROM scratch AS envbuilder_feature_one
125+
COPY --from=`+registryHost+`/coder/one / /
126+
127+
FROM scratch AS envbuilder_feature_two
128+
COPY --from=`+registryHost+`/coder/two / /
129+
130+
FROM localhost:5000/envbuilder-test-codercom-code-server:latest
131+
132+
USER root
133+
# Rust tomato - Example description!
134+
WORKDIR `+featureOneDir+`
135+
ENV TOMATO=example
136+
RUN --mount=type=bind,from=envbuilder_feature_one,target=`+featureOneDir+`,rw _CONTAINER_USER="1000" _REMOTE_USER="1000" ./install.sh
137+
# Go potato - Example description!
138+
WORKDIR `+featureTwoDir+`
139+
ENV POTATO=example
140+
RUN --mount=type=bind,from=envbuilder_feature_two,target=`+featureTwoDir+`,rw VERSION="potato" _CONTAINER_USER="1000" _REMOTE_USER="1000" ./install.sh
141+
USER 1000`, params.DockerfileContent)
142+
143+
require.Equal(t, map[string]string{
144+
registryHost + "/coder/one": featureOneDir,
145+
registryHost + "/coder/two": featureTwoDir,
146+
}, params.FeatureContexts)
147+
})
111148
}
112149

113150
func TestCompileDevContainer(t *testing.T) {
@@ -118,7 +155,7 @@ func TestCompileDevContainer(t *testing.T) {
118155
dc := &devcontainer.Spec{
119156
Image: "localhost:5000/envbuilder-test-ubuntu:latest",
120157
}
121-
params, err := dc.Compile(fs, "", magicDir, "", "", false, os.LookupEnv)
158+
params, err := dc.Compile(fs, "", magicDir, "", "", false, stubLookupEnv)
122159
require.NoError(t, err)
123160
require.Equal(t, filepath.Join(magicDir, "Dockerfile"), params.DockerfilePath)
124161
require.Equal(t, magicDir, params.BuildContext)
@@ -144,7 +181,7 @@ func TestCompileDevContainer(t *testing.T) {
144181
_, err = io.WriteString(file, "FROM localhost:5000/envbuilder-test-ubuntu:latest")
145182
require.NoError(t, err)
146183
_ = file.Close()
147-
params, err := dc.Compile(fs, dcDir, magicDir, "", "/var/workspace", false, os.LookupEnv)
184+
params, err := dc.Compile(fs, dcDir, magicDir, "", "/var/workspace", false, stubLookupEnv)
148185
require.NoError(t, err)
149186
require.Equal(t, "ARG1=value1", params.BuildArgs[0])
150187
require.Equal(t, "ARG2=workspace", params.BuildArgs[1])

0 commit comments

Comments
 (0)