Fix passing of netrc credentials to clone step (#492)

closes #479
This commit is contained in:
Anbraten 2021-11-25 21:30:03 +01:00 committed by GitHub
parent 063d0bb32a
commit f2b6a5c9c5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 22 deletions

View file

@ -42,6 +42,7 @@ type Compiler struct {
volumes []string volumes []string
networks []string networks []string
env map[string]string env map[string]string
cloneEnv map[string]string
base string base string
path string path string
metadata frontend.Metadata metadata frontend.Metadata
@ -54,8 +55,9 @@ type Compiler struct {
// New creates a new Compiler with options. // New creates a new Compiler with options.
func New(opts ...Option) *Compiler { func New(opts ...Option) *Compiler {
compiler := &Compiler{ compiler := &Compiler{
env: map[string]string{}, env: map[string]string{},
secrets: map[string]Secret{}, cloneEnv: map[string]string{},
secrets: map[string]Secret{},
} }
for _, opt := range opts { for _, opt := range opts {
opt(compiler) opt(compiler)
@ -108,16 +110,12 @@ func (c *Compiler) Compile(conf *yaml.Config) *backend.Config {
// add default clone step // add default clone step
if !c.local && len(conf.Clone.Containers) == 0 && !conf.SkipClone { if !c.local && len(conf.Clone.Containers) == 0 && !conf.SkipClone {
container := &yaml.Container{ container := &yaml.Container{
Name: "clone", Name: "clone",
Image: "woodpeckerci/plugin-git:latest", // TODO: switch to `:latest` once v1.1.0 got released
Vargs: map[string]interface{}{"depth": "0"}, // https://github.com/woodpecker-ci/plugin-git/issues/3
} Image: "woodpeckerci/plugin-git:next",
// TODO: migrate to woodpeckerci/plugin-git:latest (multi arch) Vargs: map[string]interface{}{"depth": "0"},
switch c.metadata.Sys.Arch { Environment: c.cloneEnv,
case "linux/arm":
container.Image = "plugins/git:linux-arm"
case "linux/arm64":
container.Image = "plugins/git:linux-arm64"
} }
name := fmt.Sprintf("%s_clone", c.prefix) name := fmt.Sprintf("%s_clone", c.prefix)
step := c.createProcess(name, container, "clone") step := c.createProcess(name, container, "clone")
@ -139,6 +137,9 @@ func (c *Compiler) Compile(conf *yaml.Config) *backend.Config {
name := fmt.Sprintf("%s_clone_%d", c.prefix, i) name := fmt.Sprintf("%s_clone_%d", c.prefix, i)
step := c.createProcess(name, container, "clone") step := c.createProcess(name, container, "clone")
for k, v := range c.cloneEnv {
step.Environment[k] = v
}
stage.Steps = append(stage.Steps, step) stage.Steps = append(stage.Steps, step)
config.Stages = append(config.Stages, stage) config.Stages = append(config.Stages, stage)

View file

@ -66,13 +66,11 @@ func WithMetadata(metadata frontend.Metadata) Option {
// WithNetrc configures the compiler with netrc authentication // WithNetrc configures the compiler with netrc authentication
// credentials added by default to every container in the pipeline. // credentials added by default to every container in the pipeline.
func WithNetrc(username, password, machine string) Option { func WithNetrc(username, password, machine string) Option {
return WithEnviron( return func(compiler *Compiler) {
map[string]string{ compiler.cloneEnv["CI_NETRC_USERNAME"] = username
"CI_NETRC_USERNAME": username, compiler.cloneEnv["CI_NETRC_PASSWORD"] = password
"CI_NETRC_PASSWORD": password, compiler.cloneEnv["CI_NETRC_MACHINE"] = machine
"CI_NETRC_MACHINE": machine, }
},
)
} }
// WithWorkspace configures the compiler with the workspace base // WithWorkspace configures the compiler with the workspace base

View file

@ -141,13 +141,13 @@ func TestWithNetrc(t *testing.T) {
"github.com", "github.com",
), ),
) )
if compiler.env["CI_NETRC_USERNAME"] != "octocat" { if compiler.cloneEnv["CI_NETRC_USERNAME"] != "octocat" {
t.Errorf("WithNetrc should set CI_NETRC_USERNAME") t.Errorf("WithNetrc should set CI_NETRC_USERNAME")
} }
if compiler.env["CI_NETRC_PASSWORD"] != "password" { if compiler.cloneEnv["CI_NETRC_PASSWORD"] != "password" {
t.Errorf("WithNetrc should set CI_NETRC_PASSWORD") t.Errorf("WithNetrc should set CI_NETRC_PASSWORD")
} }
if compiler.env["CI_NETRC_MACHINE"] != "github.com" { if compiler.cloneEnv["CI_NETRC_MACHINE"] != "github.com" {
t.Errorf("WithNetrc should set CI_NETRC_MACHINE") t.Errorf("WithNetrc should set CI_NETRC_MACHINE")
} }
} }