Skip to content

Commit 7cc4f73

Browse files
leodidoona-agent
andcommitted
feat(cli): add --docker-export-to-cache flag with proper precedence
Add CLI flag to control Docker export mode globally with proper precedence handling following standard Leeway patterns. Precedence order: 1. CLI flag (if explicitly set) - highest priority 2. Environment variable LEEWAY_DOCKER_EXPORT_TO_CACHE 3. Package configuration (default) Changes: - Add --docker-export-to-cache boolean flag - Check flag.Changed() to detect explicit CLI usage - Fall back to LEEWAY_DOCKER_EXPORT_TO_CACHE env var - Pass both value and explicitlySet to BuildOption - Update help text with examples and env var documentation This enables: - Per-build override: leeway build --docker-export-to-cache - CI-level override: LEEWAY_DOCKER_EXPORT_TO_CACHE=true - Bidirectional override (can enable OR disable) Co-authored-by: Ona <[email protected]>
1 parent 0a6e8b8 commit 7cc4f73

File tree

1 file changed

+40
-1
lines changed

1 file changed

+40
-1
lines changed

cmd/build.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,24 @@ import (
2424
var buildCmd = &cobra.Command{
2525
Use: "build [targetPackage]",
2626
Short: "Builds a package",
27-
Args: cobra.MaximumNArgs(1),
27+
Long: `Builds a package and all its dependencies.
28+
29+
Docker Export Mode:
30+
By default, Docker packages with 'image' configuration push directly to registries.
31+
Use --docker-export-to-cache to export images to cache instead (enables SLSA L3).
32+
33+
The LEEWAY_DOCKER_EXPORT_TO_CACHE environment variable sets the default for the flag.
34+
35+
Examples:
36+
# Build with Docker export mode enabled (CLI flag)
37+
leeway build --docker-export-to-cache :myapp
38+
39+
# Build with Docker export mode enabled (environment variable)
40+
LEEWAY_DOCKER_EXPORT_TO_CACHE=true leeway build :myapp
41+
42+
# Disable export mode even if env var is set
43+
leeway build --docker-export-to-cache=false :myapp`,
44+
Args: cobra.MaximumNArgs(1),
2845
Run: func(cmd *cobra.Command, args []string) {
2946
_, pkg, _, _ := getTarget(args, false)
3047
if pkg == nil {
@@ -190,6 +207,7 @@ func addBuildFlags(cmd *cobra.Command) {
190207
cmd.Flags().String("report-segment", os.Getenv("LEEWAY_SEGMENT_KEY"), "Report build events to segment using the segment key (defaults to $LEEWAY_SEGMENT_KEY)")
191208
cmd.Flags().Bool("report-github", os.Getenv("GITHUB_OUTPUT") != "", "Report package build success/failure to GitHub Actions using the GITHUB_OUTPUT environment variable")
192209
cmd.Flags().Bool("fixed-build-dir", true, "Use a fixed build directory for each package, instead of based on the package version, to better utilize caches based on absolute paths (defaults to true)")
210+
cmd.Flags().Bool("docker-export-to-cache", false, "Export Docker images to cache instead of pushing directly (enables SLSA L3 compliance)")
193211
}
194212

195213
func getBuildOpts(cmd *cobra.Command) ([]leeway.BuildOption, cache.LocalCache) {
@@ -330,6 +348,26 @@ func getBuildOpts(cmd *cobra.Command) ([]leeway.BuildOption, cache.LocalCache) {
330348
inFlightChecksums = inFlightChecksumsDefault
331349
}
332350

351+
// Get docker export to cache setting with proper precedence:
352+
// 1. CLI flag (if explicitly set)
353+
// 2. Environment variable (if set)
354+
// 3. Package config (default)
355+
dockerExportToCache := false
356+
dockerExportSet := false
357+
358+
if cmd.Flags().Changed("docker-export-to-cache") {
359+
// Flag was explicitly set by user - this takes precedence
360+
dockerExportToCache, err = cmd.Flags().GetBool("docker-export-to-cache")
361+
if err != nil {
362+
log.Fatal(err)
363+
}
364+
dockerExportSet = true
365+
} else if envVal := os.Getenv("LEEWAY_DOCKER_EXPORT_TO_CACHE"); envVal != "" {
366+
// Env var set (flag not set) - env var takes precedence over package config
367+
dockerExportToCache = envVal == "true" || envVal == "1"
368+
dockerExportSet = true
369+
}
370+
333371
return []leeway.BuildOption{
334372
leeway.WithLocalCache(localCache),
335373
leeway.WithRemoteCache(remoteCache),
@@ -345,6 +383,7 @@ func getBuildOpts(cmd *cobra.Command) ([]leeway.BuildOption, cache.LocalCache) {
345383
leeway.WithFixedBuildDir(fixedBuildDir),
346384
leeway.WithDisableCoverage(disableCoverage),
347385
leeway.WithInFlightChecksums(inFlightChecksums),
386+
leeway.WithDockerExportToCache(dockerExportToCache, dockerExportSet),
348387
}, localCache
349388
}
350389

0 commit comments

Comments
 (0)