From a655a35e6883a0c3d46be3fa050c361ad8b4b04e Mon Sep 17 00:00:00 2001 From: Timofey Kirillov Date: Wed, 1 Jun 2022 17:31:21 +0300 Subject: [PATCH] test(dockerfile): test digest change when RUN with --mount from another stage used Signed-off-by: Timofey Kirillov --- pkg/build/stage/dependencies_test.go | 2 +- pkg/build/stage/dockerfile_test.go | 52 ++++++++++++++++++++++++++-- pkg/build/stage/stubs_test.go | 26 +++++++++++++- 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/pkg/build/stage/dependencies_test.go b/pkg/build/stage/dependencies_test.go index 28bde03b9d..b71d0758e2 100644 --- a/pkg/build/stage/dependencies_test.go +++ b/pkg/build/stage/dependencies_test.go @@ -15,7 +15,7 @@ var _ = Describe("DependenciesStage", func() { func(data TestDependencies) { ctx := context.Background() - conveyor := NewConveyorStubForDependencies(NewGiterminismManagerStub(NewLocalGitRepoStub("9d8059842b6fde712c58315ca0ab4713d90761c0")), data.Dependencies) + conveyor := NewConveyorStubForDependencies(NewGiterminismManagerStub(NewLocalGitRepoStub("9d8059842b6fde712c58315ca0ab4713d90761c0"), NewGiterminismInspectorStub()), data.Dependencies) containerBackend := NewContainerBackendMock() stage := newDependenciesStage(nil, GetConfigDependencies(data.Dependencies), "example-stage", &NewBaseStageOptions{ diff --git a/pkg/build/stage/dockerfile_test.go b/pkg/build/stage/dockerfile_test.go index b0be15bb82..8526e8b46f 100644 --- a/pkg/build/stage/dockerfile_test.go +++ b/pkg/build/stage/dockerfile_test.go @@ -64,7 +64,7 @@ var _ = Describe("DockerfileStage", func() { func(data TestDockerfileDependencies) { ctx := context.Background() - conveyor := NewConveyorStubForDependencies(NewGiterminismManagerStub(NewLocalGitRepoStub("9d8059842b6fde712c58315ca0ab4713d90761c0")), data.TestDependencies.Dependencies) + conveyor := NewConveyorStubForDependencies(NewGiterminismManagerStub(NewLocalGitRepoStub("9d8059842b6fde712c58315ca0ab4713d90761c0"), NewGiterminismInspectorStub()), data.TestDependencies.Dependencies) containerBackend := NewContainerBackendMock() dockerStages, dockerMetaArgs := testDockerfileToDockerStages(data.Dockerfile) @@ -289,7 +289,7 @@ RUN echo hello ctx := context.Background() - conveyor := NewConveyorStubForDependencies(NewGiterminismManagerStub(NewLocalGitRepoStub("9d8059842b6fde712c58315ca0ab4713d90761c0")), nil) + conveyor := NewConveyorStubForDependencies(NewGiterminismManagerStub(NewLocalGitRepoStub("9d8059842b6fde712c58315ca0ab4713d90761c0"), NewGiterminismInspectorStub()), nil) dockerStages, dockerMetaArgs := testDockerfileToDockerStages(dockerfile) @@ -303,6 +303,54 @@ RUN echo hello Expect(IsErrInvalidBaseImage(err)).To(BeTrue()) }) }) + + When("Dockerfile uses run with mount from another stage", func() { + It("should change dockerfile stage digest when base stage context has changed", func() { + dockerfile := []byte(` +FROM alpnie:latest AS build +WORKDIR /usr/local/test_project +COPY . . +RUN mkdir -p dist && \ + cp -v main.py dist/prog.py + +FROM alpine:latest +RUN --mount=type=bind,from=build,source=/usr/local/test_project/dist,target=/usr/test_project/dist \ + cp -v /usr/test_project/dist/prog.py /usr/local/bin/prog +`) + + ctx := context.Background() + + gitRepoStub := NewLocalGitRepoStub("9d8059842b6fde712c58315ca0ab4713d90761c0") + + conveyor := NewConveyorStubForDependencies(NewGiterminismManagerStub(gitRepoStub, NewGiterminismInspectorStub()), nil) + + dockerStages, dockerMetaArgs := testDockerfileToDockerStages(dockerfile) + + stage := newTestDockerfileStage(dockerfile, "", nil, dockerStages, dockerMetaArgs, nil) + + containerBackend := NewContainerBackendMock() + + img := NewLegacyImageStub() + stageBuilder := stage_builder.NewStageBuilder(containerBackend, nil, img) + stageImage := &StageImage{ + Image: img, + Builder: stageBuilder, + } + + { + digest, err := stage.GetDependencies(ctx, conveyor, containerBackend, nil, stageImage) + Expect(err).To(Succeed()) + Expect(digest).To(Equal("65d219096bc3718c101995b00584d700de791027f2e2ca00635e428932478a1c")) + } + + gitRepoStub.headCommitHash = "23a0884072c0d31b7c42dfaa7f0772cbfa33ec75" + { + digest, err := stage.GetDependencies(ctx, conveyor, containerBackend, nil, stageImage) + Expect(err).To(Succeed()) + Expect(digest).To(Equal("beb818f2c49f6501194c72449aff59e80be61b405ef39581b01dbf68da927609")) + } + }) + }) }) type TestDockerfileDependencies struct { diff --git a/pkg/build/stage/stubs_test.go b/pkg/build/stage/stubs_test.go index 0ac905bcdc..a6ad6d718b 100644 --- a/pkg/build/stage/stubs_test.go +++ b/pkg/build/stage/stubs_test.go @@ -3,6 +3,8 @@ package stage import ( "context" + "github.com/werf/werf/pkg/path_matcher" + v1 "github.com/google/go-containerregistry/pkg/v1" . "github.com/onsi/gomega" @@ -105,15 +107,29 @@ func (c *ConveyorStub) GiterminismManager() giterminism_manager.Interface { return c.giterminismManager } +type GiterminismInspectorStub struct { + giterminism_manager.Inspector +} + +func NewGiterminismInspectorStub() *GiterminismInspectorStub { + return &GiterminismInspectorStub{} +} + +func (inspector *GiterminismInspectorStub) InspectBuildContextFiles(ctx context.Context, matcher path_matcher.PathMatcher) error { + return nil +} + type GiterminismManagerStub struct { giterminism_manager.Interface + inspector giterminism_manager.Inspector localGitRepo git_repo.GitRepo } -func NewGiterminismManagerStub(localGitRepo git_repo.GitRepo) *GiterminismManagerStub { +func NewGiterminismManagerStub(localGitRepo git_repo.GitRepo, inspector giterminism_manager.Inspector) *GiterminismManagerStub { return &GiterminismManagerStub{ localGitRepo: localGitRepo, + inspector: inspector, } } @@ -135,6 +151,10 @@ func (manager *GiterminismManagerStub) HeadCommit() string { return commit } +func (manager *GiterminismManagerStub) Inspector() giterminism_manager.Inspector { + return manager.inspector +} + type LocalGitRepoStub struct { git_repo.GitRepo @@ -155,6 +175,10 @@ func (repo *LocalGitRepoStub) GetOrCreateArchive(ctx context.Context, opts git_r return NewGitRepoArchiveStub(), nil } +func (repo *LocalGitRepoStub) GetOrCreateChecksum(ctx context.Context, opts git_repo.ChecksumOptions) (string, error) { + return repo.headCommitHash, nil +} + type GitRepoArchiveStub struct { git_repo.Archive }