Skip to content

Commit

Permalink
refactor the linter functionality to be based around passing a ruleCh…
Browse files Browse the repository at this point in the history
…ecker object rather than a callback

Signed-off-by: Talon Bowler <talon.bowler@docker.com>
  • Loading branch information
daghack committed May 29, 2024
1 parent 34a421b commit 75d1f1f
Show file tree
Hide file tree
Showing 8 changed files with 238 additions and 145 deletions.
50 changes: 22 additions & 28 deletions frontend/dockerfile/builder/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ func Build(ctx context.Context, c client.Client) (_ *client.Result, err error) {
return nil, err
}

var errorFromLint bool
if _, ok := opts["cmdline"]; !ok {
if cmdline, ok := opts[keySyntaxArg]; ok {
p := strings.SplitN(strings.TrimSpace(cmdline), " ", 2)
Expand All @@ -66,42 +65,41 @@ func Build(ctx context.Context, c client.Client) (_ *client.Result, err error) {
}
return res, err
}
}

var lintOptionStr string
if cmdline, ok := opts[keyDockerfileLintArg]; ok {
lintOptionStr = cmdline
} else if _, cmdline, _, ok := parser.DetectLint(src.Data); ok {
lintOptionStr = cmdline
var checkOptionStr string
var ruleChecker *linter.RuleChecker
if cmdline, ok := opts[keyDockerfileLintArg]; ok {
checkOptionStr = cmdline
}
if checkOptionStr != "" {
ruleChecker, err = linter.NewRuleCheckerFromStr(checkOptionStr)
ruleChecker.FromBuildArg = true
if err != nil {
return nil, errors.Wrapf(err, "failed to parse lint options")
}
if lintOptionStr != "" {
skipSet, errorOn, err := parser.ParseLintOptions(lintOptionStr)
if err != nil {
return nil, errors.Wrapf(err, "failed to parse lint options")
}
linter.SetLintOptions(skipSet)
errorFromLint = errorOn
} else {
ruleChecker = linter.NewRuleChecker()
}
ruleChecker.Warn = func(rulename, description, url, msg string, location []parser.Range) {
startLine := 0
if len(location) > 0 {
startLine = location[0].Start.Line
}
msg = linter.LintFormatShort(rulename, msg, startLine)
src.Warn(ctx, msg, warnOpts(location, [][]byte{[]byte(description)}, url))
}

if capsError != nil {
return nil, capsError
}

violatedRules := []string{}
convertOpt := dockerfile2llb.ConvertOpt{
Config: bc.Config,
Client: bc,
SourceMap: src.SourceMap,
MetaResolver: c,
Warn: func(rulename, description, url, msg string, location []parser.Range) {
startLine := 0
if len(location) > 0 {
startLine = location[0].Start.Line
}
msg = linter.LintFormatShort(rulename, msg, startLine)
src.Warn(ctx, msg, warnOpts(location, [][]byte{[]byte(description)}, url))
violatedRules = append(violatedRules, rulename)
},
RuleChecker: ruleChecker,
}

if res, ok, err := bc.HandleSubrequest(ctx, dockerui.RequestHandler{
Expand Down Expand Up @@ -148,18 +146,14 @@ func Build(ctx context.Context, c client.Client) (_ *client.Result, err error) {
opt := convertOpt
opt.TargetPlatform = platform
if idx != 0 {
opt.Warn = nil
opt.RuleChecker = nil
}

st, img, baseImg, scanTarget, err := dockerfile2llb.Dockerfile2LLB(ctx, src.Data, opt)
if err != nil {
return nil, nil, nil, err
}

if errorFromLint && len(violatedRules) > 0 {
return nil, nil, nil, errors.Errorf("violated lint rules: %s", strings.Join(violatedRules, ", "))
}

def, err := st.Marshal(ctx)
if err != nil {
return nil, nil, nil, errors.Wrapf(err, "failed to marshal LLB definition")
Expand Down
Loading

0 comments on commit 75d1f1f

Please sign in to comment.