mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2025-03-28 07:05:30 +00:00
pipeline-StepBuilder extract item generation of workflow into own function (#1950)
This commit is contained in:
parent
1d6b073ca5
commit
b3f65d9d01
2 changed files with 75 additions and 63 deletions
|
@ -30,7 +30,6 @@ import (
|
|||
"github.com/woodpecker-ci/woodpecker/cli/common"
|
||||
"github.com/woodpecker-ci/woodpecker/pipeline"
|
||||
"github.com/woodpecker-ci/woodpecker/pipeline/backend"
|
||||
"github.com/woodpecker-ci/woodpecker/pipeline/backend/types"
|
||||
backendTypes "github.com/woodpecker-ci/woodpecker/pipeline/backend/types"
|
||||
"github.com/woodpecker-ci/woodpecker/pipeline/frontend/yaml"
|
||||
"github.com/woodpecker-ci/woodpecker/pipeline/frontend/yaml/compiler"
|
||||
|
@ -202,7 +201,7 @@ func execWithAxis(c *cli.Context, file, repoPath string, axis matrix.Axis) error
|
|||
return err
|
||||
}
|
||||
|
||||
backendCtx := context.WithValue(c.Context, types.CliContext, c)
|
||||
backendCtx := context.WithValue(c.Context, backendTypes.CliContext, c)
|
||||
backend.Init(backendCtx)
|
||||
|
||||
engine, err := backend.FindEngine(backendCtx, c.String("backend-engine"))
|
||||
|
|
|
@ -85,75 +85,19 @@ func (b *StepBuilder) Build() ([]*Item, error) {
|
|||
Environ: axis,
|
||||
Name: SanitizePath(y.Name),
|
||||
}
|
||||
|
||||
workflowMetadata := frontend.MetadataFromStruct(b.Forge, b.Repo, b.Curr, b.Last, workflow, b.Link)
|
||||
environ := b.environmentVariables(workflowMetadata, axis)
|
||||
|
||||
// add global environment variables for substituting
|
||||
for k, v := range b.Envs {
|
||||
if _, exists := environ[k]; exists {
|
||||
// don't override existing values
|
||||
continue
|
||||
}
|
||||
environ[k] = v
|
||||
}
|
||||
|
||||
// substitute vars
|
||||
substituted, err := frontend.EnvVarSubst(string(y.Data), environ)
|
||||
item, err := b.genItemForWorkflow(workflow, axis, string(y.Data))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// parse yaml pipeline
|
||||
parsed, err := yaml.ParseString(substituted)
|
||||
if err != nil {
|
||||
return nil, &yaml.PipelineParseError{Err: err}
|
||||
}
|
||||
|
||||
// lint pipeline
|
||||
if err := linter.New(
|
||||
linter.WithTrusted(b.Repo.IsTrusted),
|
||||
).Lint(parsed); err != nil {
|
||||
return nil, &yaml.PipelineParseError{Err: err}
|
||||
}
|
||||
|
||||
// checking if filtered.
|
||||
if match, err := parsed.When.Match(workflowMetadata, true, environ); !match && err == nil {
|
||||
log.Debug().Str("pipeline", workflow.Name).Msg(
|
||||
"Marked as skipped, dose not match metadata",
|
||||
)
|
||||
workflow.State = model.StatusSkipped
|
||||
} else if err != nil {
|
||||
log.Debug().Str("pipeline", workflow.Name).Msg(
|
||||
"Pipeline config could not be parsed",
|
||||
)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ir, err := b.toInternalRepresentation(parsed, environ, workflowMetadata, workflow.ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(ir.Stages) == 0 {
|
||||
if item == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
item := &Item{
|
||||
Workflow: workflow,
|
||||
Config: ir,
|
||||
Labels: parsed.Labels,
|
||||
DependsOn: parsed.DependsOn,
|
||||
RunsOn: parsed.RunsOn,
|
||||
Platform: parsed.Platform,
|
||||
}
|
||||
if item.Labels == nil {
|
||||
item.Labels = map[string]string{}
|
||||
}
|
||||
|
||||
items = append(items, item)
|
||||
pidSequence++
|
||||
}
|
||||
|
||||
// TODO: add summary workflow that send status back based on workflows generated by matrix function
|
||||
// depend on https://github.com/woodpecker-ci/woodpecker/issues/778
|
||||
}
|
||||
|
||||
items = filterItemsWithMissingDependencies(items)
|
||||
|
@ -166,6 +110,75 @@ func (b *StepBuilder) Build() ([]*Item, error) {
|
|||
return items, nil
|
||||
}
|
||||
|
||||
func (b *StepBuilder) genItemForWorkflow(workflow *model.Workflow, axis matrix.Axis, data string) (*Item, error) {
|
||||
workflowMetadata := frontend.MetadataFromStruct(b.Forge, b.Repo, b.Curr, b.Last, workflow, b.Link)
|
||||
environ := b.environmentVariables(workflowMetadata, axis)
|
||||
|
||||
// add global environment variables for substituting
|
||||
for k, v := range b.Envs {
|
||||
if _, exists := environ[k]; exists {
|
||||
// don't override existing values
|
||||
continue
|
||||
}
|
||||
environ[k] = v
|
||||
}
|
||||
|
||||
// substitute vars
|
||||
substituted, err := frontend.EnvVarSubst(data, environ)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// parse yaml pipeline
|
||||
parsed, err := yaml.ParseString(substituted)
|
||||
if err != nil {
|
||||
return nil, &yaml.PipelineParseError{Err: err}
|
||||
}
|
||||
|
||||
// lint pipeline
|
||||
if err := linter.New(
|
||||
linter.WithTrusted(b.Repo.IsTrusted),
|
||||
).Lint(parsed); err != nil {
|
||||
return nil, &yaml.PipelineParseError{Err: err}
|
||||
}
|
||||
|
||||
// checking if filtered.
|
||||
if match, err := parsed.When.Match(workflowMetadata, true, environ); !match && err == nil {
|
||||
log.Debug().Str("pipeline", workflow.Name).Msg(
|
||||
"Marked as skipped, dose not match metadata",
|
||||
)
|
||||
workflow.State = model.StatusSkipped
|
||||
} else if err != nil {
|
||||
log.Debug().Str("pipeline", workflow.Name).Msg(
|
||||
"Pipeline config could not be parsed",
|
||||
)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ir, err := b.toInternalRepresentation(parsed, environ, workflowMetadata, workflow.ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(ir.Stages) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
item := &Item{
|
||||
Workflow: workflow,
|
||||
Config: ir,
|
||||
Labels: parsed.Labels,
|
||||
DependsOn: parsed.DependsOn,
|
||||
RunsOn: parsed.RunsOn,
|
||||
Platform: parsed.Platform,
|
||||
}
|
||||
if item.Labels == nil {
|
||||
item.Labels = map[string]string{}
|
||||
}
|
||||
|
||||
return item, nil
|
||||
}
|
||||
|
||||
func stepListContainsItemsToRun(items []*Item) bool {
|
||||
for i := range items {
|
||||
if items[i].Workflow.State == model.StatusPending {
|
||||
|
|
Loading…
Reference in a new issue