feat(build): add SignConfig to BuildConfig

Loads signing configuration from .core/build.yaml.
Expands environment variables for secrets.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Snider 2026-01-29 02:52:12 +00:00
parent dff008fff7
commit 1e0d9e4ebd
2 changed files with 42 additions and 0 deletions

View file

@ -7,6 +7,7 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"github.com/host-uk/core/pkg/build/signing"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
) )
@ -27,6 +28,8 @@ type BuildConfig struct {
Build Build `yaml:"build"` Build Build `yaml:"build"`
// Targets defines the build targets. // Targets defines the build targets.
Targets []TargetConfig `yaml:"targets"` Targets []TargetConfig `yaml:"targets"`
// Sign contains code signing configuration.
Sign signing.SignConfig `yaml:"sign,omitempty"`
} }
// Project holds project metadata. // Project holds project metadata.
@ -109,6 +112,7 @@ func DefaultConfig() *BuildConfig {
{OS: "darwin", Arch: "arm64"}, {OS: "darwin", Arch: "arm64"},
{OS: "windows", Arch: "amd64"}, {OS: "windows", Arch: "amd64"},
}, },
Sign: signing.DefaultSignConfig(),
} }
} }
@ -139,6 +143,9 @@ func applyDefaults(cfg *BuildConfig) {
if len(cfg.Targets) == 0 { if len(cfg.Targets) == 0 {
cfg.Targets = defaults.Targets cfg.Targets = defaults.Targets
} }
// Expand environment variables in sign config
cfg.Sign.ExpandEnv()
} }
// ConfigPath returns the path to the build config file for a given directory. // ConfigPath returns the path to the build config file for a given directory.

View file

@ -233,6 +233,41 @@ func TestConfigExists_Good(t *testing.T) {
}) })
} }
func TestLoadConfig_Good_SignConfig(t *testing.T) {
tmpDir := t.TempDir()
coreDir := filepath.Join(tmpDir, ".core")
os.MkdirAll(coreDir, 0755)
configContent := `version: 1
sign:
enabled: true
gpg:
key: "ABCD1234"
macos:
identity: "Developer ID Application: Test"
notarize: true
`
os.WriteFile(filepath.Join(coreDir, "build.yaml"), []byte(configContent), 0644)
cfg, err := LoadConfig(tmpDir)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if !cfg.Sign.Enabled {
t.Error("expected Sign.Enabled to be true")
}
if cfg.Sign.GPG.Key != "ABCD1234" {
t.Errorf("expected GPG.Key 'ABCD1234', got %q", cfg.Sign.GPG.Key)
}
if cfg.Sign.MacOS.Identity != "Developer ID Application: Test" {
t.Errorf("expected MacOS.Identity, got %q", cfg.Sign.MacOS.Identity)
}
if !cfg.Sign.MacOS.Notarize {
t.Error("expected MacOS.Notarize to be true")
}
}
func TestBuildConfig_ToTargets_Good(t *testing.T) { func TestBuildConfig_ToTargets_Good(t *testing.T) {
t.Run("converts TargetConfig to Target", func(t *testing.T) { t.Run("converts TargetConfig to Target", func(t *testing.T) {
cfg := &BuildConfig{ cfg := &BuildConfig{