Skip to content

Commit

Permalink
Fixes rebase of remote images
Browse files Browse the repository at this point in the history
* pulls in new lifecycle with updated run-image metadata

Signed-off-by: Emily Casey <[email protected]>
  • Loading branch information
ekcasey committed Oct 25, 2018
1 parent 761bf84 commit c52bcc6
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 78 deletions.
3 changes: 2 additions & 1 deletion acceptance/acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ func testPack(t *testing.T, when spec.G, it spec.S) {
}, spec.Parallel(), spec.Report(report.Terminal{}))
}, spec.Parallel(), spec.Report(report.Terminal{}))

when.Pend("pack rebase", func() {
when("pack rebase", func() {
var repoName, containerName, runBefore, runAfter string
var buildAndSetRunImage func(runImage, contents1, contents2 string)
var rootContents1 func() string
Expand Down Expand Up @@ -311,6 +311,7 @@ func testPack(t *testing.T, when spec.G, it spec.S) {
cmd = exec.Command(pack, "rebase", repoName, "--publish")
cmd.Env = append(os.Environ(), "HOME="+homeDir)
run(t, cmd)
run(t, exec.Command("docker", "pull", repoName))

assertEq(t, rootContents1(), "contents-after-1\n")
})
Expand Down
31 changes: 29 additions & 2 deletions build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,11 @@ func testBuild(t *testing.T, when spec.G, it spec.S) {
})

when("#Export", func() {
var group *lifecycle.BuildpackGroup
var (
group *lifecycle.BuildpackGroup
runSHA string
runTopLayer string
)
it.Before(func() {
tmpDir, err := ioutil.TempDir("/tmp", "pack.build.export.")
assertNil(t, err)
Expand All @@ -536,6 +540,9 @@ func testBuild(t *testing.T, when spec.G, it spec.S) {
{ID: "io.buildpacks.samples.nodejs", Version: "0.0.1"},
},
}
assertNil(t, exec.Command("docker", "pull", "packs/run").Run())
runSHA = imageSHA(t, subject.RunImage)
runTopLayer = topLayer(t, subject.RunImage)
})
it.After(func() { exec.Command("docker", "rmi", subject.RepoName).Run() })

Expand Down Expand Up @@ -577,6 +584,8 @@ func testBuild(t *testing.T, when spec.G, it spec.S) {
assertNil(t, err)
assertNil(t, json.Unmarshal(metadataJSON, &metadata))

assertEq(t, metadata.RunImage.SHA, runSHA)
assertEq(t, metadata.RunImage.TopLayer, runTopLayer)
assertContains(t, metadata.App.SHA, "sha256:")
assertContains(t, metadata.Config.SHA, "sha256:")
assertEq(t, len(metadata.Buildpacks), 1)
Expand Down Expand Up @@ -613,7 +622,8 @@ func testBuild(t *testing.T, when spec.G, it spec.S) {
assertNil(t, err)
assertNil(t, json.Unmarshal(metadataJSON, &metadata))

assertEq(t, metadata.RunImage.Name, "packs/run")
assertEq(t, metadata.RunImage.SHA, runSHA)
assertEq(t, metadata.RunImage.TopLayer, runTopLayer)
assertContains(t, metadata.App.SHA, "sha256:")
assertContains(t, metadata.Config.SHA, "sha256:")
assertEq(t, len(metadata.Buildpacks), 1)
Expand Down Expand Up @@ -787,3 +797,20 @@ func readFromDocker(t *testing.T, volume, path string) string {
assertNil(t, cmd.Run())
return buf.String()
}

func imageSHA(t *testing.T, repoName string) string {
digests := make([]string, 1, 1)
data, err := exec.Command("docker", "inspect", repoName, "--format", `{{json .RepoDigests}}`).Output()
json.Unmarshal(data, &digests)
sha := strings.Split(digests[0], "@")[1]
assertNil(t, err)
return sha
}

func topLayer(t *testing.T, repoName string) string {
layers := make([]string, 1, 1)
layerData, err := exec.Command("docker", "inspect", repoName, "--format", `{{json .RootFS.Layers}}`).Output()
assertNil(t, err)
json.Unmarshal(layerData, &layers)
return strings.TrimSpace(layers[len(layers) - 1])
}
37 changes: 28 additions & 9 deletions exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,25 +119,30 @@ func exportDaemon(cli Docker, buildpacks []string, workspaceVolume, repoName, ru
if err != nil {
return errors.Wrap(err, "inspect image to find layers")
}
runImageDigest, err := daemonImageDigest(cli, runImage)
if err != nil {
return errors.Wrap(err, "find run image digest")
}

layerIDX := len(i.RootFS.Layers) - len(layerNames)
metadata := packs.BuildMetadata{
RunImage: packs.RunImageMetadata{
Name: runImage,
SHA: i.RootFS.Layers[layerIDX-3],
metadata := lifecycle.AppImageMetadata{
RunImage: lifecycle.RunImageMetadata{
SHA: runImageDigest,
TopLayer: i.RootFS.Layers[layerIDX-3],
},
App: packs.AppMetadata{
App: lifecycle.AppMetadata{
SHA: i.RootFS.Layers[layerIDX-2],
},
Config: packs.ConfigMetadata{
Config: lifecycle.ConfigMetadata{
SHA: i.RootFS.Layers[layerIDX-1],
},
Buildpacks: []packs.BuildpackMetadata{},
Buildpacks: []lifecycle.BuildpackMetadata{},
}
for _, buildpack := range buildpacks {
data := packs.BuildpackMetadata{Key: buildpack, Layers: make(map[string]packs.LayerMetadata)}
data := lifecycle.BuildpackMetadata{ID: buildpack, Layers: make(map[string]lifecycle.LayerMetadata)}
for _, layer := range layerNames {
if layer.buildpack == buildpack {
data.Layers[layer.layer] = packs.LayerMetadata{
data.Layers[layer.layer] = lifecycle.LayerMetadata{
SHA: i.RootFS.Layers[layerIDX],
Data: layer.data,
}
Expand All @@ -156,6 +161,20 @@ func exportDaemon(cli Docker, buildpacks []string, workspaceVolume, repoName, ru

return nil
}
func daemonImageDigest(cli Docker, repoName string) (string, error) {
i, _, err := cli.ImageInspectWithRaw(context.Background(), repoName)
if err != nil {
return "", errors.Wrap(err, "inspect image")
}
if len(i.RepoDigests) < 1 {
return "", errors.Wrap(err, "missing digest")
}
parts := strings.Split(i.RepoDigests[0], "@")
if len(parts) != 2 {
return "", errors.Wrap(err, "bad digest")
}
return parts[1], nil
}

func addLabelToImage(cli Docker, repoName string, labels map[string]string, stdout io.Writer) error {
dockerfile := "FROM " + repoName + "\n"
Expand Down
12 changes: 6 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@ module github.com/buildpack/pack

require (
github.com/BurntSushi/toml v0.3.1
github.com/buildpack/lifecycle v0.0.0-20181019160327-83f9973cd1db
github.com/buildpack/lifecycle v0.0.0-20181025145258-a42887a7d29f
github.com/buildpack/packs v0.0.0-20180824001031-aa30a412923763df37e83f14a6e4e0fe07e11f25
github.com/docker/docker v0.7.3-0.20180531152204-71cd53e4a197
github.com/docker/go-connections v0.4.0
github.com/golang/mock v1.1.1
github.com/google/go-cmp v0.2.0
github.com/google/go-containerregistry v0.0.0-20181017202637-9ed1bc3a410d
github.com/google/go-containerregistry v0.0.0-20181023232207-eb57122f1bf9
github.com/google/uuid v0.0.0-20171129191014-dec09d789f3d
github.com/pkg/errors v0.8.0
github.com/sclevine/spec v1.0.0
github.com/spf13/cobra v0.0.3
github.com/spf13/pflag v1.0.2 // indirect
golang.org/x/net v0.0.0-20181017193950-04a2e542c03f // indirect
golang.org/x/sys v0.0.0-20181019160139-8e24a49d80f8 // indirect
github.com/spf13/pflag v1.0.3 // indirect
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519 // indirect
golang.org/x/sys v0.0.0-20181025063200-d989b31c8746 // indirect
)

replace github.com/google/go-containerregistry v0.0.0-20181017202637-9ed1bc3a410d => github.com/dgodd/go-containerregistry v0.0.0-20180912122137-611aad063148a69435dccd3cf8475262c11814f6
replace github.com/google/go-containerregistry v0.0.0-20181023232207-eb57122f1bf9 => github.com/dgodd/go-containerregistry v0.0.0-20180912122137-611aad063148a69435dccd3cf8475262c11814f6
Loading

0 comments on commit c52bcc6

Please sign in to comment.