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.
This commit is contained in:
Michael Vogt 2025-01-27 18:01:09 +01:00 committed by Simon de Vlieger
parent 2cfe043f5e
commit 958f95f634
2 changed files with 45 additions and 25 deletions

View file

@ -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}

View file

@ -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")
}