From 25705a88b5e47fe68751751b7828462174bb610f Mon Sep 17 00:00:00 2001 From: Marek Schmidt Date: Fri, 31 Jul 2026 13:33:23 +0200 Subject: [PATCH 1/2] use temporary HOME if home not writable --- internal/git/manager.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/internal/git/manager.go b/internal/git/manager.go index 587670f..81ed8e9 100644 --- a/internal/git/manager.go +++ b/internal/git/manager.go @@ -129,7 +129,18 @@ func ensureKnownHostsExists() error { } sshDir := filepath.Join(home, ".ssh") if err := os.MkdirAll(sshDir, 0700); err != nil { - return err + // Home directory is not writable (e.g. nonroot distroless container + // where HOME=/). Fall back to a temp directory and point HOME there + // so go-git's SSH transport can find known_hosts. + tmpHome, tmpErr := os.MkdirTemp("", "func-operator-home-*") + if tmpErr != nil { + return fmt.Errorf("home dir not writable (%w) and failed to create temp home: %w", err, tmpErr) + } + sshDir = filepath.Join(tmpHome, ".ssh") + if mkErr := os.MkdirAll(sshDir, 0700); mkErr != nil { + return fmt.Errorf("failed to create .ssh in temp home: %w", mkErr) + } + os.Setenv("HOME", tmpHome) } knownHostsPath := filepath.Join(sshDir, "known_hosts") if _, err := os.Stat(knownHostsPath); os.IsNotExist(err) { From 3ee858bc8fd33c04920fa287f47bb43baa7bdf68 Mon Sep 17 00:00:00 2001 From: Marek Schmidt Date: Fri, 31 Jul 2026 14:15:25 +0200 Subject: [PATCH 2/2] fix linter --- internal/git/manager.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/internal/git/manager.go b/internal/git/manager.go index 81ed8e9..d30c1b5 100644 --- a/internal/git/manager.go +++ b/internal/git/manager.go @@ -140,7 +140,9 @@ func ensureKnownHostsExists() error { if mkErr := os.MkdirAll(sshDir, 0700); mkErr != nil { return fmt.Errorf("failed to create .ssh in temp home: %w", mkErr) } - os.Setenv("HOME", tmpHome) + if setErr := os.Setenv("HOME", tmpHome); setErr != nil { + return fmt.Errorf("failed to set HOME to temp dir: %w", setErr) + } } knownHostsPath := filepath.Join(sshDir, "known_hosts") if _, err := os.Stat(knownHostsPath); os.IsNotExist(err) {