Add option to enable buildkit debug output (#119)
### 📖 Summary - Add option to enable buildkit debug output - Formats buildkit.toml using `github.com/pelletier/go-toml/v2` - Sets docker.io registry mirror based on daemon.mirror setting Co-authored-by: Patrick Schratz <pat-s@noreply.codeberg.org> Co-authored-by: 6543 <6543@obermui.de> Reviewed-on: https://codeberg.org/woodpecker-plugins/docker-buildx/pulls/119 Reviewed-by: 6543 <6543@obermui.de> Co-authored-by: David Kovari <dakovari@gmail.com> Co-committed-by: David Kovari <dakovari@gmail.com>
This commit is contained in:
parent
452d5e2277
commit
55cc3b1d21
|
@ -99,6 +99,12 @@ func settingsFlags(settings *plugin.Settings) []cli.Flag {
|
|||
Usage: "sets content of the docker buildkit json config",
|
||||
Destination: &settings.Daemon.BuildkitConfig,
|
||||
},
|
||||
&cli.BoolFlag{
|
||||
Name: "daemon.buildkit-debug",
|
||||
EnvVars: []string{"PLUGIN_BUILDKIT_DEBUG"},
|
||||
Usage: "enables buildkit debug",
|
||||
Destination: &settings.Daemon.BuildkitDebug,
|
||||
},
|
||||
&cli.StringSliceFlag{
|
||||
Name: "daemon.buildkit-driveropt",
|
||||
EnvVars: []string{"PLUGIN_BUILDKIT_DRIVEROPT"},
|
||||
|
|
1
docs.md
1
docs.md
|
@ -105,6 +105,7 @@ docker-build:
|
|||
| `experimental` | `false` | enables docker daemon experimental mode |
|
||||
| `debug` | `false` | enables verbose debug mode for the docker daemon |
|
||||
| `daemon_off` | `false` | disables the startup of the docker daemon |
|
||||
| `buildkit_debug` | _none_ | enables debug output of buildkit
|
||||
| `buildkit_config` | _none_ | sets content of the docker [buildkit TOML config](https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md) |
|
||||
| `buildkit_driveropt` | _none_ | adds one or multiple `--driver-opt` buildx arguments for the default buildkit builder instance |
|
||||
| `tags_file` | _none_ | overrides the `tags` option with values in a file named `.tags`; multiple tags can be specified separated by a newline |
|
||||
|
|
1
go.mod
1
go.mod
|
@ -20,6 +20,7 @@ require (
|
|||
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.1.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
||||
|
|
3
go.sum
3
go.sum
|
@ -23,6 +23,8 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw
|
|||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||
github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI=
|
||||
github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||
|
@ -31,6 +33,7 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
|
|||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
|
|
|
@ -6,11 +6,10 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
dockerExe = "/usr/local/bin/docker"
|
||||
dockerdExe = "/usr/local/bin/dockerd"
|
||||
dockerHome = "/root/.docker/"
|
||||
buildkitConfig = "/tmp/buildkit.toml"
|
||||
buildkitConfigTemplate = "[registry.\"%s\"]\n ca=[\"%s\"]\n"
|
||||
dockerExe = "/usr/local/bin/docker"
|
||||
dockerdExe = "/usr/local/bin/dockerd"
|
||||
dockerHome = "/root/.docker/"
|
||||
buildkitConfig = "/tmp/buildkit.toml"
|
||||
)
|
||||
|
||||
func (p Plugin) startDaemon() {
|
||||
|
|
|
@ -10,6 +10,7 @@ import (
|
|||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/pelletier/go-toml/v2"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli/v2"
|
||||
|
||||
|
@ -23,7 +24,7 @@ type Daemon struct {
|
|||
Insecure bool // Docker daemon enable insecure registries
|
||||
StorageDriver string // Docker daemon storage driver
|
||||
StoragePath string // Docker daemon storage path
|
||||
Disabled bool // DOcker daemon is disabled (already running)
|
||||
Disabled bool // Docker daemon is disabled (already running)
|
||||
Debug bool // Docker daemon started in debug mode
|
||||
Bip string // Docker daemon network bridge IP address
|
||||
DNS cli.StringSlice // Docker daemon dns server
|
||||
|
@ -33,6 +34,7 @@ type Daemon struct {
|
|||
Experimental bool // Docker daemon enable experimental mode
|
||||
BuildkitConfig string // Docker buildkit config
|
||||
BuildkitDriverOpt cli.StringSlice // Docker buildkit driveropt args
|
||||
BuildkitDebug bool // Docker buildkit debug setting
|
||||
}
|
||||
|
||||
// Login defines Docker login parameters.
|
||||
|
@ -202,6 +204,10 @@ func (p *Plugin) Validate() error {
|
|||
p.settings.Build.Labels = *cli.NewStringSlice(p.Labels()...)
|
||||
}
|
||||
|
||||
if err := p.generateBuildkitConfig(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -217,31 +223,75 @@ func (p *Plugin) sanitizedUserTags() []string {
|
|||
return tags
|
||||
}
|
||||
|
||||
func (p *Plugin) writeBuildkitConfig() error {
|
||||
// no buildkit config, automatically generate buildkit configuration to use a custom CA certificate for each registry
|
||||
if p.settings.Daemon.BuildkitConfig == "" && p.settings.Daemon.Registry != "" {
|
||||
for _, login := range p.settings.Logins {
|
||||
if registry := login.Registry; registry != "" {
|
||||
u, err := url.Parse(registry)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not parse registry address: %s: %v", registry, err)
|
||||
}
|
||||
if u.Host != "" {
|
||||
registry = u.Host
|
||||
}
|
||||
type BuildkitConfigTOML struct {
|
||||
Debug bool `toml:"debug"` // needs to be public for toml lib to use
|
||||
Registry map[string]RegistryInfo `toml:"registry"`
|
||||
}
|
||||
|
||||
caPath := fmt.Sprintf("/etc/docker/certs.d/%s/ca.crt", registry)
|
||||
ca, err := os.Open(caPath)
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
logrus.Warnf("error reading %s: %v", caPath, err)
|
||||
} else if err == nil {
|
||||
ca.Close()
|
||||
p.settings.Daemon.BuildkitConfig += fmt.Sprintf(buildkitConfigTemplate, registry, caPath)
|
||||
type RegistryInfo struct {
|
||||
Mirrors []string `toml:"mirrors"`
|
||||
CA []string `toml:"ca"`
|
||||
}
|
||||
|
||||
func (p *Plugin) generateBuildkitConfig() error {
|
||||
// no buildkit config, automatically generate buildkit configuration
|
||||
if p.settings.Daemon.BuildkitConfig == "" {
|
||||
|
||||
cfg := BuildkitConfigTOML{}
|
||||
cfg.Registry = map[string]RegistryInfo{}
|
||||
|
||||
if p.settings.Daemon.BuildkitDebug {
|
||||
cfg.Debug = p.settings.Daemon.BuildkitDebug
|
||||
logrus.Println("buildkit debug enabled")
|
||||
}
|
||||
|
||||
if p.settings.Daemon.Mirror != "" {
|
||||
cfg.Registry["docker.io"] = RegistryInfo{
|
||||
Mirrors: []string{p.settings.Daemon.Mirror},
|
||||
}
|
||||
}
|
||||
|
||||
// use a custom CA certificate for each registry
|
||||
if p.settings.Daemon.Registry != "" {
|
||||
for _, login := range p.settings.Logins {
|
||||
if registry := login.Registry; registry != "" {
|
||||
u, err := url.Parse(registry)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not parse registry address: %s: %v", registry, err)
|
||||
}
|
||||
if u.Host != "" {
|
||||
registry = u.Host
|
||||
}
|
||||
|
||||
caPath := fmt.Sprintf("/etc/docker/certs.d/%s/ca.crt", registry)
|
||||
ca, err := os.Open(caPath)
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
logrus.Warnf("error reading %s: %v", caPath, err)
|
||||
} else if err == nil {
|
||||
ca.Close()
|
||||
// add registry and ca path to buildkit.toml
|
||||
cfg.Registry[registry] = RegistryInfo{
|
||||
CA: []string{caPath},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if cfg.Debug || len(cfg.Registry) > 0 {
|
||||
tomlData, err := toml.Marshal(cfg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error marshaling buildkit.toml: %s", err)
|
||||
} else {
|
||||
p.settings.Daemon.BuildkitConfig = string(tomlData)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Plugin) writeBuildkitConfig() error {
|
||||
// save buildkit config as described
|
||||
if p.settings.Daemon.BuildkitConfig != "" {
|
||||
err := os.WriteFile(buildkitConfig, []byte(p.settings.Daemon.BuildkitConfig), 0o600)
|
||||
|
|
|
@ -76,3 +76,19 @@ func TestDefaultLogin(t *testing.T) {
|
|||
assert.EqualValues(t, "https://codeberg.org", s.Logins[0].Registry)
|
||||
}
|
||||
}
|
||||
|
||||
func TestWriteBuildkitConfig(t *testing.T) {
|
||||
settings := defaultSettings
|
||||
assert.NoError(t, newSettingsOnly(&settings).Validate())
|
||||
assert.EqualValues(t, "", settings.Daemon.BuildkitConfig)
|
||||
|
||||
settings = defaultSettings
|
||||
settings.Daemon.BuildkitDebug = true
|
||||
assert.NoError(t, newSettingsOnly(&settings).Validate())
|
||||
assert.EqualValues(t, "debug = true\n\n[registry]\n", settings.Daemon.BuildkitConfig)
|
||||
|
||||
settings = defaultSettings
|
||||
settings.Daemon.Mirror = "mirror.example.com"
|
||||
assert.NoError(t, newSettingsOnly(&settings).Validate())
|
||||
assert.EqualValues(t, "debug = false\n\n[registry]\n[registry.'docker.io']\nmirrors = ['mirror.example.com']\nca = []\n", settings.Daemon.BuildkitConfig)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue