diff --git a/pkg/compiler/compiler.go b/pkg/compiler/compiler.go index f7627a16..a7b12c74 100644 --- a/pkg/compiler/compiler.go +++ b/pkg/compiler/compiler.go @@ -357,8 +357,15 @@ func (cs *LuetCompiler) compileWithImage(image, buildertaggedImage, packageImage var diffs []ArtifactLayer var artifact Artifact + unpack := p.ImageUnpack() - if !p.ImageUnpack() { + // If package_dir was specified in the spec, we want to treat the content of the directory + // as the root of our archive. ImageUnpack is implied to be true. override it + if p.GetPackageDir() != "" { + unpack = true + } + + if !unpack { // we have to get diffs only if spec is not unpacked diffs, err = cs.Backend.Changes(p.Rel(p.GetPackage().GetFingerPrint()+"-builder.image.tar"), p.Rel(p.GetPackage().GetFingerPrint()+".image.tar")) if err != nil { @@ -395,7 +402,12 @@ func (cs *LuetCompiler) compileWithImage(image, buildertaggedImage, packageImage } } - if p.ImageUnpack() { + if unpack { + + if p.GetPackageDir() != "" { + Info(":tophat: Packing from output dir", p.GetPackageDir()) + rootfs = filepath.Join(rootfs, p.GetPackageDir()) + } if len(p.GetIncludes()) > 0 { // strip from includes diff --git a/pkg/compiler/compiler_test.go b/pkg/compiler/compiler_test.go index 6a2e799e..36f65de6 100644 --- a/pkg/compiler/compiler_test.go +++ b/pkg/compiler/compiler_test.go @@ -615,6 +615,61 @@ var _ = Describe("Compiler", func() { }) }) + Context("Packages which conents are a package folder", func() { + It("Compiles it in parallel", func() { + generalRecipe := tree.NewCompilerRecipe(pkg.NewInMemoryDatabase(false)) + + err := generalRecipe.Load("../../tests/fixtures/package_dir") + Expect(err).ToNot(HaveOccurred()) + + Expect(len(generalRecipe.GetDatabase().GetPackages())).To(Equal(2)) + + compiler := NewLuetCompiler(sd.NewSimpleDockerBackend(), generalRecipe.GetDatabase(), NewDefaultCompilerOptions()) + + spec, err := compiler.FromPackage(&pkg.DefaultPackage{ + Name: "dironly", + Category: "test", + Version: "1.0", + }) + Expect(err).ToNot(HaveOccurred()) + + spec2, err := compiler.FromPackage(&pkg.DefaultPackage{ + Name: "dironly_filter", + Category: "test", + Version: "1.0", + }) + Expect(err).ToNot(HaveOccurred()) + + Expect(spec.GetPackage().GetPath()).ToNot(Equal("")) + + tmpdir, err := ioutil.TempDir("", "tree") + Expect(err).ToNot(HaveOccurred()) + defer os.RemoveAll(tmpdir) // clean up + tmpdir2, err := ioutil.TempDir("", "tree2") + Expect(err).ToNot(HaveOccurred()) + defer os.RemoveAll(tmpdir2) // clean up + + spec.SetOutputPath(tmpdir) + spec2.SetOutputPath(tmpdir2) + + compiler.SetConcurrency(1) + + artifacts, errs := compiler.CompileParallel(false, NewLuetCompilationspecs(spec, spec2)) + Expect(errs).To(BeNil()) + Expect(len(artifacts)).To(Equal(2)) + Expect(len(artifacts[0].GetDependencies())).To(Equal(0)) + + Expect(helpers.Untar(spec.Rel("dironly-test-1.0.package.tar"), tmpdir, false)).ToNot(HaveOccurred()) + Expect(helpers.Exists(spec.Rel("test1"))).To(BeTrue()) + Expect(helpers.Exists(spec.Rel("test2"))).To(BeTrue()) + + Expect(helpers.Untar(spec2.Rel("dironly_filter-test-1.0.package.tar"), tmpdir2, false)).ToNot(HaveOccurred()) + Expect(helpers.Exists(spec2.Rel("test5"))).To(BeTrue()) + Expect(helpers.Exists(spec2.Rel("test6"))).ToNot(BeTrue()) + Expect(helpers.Exists(spec2.Rel("artifact42"))).ToNot(BeTrue()) + }) + }) + Context("Compression", func() { It("Builds packages in gzip", func() { generalRecipe := tree.NewCompilerRecipe(pkg.NewInMemoryDatabase(false)) diff --git a/pkg/compiler/interface.go b/pkg/compiler/interface.go index 0fc1a01d..9a4c22c6 100644 --- a/pkg/compiler/interface.go +++ b/pkg/compiler/interface.go @@ -168,6 +168,9 @@ type CompilationSpec interface { GetRetrieve() []string CopyRetrieves(dest string) error + + SetPackageDir(string) + GetPackageDir() string } type CompilationSpecs interface { diff --git a/pkg/compiler/spec.go b/pkg/compiler/spec.go index 5a50a0d7..47e3e830 100644 --- a/pkg/compiler/spec.go +++ b/pkg/compiler/spec.go @@ -95,6 +95,7 @@ type LuetCompilationSpec struct { Seed string `json:"seed"` Package *pkg.DefaultPackage `json:"package"` SourceAssertion solver.PackagesAssertions `json:"-"` + PackageDir string `json:"package_dir" yaml:"package_dir"` Retrieve []string `json:"retrieve"` @@ -123,6 +124,14 @@ func (cs *LuetCompilationSpec) GetPackage() pkg.Package { return cs.Package } +func (cs *LuetCompilationSpec) GetPackageDir() string { + return cs.PackageDir +} + +func (cs *LuetCompilationSpec) SetPackageDir(s string) { + cs.PackageDir = s +} + func (cs *LuetCompilationSpec) BuildSteps() []string { return cs.Steps } diff --git a/tests/fixtures/package_dir/dironly/build.yaml b/tests/fixtures/package_dir/dironly/build.yaml new file mode 100644 index 00000000..8d1533ba --- /dev/null +++ b/tests/fixtures/package_dir/dironly/build.yaml @@ -0,0 +1,7 @@ +image: "alpine" +prelude: + - mkdir /foo +steps: + - echo artifact5 > /foo/test1 + - echo artifact6 > /foo/test2 +package_dir: /foo \ No newline at end of file diff --git a/tests/fixtures/package_dir/dironly/definition.yaml b/tests/fixtures/package_dir/dironly/definition.yaml new file mode 100644 index 00000000..3a531522 --- /dev/null +++ b/tests/fixtures/package_dir/dironly/definition.yaml @@ -0,0 +1,3 @@ +category: "test" +name: "dironly" +version: "1.0" diff --git a/tests/fixtures/package_dir/dironly_filter/build.yaml b/tests/fixtures/package_dir/dironly_filter/build.yaml new file mode 100644 index 00000000..9d4befa7 --- /dev/null +++ b/tests/fixtures/package_dir/dironly_filter/build.yaml @@ -0,0 +1,11 @@ +image: "alpine" +prelude: + - mkdir /foo + - chmod +x generate.sh +steps: + - echo artifact5 > /foo/test5 + - echo artifact6 > /foo/test6 + - ./generate.sh +package_dir: /foo +includes: +- /test5 \ No newline at end of file diff --git a/tests/fixtures/package_dir/dironly_filter/definition.yaml b/tests/fixtures/package_dir/dironly_filter/definition.yaml new file mode 100644 index 00000000..1591598f --- /dev/null +++ b/tests/fixtures/package_dir/dironly_filter/definition.yaml @@ -0,0 +1,3 @@ +category: "test" +name: "dironly_filter" +version: "1.0" diff --git a/tests/fixtures/package_dir/dironly_filter/generate.sh b/tests/fixtures/package_dir/dironly_filter/generate.sh new file mode 100644 index 00000000..e0d5ecdc --- /dev/null +++ b/tests/fixtures/package_dir/dironly_filter/generate.sh @@ -0,0 +1 @@ +echo generated > /foo/artifact42