Skip to content

Commit 514db8b

Browse files
committed
chore: add Makefile and local registry cache
1 parent a3b3b15 commit 514db8b

File tree

4 files changed

+55
-20
lines changed

4 files changed

+55
-20
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,4 @@ jobs:
4848
go-version: "~1.21"
4949

5050
- name: Test
51-
run: go test ./...
51+
run: make test

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
scripts/envbuilder-*
2+
.registry-cache

Makefile

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
GOARCH := $(shell go env GOARCH)
2+
3+
develop:
4+
./scripts/develop.sh
5+
6+
build: scripts/envbuilder-$(GOARCH)
7+
./scripts/build.sh
8+
9+
.PHONY: test
10+
test: test-registry test-images
11+
go test -count=1 ./...
12+
13+
# Starts a local Docker registry on port 5000 with a local disk cache.
14+
test-registry:
15+
curl -fsSL http://localhost:5000/v2/_catalog || \
16+
docker run -d -p 5000:5000 --name envbuilder-registry --volume $(pwd)/.registry-cache:/var/lib/registry registry:2
17+
18+
#
19+
test-images: .registry-cache .registry-cache/docker/registry/v2/repositories/envbuilder-test-alpine .registry-cache/docker/registry/v2/repositories/envbuilder-test-ubuntu
20+
21+
.registry-cache:
22+
mkdir -p .registry-cache
23+
24+
.registry-cache/docker/registry/v2/repositories/envbuilder-test-alpine:
25+
docker pull alpine:latest
26+
docker tag alpine:latest localhost:5000/envbuilder-test-alpine:latest
27+
docker push localhost:5000/envbuilder-test-alpine:latest
28+
29+
.registry-cache/docker/registry/v2/repositories/envbuilder-test-ubuntu:
30+
docker pull ubuntu:latest
31+
docker tag ubuntu:latest localhost:5000/envbuilder-test-ubuntu:latest
32+
docker push localhost:5000/envbuilder-test-ubuntu:latest

