From 958f95f634fbdb2a3de802a1d6225b8b0635d1de Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 27 Jan 2025 18:01:09 +0100 Subject: [PATCH] progress: set --cache-max-size in osbuild This commit allows controlling the `osbuild --cache-max-size` option. By default it will set the cache to 20GiB but allows this to be controlled by the user. Thanks to Simon for raising this. --- pkg/progress/progress.go | 52 ++++++++++++++++++----------------- pkg/progress/progress_test.go | 18 ++++++++++++ 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/pkg/progress/progress.go b/pkg/progress/progress.go index 371ba36..255d797 100644 --- a/pkg/progress/progress.go +++ b/pkg/progress/progress.go @@ -16,6 +16,7 @@ import ( "github.com/mattn/go-isatty" "github.com/sirupsen/logrus" + "github.com/osbuild/images/pkg/datasizes" "github.com/osbuild/images/pkg/osbuild" ) @@ -328,6 +329,8 @@ type OSBuildOptions struct { // BuildLog writes the osbuild output to the given writer BuildLog io.Writer + + CacheMaxSize int64 } // XXX: merge variant back into images/pkg/osbuild/osbuild-exec.go @@ -351,6 +354,26 @@ func RunOSBuild(pb ProgressBar, manifest []byte, exports []string, opts *OSBuild } } +func newOsbuildCmd(manifest []byte, exports []string, opts *OSBuildOptions) *exec.Cmd { + cacheMaxSize := int64(20 * datasizes.GiB) + if opts.CacheMaxSize != 0 { + cacheMaxSize = opts.CacheMaxSize + } + cmd := exec.Command( + osbuildCmd, + "--store", opts.StoreDir, + "--output-directory", opts.OutputDir, + fmt.Sprintf("--cache-max-size=%v", cacheMaxSize), + "-", + ) + for _, export := range exports { + cmd.Args = append(cmd.Args, "--export", export) + } + cmd.Env = append(os.Environ(), opts.ExtraEnv...) + cmd.Stdin = bytes.NewBuffer(manifest) + return cmd +} + func runOSBuildNoProgress(pb ProgressBar, manifest []byte, exports []string, opts *OSBuildOptions) error { var stdout, stderr io.Writer @@ -380,18 +403,7 @@ func runOSBuildNoProgress(pb ProgressBar, manifest []byte, exports []string, opt stderr = mw } - cmd := exec.Command( - osbuildCmd, - "--store", opts.StoreDir, - "--output-directory", opts.OutputDir, - "-", - ) - for _, export := range exports { - cmd.Args = append(cmd.Args, "--export", export) - } - - cmd.Env = append(os.Environ(), opts.ExtraEnv...) - cmd.Stdin = bytes.NewBuffer(manifest) + cmd := newOsbuildCmd(manifest, exports, opts) cmd.Stdout = stdout cmd.Stderr = stderr if err := cmd.Run(); err != nil { @@ -410,17 +422,9 @@ func runOSBuildWithProgress(pb ProgressBar, manifest []byte, exports []string, o defer rp.Close() defer wp.Close() - cmd := exec.Command( - osbuildCmd, - "--store", opts.StoreDir, - "--output-directory", opts.OutputDir, - "--monitor=JSONSeqMonitor", - "--monitor-fd=3", - "-", - ) - for _, export := range exports { - cmd.Args = append(cmd.Args, "--export", export) - } + cmd := newOsbuildCmd(manifest, exports, opts) + cmd.Args = append(cmd.Args, "--monitor=JSONSeqMonitor") + cmd.Args = append(cmd.Args, "--monitor-fd=3") var stdio bytes.Buffer var mw, buildLog io.Writer @@ -433,8 +437,6 @@ func runOSBuildWithProgress(pb ProgressBar, manifest []byte, exports []string, o buildLog = io.Discard } - cmd.Env = append(os.Environ(), opts.ExtraEnv...) - cmd.Stdin = bytes.NewBuffer(manifest) cmd.Stdout = mw cmd.Stderr = mw cmd.ExtraFiles = []*os.File{wp} diff --git a/pkg/progress/progress_test.go b/pkg/progress/progress_test.go index a8d551a..5a3ae3d 100644 --- a/pkg/progress/progress_test.go +++ b/pkg/progress/progress_test.go @@ -263,3 +263,21 @@ osbuild-stderr-output ` assert.Equal(t, expectedOutput, buildLog.String()) } + +func TestRunOSBuildCacheMaxSize(t *testing.T) { + fakeOsbuildBinary := makeFakeOsbuild(t, `echo "$@" > "$0".cmdline`) + restore := progress.MockOsbuildCmd(fakeOsbuildBinary) + defer restore() + + pbar, err := progress.New("debug") + assert.NoError(t, err) + + osbuildOpts := &progress.OSBuildOptions{ + CacheMaxSize: 77, + } + err = progress.RunOSBuild(pbar, []byte(`{"fake":"manifest"}`), nil, osbuildOpts) + assert.NoError(t, err) + cmdline, err := os.ReadFile(fakeOsbuildBinary + ".cmdline") + assert.NoError(t, err) + assert.Contains(t, string(cmdline), "--cache-max-size=77") +}