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:
David Kovari 2024-01-14 23:35:00 +00:00 committed by 6543
parent 452d5e2277
commit 55cc3b1d21
7 changed files with 101 additions and 25 deletions

View file

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

View file

@ -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
View file

@ -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
View file

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

View file

@ -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() {

View file

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

View file

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