integration/integration_test.go

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,15 @@ import (
4343

4444
const (
4545
testContainerLabel = "envbox-integration-test"
46+
testImageAlpine = "localhost:5000/envbuilder-test-alpine:latest"
47+
testImageUbuntu = "localhost:5000/envbuilder-test-ubuntu:latest"
4648
)
4749

4850
func TestFailsGitAuth(t *testing.T) {
4951
t.Parallel()
5052
url := createGitServer(t, gitServerOptions{
5153
files: map[string]string{
52-
"Dockerfile": "FROM alpine:latest",
54+
"Dockerfile": "FROM " + testImageAlpine,
5355
},
5456
username: "kyle",
5557
password: "testing",
@@ -64,7 +66,7 @@ func TestSucceedsGitAuth(t *testing.T) {
6466
t.Parallel()
6567
url := createGitServer(t, gitServerOptions{
6668
files: map[string]string{
67-
"Dockerfile": "FROM alpine:latest",
69+
"Dockerfile": "FROM " + testImageAlpine,
6870
},
6971
username: "kyle",
7072
password: "testing",
@@ -166,7 +168,7 @@ func TestBuildFromDockerfile(t *testing.T) {
166168
// Ensures that a Git repository with a Dockerfile is cloned and built.
167169
url := createGitServer(t, gitServerOptions{
168170
files: map[string]string{
169-
"Dockerfile": "FROM alpine:latest",
171+
"Dockerfile": "FROM " + testImageAlpine,
170172
},
171173
})
172174
ctr, err := runEnvbuilder(t, options{env: []string{
@@ -183,7 +185,7 @@ func TestBuildPrintBuildOutput(t *testing.T) {
183185
// Ensures that a Git repository with a Dockerfile is cloned and built.
184186
url := createGitServer(t, gitServerOptions{
185187
files: map[string]string{
186-
"Dockerfile": "FROM alpine:latest\nRUN echo hello",
188+
"Dockerfile": "FROM " + testImageAlpine + "\nRUN echo hello",
187189
},
188190
})
189191
ctr, err := runEnvbuilder(t, options{env: []string{
@@ -211,7 +213,7 @@ func TestBuildIgnoreVarRunSecrets(t *testing.T) {
211213
// Ensures that a Git repository with a Dockerfile is cloned and built.
212214
url := createGitServer(t, gitServerOptions{
213215
files: map[string]string{
214-
"Dockerfile": "FROM alpine:latest",
216+
"Dockerfile": "FROM " + testImageAlpine,
215217
},
216218
})
217219
dir := t.TempDir()
@@ -234,7 +236,7 @@ func TestBuildWithSetupScript(t *testing.T) {
234236
// Ensures that a Git repository with a Dockerfile is cloned and built.
235237
url := createGitServer(t, gitServerOptions{
236238
files: map[string]string{
237-
"Dockerfile": "FROM alpine:latest",
239+
"Dockerfile": "FROM " + testImageAlpine,
238240
},
239241
})
240242
ctr, err := runEnvbuilder(t, options{env: []string{
@@ -323,7 +325,7 @@ func TestBuildFromDevcontainerInRoot(t *testing.T) {
323325
func TestBuildCustomCertificates(t *testing.T) {
324326
srv := httptest.NewTLSServer(createGitHandler(t, gitServerOptions{
325327
files: map[string]string{
326-
"Dockerfile": "FROM alpine:latest",
328+
"Dockerfile": "FROM " + testImageAlpine,
327329
},
328330
}))
329331
ctr, err := runEnvbuilder(t, options{env: []string{
@@ -344,7 +346,7 @@ func TestBuildStopStartCached(t *testing.T) {
344346
// Ensures that a Git repository with a Dockerfile is cloned and built.
345347
url := createGitServer(t, gitServerOptions{
346348
files: map[string]string{
347-
"Dockerfile": "FROM alpine:latest",
349+
"Dockerfile": "FROM " + testImageAlpine,
348350
},
349351
})
350352
ctr, err := runEnvbuilder(t, options{env: []string{
@@ -439,7 +441,7 @@ RUN exit 1`,
439441
})
440442
ctr, err := runEnvbuilder(t, options{env: []string{
441443
"GIT_URL=" + url,
442-
"FALLBACK_IMAGE=alpine:latest",
444+
"FALLBACK_IMAGE=" + testImageAlpine,
443445
}})
444446
require.NoError(t, err)
445447

@@ -458,7 +460,7 @@ func TestExitBuildOnFailure(t *testing.T) {
458460
_, err := runEnvbuilder(t, options{env: []string{
459461
"GIT_URL=" + url,
460462
"DOCKERFILE_PATH=Dockerfile",
461-
"FALLBACK_IMAGE=alpine",
463+
"FALLBACK_IMAGE=" + testImageAlpine,
462464
// Ensures that the fallback doesn't work when an image is specified.
463465
"EXIT_ON_BUILD_FAILURE=true",
464466
}})
@@ -486,7 +488,7 @@ func TestContainerEnv(t *testing.T) {
486488
"REMOTE_BAR": "${FROM_CONTAINER_ENV}"
487489
}
488490
}`,
489-
".devcontainer/Dockerfile": "FROM alpine:latest\nENV FROM_DOCKERFILE=foo",
491+
".devcontainer/Dockerfile": "FROM " + testImageAlpine + "\nENV FROM_DOCKERFILE=foo",
490492
},
491493
})
492494
ctr, err := runEnvbuilder(t, options{env: []string{
@@ -586,7 +588,7 @@ func TestPrivateRegistry(t *testing.T) {
586588
t.Parallel()
587589
t.Run("NoAuth", func(t *testing.T) {
588590
t.Parallel()
589-
image := setupPassthroughRegistry(t, "library/alpine", &registryAuth{
591+
image := setupPassthroughRegistry(t, "thisimagedoesnotexist", &registryAuth{
590592
Username: "user",
591593
Password: "test",
592594
})
@@ -605,7 +607,7 @@ func TestPrivateRegistry(t *testing.T) {
605607
})
606608
t.Run("Auth", func(t *testing.T) {
607609
t.Parallel()
608-
image := setupPassthroughRegistry(t, "library/alpine", &registryAuth{
610+
image := setupPassthroughRegistry(t, "envbuilder-test-alpine:latest", &registryAuth{
609611
Username: "user",
610612
Password: "test",
611613
})
@@ -635,7 +637,7 @@ func TestPrivateRegistry(t *testing.T) {
635637
})
636638
t.Run("InvalidAuth", func(t *testing.T) {
637639
t.Parallel()
638-
image := setupPassthroughRegistry(t, "library/alpine", &registryAuth{
640+
image := setupPassthroughRegistry(t, "thisimagedoesnotexist", &registryAuth{
639641
Username: "user",
640642
Password: "banana",
641643
})
@@ -672,22 +674,22 @@ type registryAuth struct {
672674

673675
func setupPassthroughRegistry(t *testing.T, image string, auth *registryAuth) string {
674676
t.Helper()
675-
dockerURL, err := url.Parse("https://registry-1.docker.io")
677+
dockerURL, err := url.Parse("http://localhost:5000")
676678
require.NoError(t, err)
677679
proxy := httputil.NewSingleHostReverseProxy(dockerURL)
678680

679681
// The Docker registry uses short-lived JWTs to authenticate
680682
// anonymously to pull images. To test our MITM auth, we need to
681683
// generate a JWT for the proxy to use.
682-
registry, err := name.NewRegistry("registry-1.docker.io")
684+
registry, err := name.NewRegistry("localhost:5000")
683685
require.NoError(t, err)
684686
proxy.Transport, err = transport.NewWithContext(context.Background(), registry, authn.Anonymous, http.DefaultTransport, []string{})
685687
require.NoError(t, err)
686688

687689
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
688-
r.Host = "registry-1.docker.io"
689-
r.URL.Host = "registry-1.docker.io"
690-
r.URL.Scheme = "https"
690+
r.Host = "localhost:5000"
691+
r.URL.Host = "localhost:5000"
692+
r.URL.Scheme = "http"
691693

692694
if auth != nil {
693695
user, pass, ok := r.BasicAuth()

0 commit comments

Comments
 (0)