/
setup.go
121 lines (96 loc) · 2.37 KB
/
setup.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package nurse
import (
"context"
"fmt"
"log"
"os"
"os/exec"
"time"
)
func Setup(ctx context.Context, buildkitdToml string) error {
err := awaitDocker(ctx)
if err != nil {
return err
}
err = setupBuildxBuilder(ctx, buildkitdToml)
if err != nil {
return err
}
testBuild(ctx)
testBuildx(ctx)
return nil
}
func setupBuildxBuilder(ctx context.Context, buildkitdToml string) error {
log.Println("set up buildx builder")
if buildkitdToml != "" {
buildkitdToml = fmt.Sprintf("--config=%s", buildkitdToml)
}
cmd := exec.CommandContext(
ctx,
"sh",
"-c",
fmt.Sprintf("docker buildx create --use --bootstrap %s --name ci-builder", buildkitdToml),
)
cmd.Stderr = os.Stderr
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "DOCKER_HOST=tcp://127.0.0.1:12375")
log.Println(cmd.String())
output, err := cmd.Output()
if err != nil {
return fmt.Errorf("create buildx builder: %v: %s", err, string(output))
}
return nil
}
func awaitDocker(ctx context.Context) error {
log.Println("wait for docker startup")
ctx, cancel := context.WithTimeout(ctx, time.Minute)
defer cancel()
cmd := exec.CommandContext(
ctx,
"sh",
"-c",
"until docker version; do sleep 1; done",
)
cmd.Stderr = os.Stderr
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "DOCKER_HOST=tcp://127.0.0.1:12375")
output, err := cmd.Output()
if err != nil {
return fmt.Errorf("await docker: %v: %s", err, string(output))
}
return nil
}
func testBuild(ctx context.Context) {
log.Println("test docker build")
cmd := exec.CommandContext(
ctx,
"sh",
"-c",
`mkdir -p /test-build
echo "FROM hello-world" > /test-build/Dockerfile
docker build /test-build`,
)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "DOCKER_HOST=tcp://127.0.0.1:12375")
log.Println(cmd.String())
_ = cmd.Run() // ignore failures to allow startup of nurse to keep docker healyhy
}
func testBuildx(ctx context.Context) {
log.Println("test buildx build")
cmd := exec.CommandContext(
ctx,
"sh",
"-c",
`mkdir -p /test-build
echo "FROM hello-world" > /test-build/Dockerfile
docker buildx build /test-build`,
)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "DOCKER_HOST=tcp://127.0.0.1:12375")
log.Println(cmd.String())
_ = cmd.Run() // ignore failures to allow startup of nurse to keep docker healyhy
}