diff --git a/pkg/build/accounts.go b/pkg/build/accounts.go index 7d47d9504..2abc8e568 100644 --- a/pkg/build/accounts.go +++ b/pkg/build/accounts.go @@ -27,9 +27,7 @@ import ( "chainguard.dev/apko/pkg/passwd" ) -func (di *buildImplementation) appendGroup( - o *options.Options, groups []passwd.GroupEntry, group types.Group, -) []passwd.GroupEntry { +func appendGroup(o *options.Options, groups []passwd.GroupEntry, group types.Group) []passwd.GroupEntry { o.Logger().Printf("creating group %d(%s)", group.GID, group.GroupName) ge := passwd.GroupEntry{ @@ -57,9 +55,7 @@ func userToUserEntry(user types.User) passwd.UserEntry { } } -func (di *buildImplementation) MutateAccounts( - fsys apkfs.FullFS, o *options.Options, ic *types.ImageConfiguration, -) error { +func mutateAccounts(fsys apkfs.FullFS, o *options.Options, ic *types.ImageConfiguration) error { var eg errgroup.Group if len(ic.Accounts.Groups) != 0 { @@ -73,7 +69,7 @@ func (di *buildImplementation) MutateAccounts( } for _, g := range ic.Accounts.Groups { - gf.Entries = di.appendGroup(o, gf.Entries, g) + gf.Entries = appendGroup(o, gf.Entries, g) } if err := gf.WriteFile(fsys, path); err != nil { diff --git a/pkg/build/build.go b/pkg/build/build.go index ea4bfcc64..c27023ee5 100644 --- a/pkg/build/build.go +++ b/pkg/build/build.go @@ -21,23 +21,17 @@ import ( "context" "encoding/hex" "fmt" - "hash" "io" - "io/fs" "os" "runtime" "strconv" "strings" "time" - apkimpl "github.com/chainguard-dev/go-apk/pkg/apk" apkfs "github.com/chainguard-dev/go-apk/pkg/fs" - "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" v1types "github.com/google/go-containerregistry/pkg/v1/types" "github.com/hashicorp/go-multierror" - coci "github.com/sigstore/cosign/v2/pkg/oci" - "gitlab.alpinelinux.org/alpine/go/repository" "go.opentelemetry.io/otel" "gopkg.in/yaml.v3" @@ -53,7 +47,6 @@ import ( // architecture emulation, the s6 supervisor to add to the image, // build options, and the `buildImplementation`, which handles the actual build. type Context struct { - impl *buildImplementation // ImageConfiguration instructions to use for the build, normally from an apko.yaml file, but can be set directly. ImageConfiguration types.ImageConfiguration // ImageConfigFile path to the config file used, if any, to load the ImageConfiguration @@ -70,37 +63,6 @@ func (bc *Context) Summarize() { bc.ImageConfiguration.Summarize(bc.Logger()) } -// BuildTarball calls the underlying implementation's BuildTarball -// which takes the fully populated working directory and saves it to -// an OCI image layer tar.gz file. -func (bc *Context) BuildTarball(ctx context.Context) (string, hash.Hash, hash.Hash, int64, error) { - return bc.impl.BuildTarball(ctx, &bc.Options, bc.fs) -} - -// WriteIndex calls the underlying implementation's WriteIndex -// which takes the an index struct and saves it to the working directory. -func (bc *Context) WriteIndex(idx coci.SignedImageIndex) (string, int64, error) { - return bc.impl.WriteIndex(&bc.Options, idx) -} - -func (bc *Context) GenerateImageSBOM(ctx context.Context, arch types.Architecture, img coci.SignedImage) ([]types.SBOM, error) { - opts := bc.Options - opts.Arch = arch - return bc.impl.GenerateImageSBOM(ctx, &opts, &bc.ImageConfiguration, img) -} - -func (bc *Context) GenerateIndexSBOM(ctx context.Context, indexDigest name.Digest, imgs map[types.Architecture]coci.SignedImage) ([]types.SBOM, error) { - return bc.impl.GenerateIndexSBOM(ctx, &bc.Options, &bc.ImageConfiguration, indexDigest, imgs) -} - -func (bc *Context) GenerateSBOM(ctx context.Context, digest v1.Hash) error { - return bc.impl.GenerateSBOM(ctx, &bc.Options, &bc.ImageConfiguration, digest) -} - -func (bc *Context) InstalledPackages() ([]*apkimpl.InstalledPackage, error) { - return bc.impl.InstalledPackages(bc.fs, &bc.Options) -} - func (bc *Context) GetBuildDateEpoch() (time.Time, error) { if _, ok := os.LookupEnv("SOURCE_DATE_EPOCH"); ok { return bc.Options.SourceDateEpoch, nil @@ -118,9 +80,8 @@ func (bc *Context) GetBuildDateEpoch() (time.Time, error) { return bde, nil } -func (bc *Context) BuildImage(ctx context.Context) (fs.FS, error) { - // TODO(puerco): Point to final interface (see comment on buildImage fn) - if err := buildImage(ctx, bc.fs, bc.impl, &bc.Options, &bc.ImageConfiguration, bc.s6); err != nil { +func (bc *Context) BuildImage(ctx context.Context) error { + if err := bc.buildImage(ctx); err != nil { logger := bc.Options.Logger() logger.Debugf("buildImage failed: %v", err) b, err2 := yaml.Marshal(bc.ImageConfiguration) @@ -129,14 +90,9 @@ func (bc *Context) BuildImage(ctx context.Context) (fs.FS, error) { } else { logger.Debugf("image configuration:\n%s", string(b)) } - return nil, err + return err } - return bc.fs, nil -} - -func (bc *Context) BuildPackageList(ctx context.Context) (toInstall []*repository.RepositoryPackage, conflicts []string, err error) { - // TODO(puerco): Point to final interface (see comment on buildImage fn) - return buildPackageList(ctx, bc.fs, bc.impl, &bc.Options, &bc.ImageConfiguration) + return nil } func (bc *Context) Logger() log.Logger { @@ -157,7 +113,7 @@ func (bc *Context) BuildLayer(ctx context.Context) (string, v1.Layer, error) { bc.Summarize() // build image filesystem - if _, err := bc.BuildImage(ctx); err != nil { + if err := bc.BuildImage(ctx); err != nil { return "", nil, err } @@ -234,10 +190,7 @@ func New(workDir string, opts ...Option) (*Context, error) { fs := apkfs.DirFS(workDir, apkfs.WithCreateDir()) bc := Context{ Options: options.Default, - impl: &buildImplementation{ - workdirFS: fs, - }, - fs: fs, + fs: fs, } bc.Options.WorkDir = workDir @@ -275,16 +228,11 @@ func New(workDir string, opts ...Option) (*Context, error) { return &bc, nil } -// Refresh initializes the build process by calling the underlying implementation's -// Refresh(), which includes getting the chroot/proot jailed process executor (and -// possibly architecture emulator), sets those on the Context, and returns. +// Refresh initializes the build process by creating a new s6 context. func (bc *Context) Refresh() error { - s6, err := bc.impl.Refresh(&bc.Options) - if err != nil { - return err - } + bc.Options.TarballPath = "" - bc.s6 = s6 + bc.s6 = s6.New(bc.fs, bc.Logger()) return nil } diff --git a/pkg/build/build_implementation.go b/pkg/build/build_implementation.go index f50797c21..327a9062e 100644 --- a/pkg/build/build_implementation.go +++ b/pkg/build/build_implementation.go @@ -22,10 +22,8 @@ import ( "fmt" "hash" "io" - "io/fs" "os" "path/filepath" - "runtime" gzip "github.com/klauspost/pgzip" "go.opentelemetry.io/otel" @@ -36,40 +34,25 @@ import ( "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" ggcrtypes "github.com/google/go-containerregistry/pkg/v1/types" - coci "github.com/sigstore/cosign/v2/pkg/oci" + "github.com/sigstore/cosign/v2/pkg/oci" "gitlab.alpinelinux.org/alpine/go/repository" khash "sigs.k8s.io/release-utils/hash" chainguardAPK "chainguard.dev/apko/pkg/apk" "chainguard.dev/apko/pkg/build/types" "chainguard.dev/apko/pkg/options" - "chainguard.dev/apko/pkg/s6" "chainguard.dev/apko/pkg/sbom" soptions "chainguard.dev/apko/pkg/sbom/options" ) -const indexFile = "index.json" - -type buildImplementation struct { - workdirFS apkfs.FullFS -} - -func (di *buildImplementation) Refresh(o *options.Options) (*s6.Context, error) { - o.TarballPath = "" - - hostArch := types.ParseArchitecture(runtime.GOARCH) - - if !o.Arch.Compatible(hostArch) { - o.Logger().Warnf("%q requires QEMU binfmt emulation to be configured (not compatible with %q)", o.Arch, hostArch) - } - - return s6.New(di.workdirFS, o.Logger()), nil -} - -func (di *buildImplementation) BuildTarball(ctx context.Context, o *options.Options, fsys fs.FS) (string, hash.Hash, hash.Hash, int64, error) { +// BuildTarball takes the fully populated working directory and saves it to +// an OCI image layer tar.gz file. +func (bc *Context) BuildTarball(ctx context.Context) (string, hash.Hash, hash.Hash, int64, error) { ctx, span := otel.Tracer("apko").Start(ctx, "BuildTarball") defer span.End() + o := bc.Options + var outfile *os.File var err error @@ -99,7 +82,7 @@ func (di *buildImplementation) BuildTarball(ctx context.Context, o *options.Opti diffid := sha256.New() - if err := tw.WriteTar(ctx, io.MultiWriter(diffid, gzw), fsys); err != nil { + if err := tw.WriteTar(ctx, io.MultiWriter(diffid, gzw), bc.fs); err != nil { return "", nil, nil, 0, fmt.Errorf("failed to generate tarball for image: %w", err) } if err := gzw.Close(); err != nil { @@ -119,8 +102,11 @@ func (di *buildImplementation) BuildTarball(ctx context.Context, o *options.Opti return outfile.Name(), diffid, digest, stat.Size(), nil } -// GenerateImageSBOM generates an sbom for an image -func (di *buildImplementation) GenerateImageSBOM(ctx context.Context, o *options.Options, ic *types.ImageConfiguration, img coci.SignedImage) ([]types.SBOM, error) { +func (bc *Context) GenerateImageSBOM(ctx context.Context, arch types.Architecture, img oci.SignedImage) ([]types.SBOM, error) { + ic := bc.ImageConfiguration + o := bc.Options + o.Arch = arch + ctx, span := otel.Tracer("apko").Start(ctx, "GenerateImageSBOM") defer span.End() @@ -129,7 +115,7 @@ func (di *buildImplementation) GenerateImageSBOM(ctx context.Context, o *options return nil, nil } - s := newSBOM(di.workdirFS, o, ic) + s := newSBOM(bc.fs, &o, &ic) m, err := img.Manifest() if err != nil { @@ -178,16 +164,19 @@ func (di *buildImplementation) GenerateImageSBOM(ctx context.Context, o *options } // GenerateSBOM generates an SBOM for an apko layer -func (di *buildImplementation) GenerateSBOM(ctx context.Context, o *options.Options, ic *types.ImageConfiguration, digest v1.Hash) error { +func (bc *Context) GenerateSBOM(ctx context.Context, digest v1.Hash) error { ctx, span := otel.Tracer("apko").Start(ctx, "GenerateSBOM") defer span.End() + o := bc.Options + ic := bc.ImageConfiguration + if len(o.SBOMFormats) == 0 { o.Logger().Warnf("skipping SBOM generation") return nil } - s := newSBOM(di.workdirFS, o, ic) + s := newSBOM(bc.fs, &o, &ic) if err := s.SetLayerDigest(ctx, digest); err != nil { return fmt.Errorf("reading layer tar: %w", err) @@ -210,39 +199,15 @@ func (di *buildImplementation) GenerateSBOM(ctx context.Context, o *options.Opti return nil } -func (di *buildImplementation) InitializeApk(ctx context.Context, fsys apkfs.FullFS, o *options.Options, ic *types.ImageConfiguration) error { - apk, err := chainguardAPK.NewWithOptions(fsys, *o) - if err != nil { - return err - } - return apk.Initialize(ctx, ic) -} - -func (di *buildImplementation) InstallPackages(ctx context.Context, fsys apkfs.FullFS, o *options.Options, ic *types.ImageConfiguration) error { - apk, err := chainguardAPK.NewWithOptions(fsys, *o) - if err != nil { - return err - } - return apk.Install(ctx) -} - -func (di *buildImplementation) InstalledPackages(fsys apkfs.FullFS, o *options.Options) ([]*apkimpl.InstalledPackage, error) { - apk, err := chainguardAPK.NewWithOptions(fsys, *o) +func (bc *Context) InstalledPackages() ([]*apkimpl.InstalledPackage, error) { + apk, err := chainguardAPK.NewWithOptions(bc.fs, bc.Options) if err != nil { return nil, err } return apk.GetInstalled() } -func (di *buildImplementation) ResolvePackages(ctx context.Context, fsys apkfs.FullFS, o *options.Options, ic *types.ImageConfiguration) (toInstall []*repository.RepositoryPackage, conflicts []string, err error) { - apk, err := chainguardAPK.NewWithOptions(fsys, *o) - if err != nil { - return nil, nil, err - } - return apk.ResolvePackages(ctx) -} - -func (di *buildImplementation) AdditionalTags(fsys apkfs.FullFS, o *options.Options) error { +func additionalTags(fsys apkfs.FullFS, o *options.Options) error { at, err := chainguardAPK.AdditionalTags(fsys, *o) if err != nil { return err @@ -254,60 +219,45 @@ func (di *buildImplementation) AdditionalTags(fsys apkfs.FullFS, o *options.Opti return nil } -func (di *buildImplementation) BuildImage( - ctx context.Context, - o *options.Options, ic *types.ImageConfiguration, s6context *s6.Context, -) (fs.FS, error) { - if err := buildImage(ctx, di.workdirFS, di, o, ic, s6context); err != nil { - return nil, err - } - return di.workdirFS, nil -} - -// buildImage is a temporary function to make the fakes work. -// This function only installs everything onto a temporary filesystem path -// as defined by o.WorkDir. -// A later stage should add things like busybox symlinks or ldconfig, etc. -// after which it can be loaded into a tarball. -// -// TODO(puerco): In order to have a structure we can mock, we need to split -// image building to its own interface or split out to its own package. -func buildImage( - ctx context.Context, - fsys apkfs.FullFS, di *buildImplementation, o *options.Options, ic *types.ImageConfiguration, - s6context *s6.Context, -) error { +func (bc *Context) buildImage(ctx context.Context) error { ctx, span := otel.Tracer("apko").Start(ctx, "buildImage") defer span.End() + fsys, o, ic := bc.fs, &bc.Options, &bc.ImageConfiguration + o.Logger().Infof("doing pre-flight checks") - if err := di.ValidateImageConfiguration(ic); err != nil { + if err := ic.Validate(); err != nil { return fmt.Errorf("failed to validate configuration: %w", err) } o.Logger().Infof("building image fileystem in %s", o.WorkDir) - if err := di.InitializeApk(ctx, fsys, o, ic); err != nil { + apk, err := chainguardAPK.NewWithOptions(fsys, *o) + if err != nil { + return err + } + + if err := apk.Initialize(ctx, ic); err != nil { return fmt.Errorf("initializing apk: %w", err) } - if err := di.InstallPackages(ctx, fsys, o, ic); err != nil { + if err := apk.Install(ctx); err != nil { return fmt.Errorf("installing apk packages: %w", err) } - if err := di.AdditionalTags(fsys, o); err != nil { + if err := additionalTags(fsys, o); err != nil { return fmt.Errorf("adding additional tags: %w", err) } - if err := di.MutateAccounts(fsys, o, ic); err != nil { + if err := mutateAccounts(fsys, o, ic); err != nil { return fmt.Errorf("failed to mutate accounts: %w", err) } - if err := di.MutatePaths(fsys, o, ic); err != nil { + if err := mutatePaths(fsys, o, ic); err != nil { return fmt.Errorf("failed to mutate paths: %w", err) } - if err := di.GenerateOSRelease(fsys, o, ic); err != nil { + if err := GenerateOSRelease(fsys, o, ic); err != nil { if errors.Is(err, ErrOSReleaseAlreadyPresent) { o.Logger().Warnf("did not generate /etc/os-release: %v", err) } else { @@ -315,22 +265,22 @@ func buildImage( } } - if err := di.WriteSupervisionTree(s6context, ic); err != nil { + if err := bc.s6.WriteSupervisionTree(ic.Entrypoint.Services); err != nil { return fmt.Errorf("failed to write supervision tree: %w", err) } // add busybox symlinks - if err := di.InstallBusyboxLinks(fsys, o); err != nil { + if err := installBusyboxLinks(fsys, o); err != nil { return err } // add ldconfig links - if err := di.InstallLdconfigLinks(fsys); err != nil { + if err := installLdconfigLinks(fsys); err != nil { return err } // add necessary character devices - if err := di.InstallCharDevices(fsys); err != nil { + if err := installCharDevices(fsys); err != nil { return err } @@ -340,8 +290,10 @@ func buildImage( } // WriteIndex saves the index file from the given image configuration. -func (di *buildImplementation) WriteIndex(o *options.Options, idx coci.SignedImageIndex) (string, int64, error) { - outfile := filepath.Join(o.TempDir(), indexFile) +func (bc *Context) WriteIndex(idx oci.SignedImageIndex) (string, int64, error) { + o := bc.Options + + outfile := filepath.Join(o.TempDir(), "index.json") b, err := idx.RawManifest() if err != nil { @@ -360,22 +312,24 @@ func (di *buildImplementation) WriteIndex(o *options.Options, idx coci.SignedIma return outfile, stat.Size(), nil } -func buildPackageList( - ctx context.Context, - fsys apkfs.FullFS, di *buildImplementation, o *options.Options, ic *types.ImageConfiguration, -) (toInstall []*repository.RepositoryPackage, conflicts []string, err error) { +func (bc *Context) BuildPackageList(ctx context.Context) (toInstall []*repository.RepositoryPackage, conflicts []string, err error) { + fsys, o, ic := bc.fs, &bc.Options, &bc.ImageConfiguration o.Logger().Infof("doing pre-flight checks") - if err := di.ValidateImageConfiguration(ic); err != nil { + if err := ic.Validate(); err != nil { return toInstall, conflicts, fmt.Errorf("failed to validate configuration: %w", err) } o.Logger().Infof("building apk info in %s", o.WorkDir) - if err := di.InitializeApk(ctx, fsys, o, ic); err != nil { + apk, err := chainguardAPK.NewWithOptions(fsys, *o) + if err != nil { + return toInstall, conflicts, fmt.Errorf("initializing apk: %w", err) + } + if err := apk.Initialize(ctx, ic); err != nil { return toInstall, conflicts, fmt.Errorf("initializing apk: %w", err) } - if toInstall, conflicts, err = di.ResolvePackages(ctx, fsys, o, ic); err != nil { + if toInstall, conflicts, err = apk.ResolvePackages(ctx); err != nil { return toInstall, conflicts, fmt.Errorf("resolving apk packages: %w", err) } o.Logger().Infof("finished gathering apk info in %s", o.WorkDir) @@ -414,20 +368,19 @@ func newSBOM(fsys apkfs.FullFS, o *options.Options, ic *types.ImageConfiguration return s } -func (di *buildImplementation) GenerateIndexSBOM( - ctx context.Context, - o *options.Options, ic *types.ImageConfiguration, - indexDigest name.Digest, imgs map[types.Architecture]coci.SignedImage, -) ([]types.SBOM, error) { +func (bc *Context) GenerateIndexSBOM(ctx context.Context, indexDigest name.Digest, imgs map[types.Architecture]oci.SignedImage) ([]types.SBOM, error) { _, span := otel.Tracer("apko").Start(ctx, "GenerateIndexSBOM") defer span.End() + o := bc.Options + ic := bc.ImageConfiguration + if len(o.SBOMFormats) == 0 { o.Logger().Warnf("skipping index SBOM generation") return nil, nil } - s := newSBOM(di.workdirFS, o, ic) + s := newSBOM(bc.fs, &o, &ic) o.Logger().Infof("Generating index SBOM") // Add the image digest diff --git a/pkg/build/busybox.go b/pkg/build/busybox.go index 5d7e86b8f..b03490929 100644 --- a/pkg/build/busybox.go +++ b/pkg/build/busybox.go @@ -53,7 +53,7 @@ var busyboxLinks map[string][]string // note that it changes based on version of busybox, // so this should be updated to match busybox version. -func (di *buildImplementation) InstallBusyboxLinks(fsys apkfs.FullFS, o *options.Options) error { +func installBusyboxLinks(fsys apkfs.FullFS, o *options.Options) error { // does busybox exist? if not, do not bother with symlinks if _, err := fsys.Stat(busybox); err != nil { if !errors.Is(err, os.ErrNotExist) { diff --git a/pkg/build/busybox_test.go b/pkg/build/busybox_test.go index 57c95efec..dfa5dfd89 100644 --- a/pkg/build/busybox_test.go +++ b/pkg/build/busybox_test.go @@ -50,12 +50,11 @@ func TestInstallBusyboxSymlinks(t *testing.T) { } t.Run("with busybox-paths manifest", func(t *testing.T) { var err error - di := &buildImplementation{} fsys := apkfs.NewMemFS() buildBusybox(fsys, t) err = fsys.WriteFile("/etc/busybox-paths.d/busybox", []byte(strings.Join(fakeLinks, "\n")), 0755) require.NoError(t, err) - err = di.InstallBusyboxLinks(fsys, &options.Options{}) + err = installBusyboxLinks(fsys, &options.Options{}) require.NoError(t, err) for _, link := range fakeLinks { _, err := fsys.Lstat(link) @@ -71,10 +70,9 @@ func TestInstallBusyboxSymlinks(t *testing.T) { }) t.Run("without busybox-paths manifest", func(t *testing.T) { var err error - di := &buildImplementation{} fsys := apkfs.NewMemFS() buildBusybox(fsys, t) - err = di.InstallBusyboxLinks(fsys, &options.Options{}) + err = installBusyboxLinks(fsys, &options.Options{}) require.NoError(t, err) for _, link := range fakeLinks { _, err := fsys.Lstat(link) diff --git a/pkg/build/chardevices.go b/pkg/build/chardevices.go index 4f159b6e1..87e709ce4 100644 --- a/pkg/build/chardevices.go +++ b/pkg/build/chardevices.go @@ -8,7 +8,7 @@ import ( "golang.org/x/sys/unix" ) -func (di *buildImplementation) InstallCharDevices(fsys apkfs.FullFS) error { +func installCharDevices(fsys apkfs.FullFS) error { devices := []struct { path string major uint32 diff --git a/pkg/build/image_builder.go b/pkg/build/image_builder.go deleted file mode 100644 index f85612912..000000000 --- a/pkg/build/image_builder.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2022, 2023 Chainguard, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package build - -import ( - "fmt" - - "chainguard.dev/apko/pkg/build/types" - "chainguard.dev/apko/pkg/s6" -) - -func (di *buildImplementation) ValidateImageConfiguration(ic *types.ImageConfiguration) error { - if err := ic.Validate(); err != nil { - return fmt.Errorf("failed to validate configuration: %w", err) - } - return nil -} - -func (di *buildImplementation) WriteSupervisionTree( - s6context *s6.Context, imageConfig *types.ImageConfiguration, -) error { - // write service supervision tree - s6m := make(map[interface{}]interface{}, len(imageConfig.Entrypoint.Services)) - for k, v := range imageConfig.Entrypoint.Services { - s6m[k] = v - } - if err := s6context.WriteSupervisionTree(s6m); err != nil { - return fmt.Errorf("failed to write supervision tree: %w", err) - } - return nil -} diff --git a/pkg/build/ldconfig.go b/pkg/build/ldconfig.go index 0d174055e..1a67929c8 100644 --- a/pkg/build/ldconfig.go +++ b/pkg/build/ldconfig.go @@ -101,7 +101,7 @@ func getSoname(vfs apkfs.OpenReaderAtFS, path string) (string, error) { return dynStrings[0], nil } -func (di *buildImplementation) InstallLdconfigLinks(fsys apkfs.FullFS) error { +func installLdconfigLinks(fsys apkfs.FullFS) error { linksMap, err := ldconfig(fsys, "/lib") if err != nil { return err diff --git a/pkg/build/os-release.go b/pkg/build/os-release.go index 3f76ddfd9..b33fb862c 100644 --- a/pkg/build/os-release.go +++ b/pkg/build/os-release.go @@ -26,9 +26,7 @@ import ( "chainguard.dev/apko/pkg/options" ) -func maybeGenerateVendorReleaseFile( - fsys apkfs.FullFS, ic *types.ImageConfiguration, -) error { +func maybeGenerateVendorReleaseFile(fsys apkfs.FullFS, ic *types.ImageConfiguration) error { if ic.OSRelease.ID == "" || ic.OSRelease.VersionID == "" { return nil } @@ -54,9 +52,7 @@ func maybeGenerateVendorReleaseFile( return nil } -func (di *buildImplementation) GenerateOSRelease( - fsys apkfs.FullFS, o *options.Options, ic *types.ImageConfiguration, -) error { +func GenerateOSRelease(fsys apkfs.FullFS, o *options.Options, ic *types.ImageConfiguration) error { path := filepath.Join("etc", "os-release") osReleaseExists := true diff --git a/pkg/build/paths.go b/pkg/build/paths.go index 8c243f7cf..cd2361a6c 100644 --- a/pkg/build/paths.go +++ b/pkg/build/paths.go @@ -138,9 +138,7 @@ func mutateSymLink(fsys apkfs.FullFS, o *options.Options, mut types.PathMutation return nil } -func (di *buildImplementation) MutatePaths( - fsys apkfs.FullFS, o *options.Options, ic *types.ImageConfiguration, -) error { +func mutatePaths(fsys apkfs.FullFS, o *options.Options, ic *types.ImageConfiguration) error { for _, mut := range ic.Paths { pm, ok := pathMutators[mut.Type] if !ok { diff --git a/pkg/s6/s6.go b/pkg/s6/s6.go index b57b42c30..a6cd79839 100644 --- a/pkg/s6/s6.go +++ b/pkg/s6/s6.go @@ -20,7 +20,7 @@ import ( "chainguard.dev/apko/pkg/log" ) -type Services map[interface{}]interface{} +type Services map[string]string type Context struct { fs apkfs.FullFS diff --git a/pkg/s6/supervision_tree.go b/pkg/s6/supervision_tree.go index 1d6eaf01c..37e018e29 100644 --- a/pkg/s6/supervision_tree.go +++ b/pkg/s6/supervision_tree.go @@ -15,7 +15,6 @@ package s6 import ( - "errors" "fmt" "os" "path/filepath" @@ -64,18 +63,9 @@ func (sc *Context) WriteSupervisionTree(services Services) error { sc.Log.Infof("generating supervision tree") // generate the leaves - for service, descriptor := range services { - service, ok := service.(string) - if !ok { - return errors.New("service name is not string") - } - - if svccmd, ok := descriptor.(string); ok { - if err := sc.WriteSupervisionServiceSimple(service, svccmd); err != nil { - return err - } - } else { - return errors.New("complex services are not yet supported") + for service, svccmd := range services { + if err := sc.WriteSupervisionServiceSimple(service, svccmd); err != nil { + return err } }