Skip to content

Commit e9269c0

Browse files
fix(build): fix secret config validation not working (#6598)
Signed-off-by: Yaroslav Pershin <62902094+iapershin@users.noreply.github.com> Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com> Co-authored-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
1 parent e9a1d71 commit e9269c0

File tree

5 files changed

+32
-15
lines changed

5 files changed

+32
-15
lines changed

pkg/config/raw_image_from_dockerfile.go

+4
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,7 @@ func (c *rawImageFromDockerfile) toImageFromDockerfileDirective(giterminismManag
170170

171171
return image, nil
172172
}
173+
174+
func (r *rawImageFromDockerfile) getDoc() *doc {
175+
return r.doc
176+
}

pkg/config/raw_secrets.go

+20-12
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,48 @@ import (
44
"fmt"
55
)
66

7+
// TODO (iapershin)
8+
// rawOrigin is not suitable here since image stack contains `doc` property and couldn't be used along with doc()
9+
// refactor to use common approach
10+
type rawParent interface {
11+
getDoc() *doc
12+
}
13+
714
type rawSecret struct {
8-
Id string `yaml:"id"`
15+
Id string `yaml:"id,omitempty"`
916
Env string `yaml:"env,omitempty"`
1017
Src string `yaml:"src,omitempty"`
1118
PlainValue string `yaml:"value,omitempty"`
1219

13-
doc *doc `yaml:"-"` // parent
20+
parent rawParent `yaml:"-"` // parent
1421

1522
UnsupportedAttributes map[string]interface{} `yaml:",inline"`
1623
}
1724

1825
func (s *rawSecret) UnmarshalYAML(unmarshal func(interface{}) error) error {
19-
parentStack.Push(s)
26+
if parent, ok := parentStack.Peek().(rawParent); ok {
27+
s.parent = parent
28+
}
29+
2030
type plain rawSecret
21-
err := unmarshal((*plain)(s))
22-
parentStack.Pop()
23-
if err != nil {
24-
return fmt.Errorf("secrets parsing error: %w", err)
31+
if err := unmarshal((*plain)(s)); err != nil {
32+
return err
2533
}
2634

2735
if err := s.validate(); err != nil {
28-
return fmt.Errorf("secrets validation error: %w", err)
36+
return newDetailedConfigError(fmt.Sprintf("secrets validation error: %s", err.Error()), s, s.parent.getDoc())
2937
}
3038

31-
if err := checkOverflow(s.UnsupportedAttributes, nil, s.doc); err != nil {
32-
return fmt.Errorf("secrets validation error: %w", err)
39+
if err := checkOverflow(s.UnsupportedAttributes, nil, s.parent.getDoc()); err != nil {
40+
return err
3341
}
3442

3543
return nil
3644
}
3745

3846
func (s *rawSecret) validate() error {
3947
if !oneOrNone([]bool{s.Env != "", s.Src != "", s.PlainValue != ""}) {
40-
return newDetailedConfigError("specify only env or src or value in secret", s, s.doc)
48+
return fmt.Errorf("secret type could be ONLY `env`, `src` or `value`")
4149
}
4250
return nil
4351
}
@@ -51,6 +59,6 @@ func (s *rawSecret) toDirective() (Secret, error) {
5159
case s.PlainValue != "":
5260
return newSecretFromPlainValue(s)
5361
default:
54-
return nil, newDetailedConfigError("secret type is not supported", s, s.doc)
62+
return nil, newDetailedConfigError("secret should be defined as `env`, `src` or `value`", s, s.parent.getDoc())
5563
}
5664
}

pkg/config/raw_stapel_image.go

+4
Original file line numberDiff line numberDiff line change
@@ -342,3 +342,7 @@ func (c *rawStapelImage) toBaseStapelImageBaseDirective(giterminismManager giter
342342

343343
return imageBase, nil
344344
}
345+
346+
func (r *rawStapelImage) getDoc() *doc {
347+
return r.doc
348+
}

pkg/config/secrets.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ type SecretFromPlainValue struct {
3636

3737
func newSecretFromEnv(s *rawSecret) (*SecretFromEnv, error) {
3838
if _, exists := os.LookupEnv(s.Env); !exists {
39-
return nil, fmt.Errorf("specified env variable doesn't exist")
39+
return nil, fmt.Errorf("specified env variable `%s` doesn't exist", s.Env)
4040
}
4141
if s.Id == "" {
4242
s.Id = s.Env
@@ -140,14 +140,14 @@ func GetValidatedSecrets(rawSecrets []*rawSecret, giterminismManager giterminism
140140
for _, s := range rawSecrets {
141141
secret, err := s.toDirective()
142142
if err != nil {
143-
return nil, err
143+
return nil, newDetailedConfigError(fmt.Sprintf("unable to load build secrets: %s", err.Error()), s, s.parent.getDoc())
144144
}
145145

146146
secretId := secret.GetSecretId()
147147
if _, ok := secretIds[secretId]; !ok {
148148
secretIds[secretId] = struct{}{}
149149
} else {
150-
return nil, newDetailedConfigError("duplicated secret %s", secretId, s.doc)
150+
return nil, newDetailedConfigError(fmt.Sprintf("duplicated secret %q", secretId), nil, s.parent.getDoc())
151151
}
152152

153153
err = secret.InspectByGiterminism(giterminismManager)

pkg/giterminism_manager/manager.go

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ func NewManager(ctx context.Context, configRelPath, projectDir string, localGitR
2929
if options.LooseGiterminism {
3030
err := errors.NewError(`We recommend using werf-giterminism.yaml to loosen giterminism instead of using --loose-giterminism/WERF_LOOSE_GITERMINISM`)
3131
logboek.Context(ctx).Warn().LogLn(err)
32+
logboek.Context(ctx).LogOptionalLn()
3233
}
3334

3435
fr := file_reader.NewFileReader(sharedOptions)

0 commit comments

Comments
 (0)