Fix func to determine default login (#29)

only add default login if auth profided or no login entry exist

Reviewed-on: https://codeberg.org/woodpecker-plugins/plugin-docker-buildx/pulls/29
Reviewed-by: qwerty287 <qwerty287@noreply.codeberg.org>
This commit is contained in:
6543
2022-10-11 11:38:36 +02:00
parent 5868a6e6a8
commit fca44ab7ae
6 changed files with 108 additions and 9 deletions

View File

@@ -84,15 +84,18 @@ func (l Login) anonymous() bool {
// Init initialise plugin settings
func (p *Plugin) InitSettings() error {
if err := json.Unmarshal([]byte(p.settings.LoginsRaw), &p.settings.Logins); err != nil {
return fmt.Errorf("Could not unmarshal logins: %v", err)
if p.settings.LoginsRaw != "" {
if err := json.Unmarshal([]byte(p.settings.LoginsRaw), &p.settings.Logins); err != nil {
return fmt.Errorf("Could not unmarshal logins: %v", err)
}
}
p.settings.Build.Branch = p.pipeline.Repo.Branch
p.settings.Build.Ref = p.pipeline.Commit.Ref
if p.settings.DefaultLogin.anonymous() {
p.settings.Logins = append(p.settings.Logins, p.settings.DefaultLogin)
} else {
if len(p.settings.Logins) == 0 {
p.settings.Logins = []Login{p.settings.DefaultLogin}
} else if !p.settings.DefaultLogin.anonymous() {
p.settings.Logins = prepend(p.settings.Logins, p.settings.DefaultLogin)
}

77
plugin/impl_test.go Normal file
View File

@@ -0,0 +1,77 @@
package plugin
import (
"testing"
"codeberg.org/6543/go-yaml2json"
"github.com/stretchr/testify/assert"
"github.com/urfave/cli/v2"
)
var defaultSettings = Settings{
Daemon: Daemon{
StoragePath: "/var/lib/docker",
},
Build: Build{
Context: ".",
Tags: *cli.NewStringSlice("latest"),
LabelsAuto: true,
Pull: true,
},
DefaultLogin: Login{
Registry: "https://index.docker.io/v1/",
},
LoginsRaw: "[]",
Cleanup: true,
}
func TestDefaultLogin(t *testing.T) {
s := defaultSettings
assert.NoError(t, newSettingsOnly(&s).Validate())
if assert.Len(t, s.Logins, 1) {
assert.EqualValues(t, defaultSettings.DefaultLogin.Registry, s.Logins[0].Registry)
}
// only use login to auth to registrys
loginsRaw, err := yaml2json.Convert([]byte(`
- registry: https://index.docker.io/v1/
username: docker_username
password: docker_password
- registry: https://codeberg.org
username: cb_username
password: cb_password`))
assert.NoError(t, err)
s.LoginsRaw = string(loginsRaw)
assert.NoError(t, newSettingsOnly(&s).Validate())
if assert.Len(t, s.Logins, 2) {
assert.EqualValues(t, defaultSettings.DefaultLogin.Registry, s.Logins[0].Registry)
}
// mixed login settings ('logins' and 'username', 'password' are used)
s = defaultSettings
loginsRaw, err = yaml2json.Convert([]byte(`
- registry: https://codeberg.org
username: cb_username
password: cb_password`))
assert.NoError(t, err)
s.LoginsRaw = string(loginsRaw)
s.DefaultLogin.Username = "docker_username"
s.DefaultLogin.Password = "docker_password"
assert.NoError(t, newSettingsOnly(&s).Validate())
if assert.Len(t, s.Logins, 2) {
assert.EqualValues(t, defaultSettings.DefaultLogin.Registry, s.Logins[0].Registry)
}
// ignore default registry
s = defaultSettings
loginsRaw, err = yaml2json.Convert([]byte(`
- registry: https://codeberg.org
username: cb_username
password: cb_password`))
assert.NoError(t, err)
s.LoginsRaw = string(loginsRaw)
assert.NoError(t, newSettingsOnly(&s).Validate())
if assert.Len(t, s.Logins, 1) {
assert.EqualValues(t, "https://codeberg.org", s.Logins[0].Registry)
}
}

View File

@@ -6,7 +6,7 @@ import (
// Plugin implements drone.Plugin to provide the plugin implementation.
type Plugin struct {
settings Settings
settings *Settings
pipeline drone.Pipeline
network drone.Network
}
@@ -14,8 +14,15 @@ type Plugin struct {
// New initializes a plugin from the given Settings, Pipeline, and Network.
func New(settings Settings, pipeline drone.Pipeline, network drone.Network) drone.Plugin {
return &Plugin{
settings: settings,
settings: &settings,
pipeline: pipeline,
network: network,
}
}
// newSettingsOnly initializes a plugin from the given Settings only.
func newSettingsOnly(settings *Settings) drone.Plugin {
return &Plugin{
settings: settings,
}
}