| package build | |
| import ( | |
| "context" | |
| "encoding/json" | |
| "io" | |
| "testing" | |
| "github.com/docker/docker/api/types" | |
| "github.com/docker/docker/client" | |
| "github.com/docker/docker/pkg/jsonmessage" | |
| "github.com/docker/docker/testutil/fakecontext" | |
| "gotest.tools/v3/assert" | |
| ) | |
| // Do builds an image from the given context and returns the image ID. | |
| func Do(ctx context.Context, t *testing.T, client client.APIClient, buildCtx *fakecontext.Fake) string { | |
| resp, err := client.ImageBuild(ctx, buildCtx.AsTarReader(t), types.ImageBuildOptions{}) | |
| if resp.Body != nil { | |
| defer resp.Body.Close() | |
| } | |
| assert.NilError(t, err) | |
| img := GetImageIDFromBody(t, resp.Body) | |
| t.Cleanup(func() { | |
| client.ImageRemove(ctx, img, types.ImageRemoveOptions{Force: true}) | |
| }) | |
| return img | |
| } | |
| // GetImageIDFromBody reads the image ID from the build response body. | |
| func GetImageIDFromBody(t *testing.T, body io.Reader) string { | |
| var ( | |
| jm jsonmessage.JSONMessage | |
| br types.BuildResult | |
| dec = json.NewDecoder(body) | |
| ) | |
| for { | |
| err := dec.Decode(&jm) | |
| if err == io.EOF { | |
| break | |
| } | |
| assert.NilError(t, err) | |
| if jm.Aux == nil { | |
| continue | |
| } | |
| assert.NilError(t, json.Unmarshal(*jm.Aux, &br)) | |
| assert.Assert(t, br.ID != "", "could not read image ID from build output") | |
| break | |
| } | |
| io.Copy(io.Discard, body) | |
| return br.ID | |
| } |