diff --git a/pipeline/frontend/yaml/compiler/compiler.go b/pipeline/frontend/yaml/compiler/compiler.go index 4e26739ad1..3bc8fa8b5b 100644 --- a/pipeline/frontend/yaml/compiler/compiler.go +++ b/pipeline/frontend/yaml/compiler/compiler.go @@ -183,6 +183,7 @@ func (c *Compiler) Compile(conf *yaml.Config) *backend.Config { config.Stages = append(config.Stages, stage) } + var stages []*backend.Stage // add pipeline steps. 1 pipeline step per stage, at the moment var stage *backend.Stage var group string @@ -202,7 +203,7 @@ func (c *Compiler) Compile(conf *yaml.Config) *backend.Config { stage = new(backend.Stage) stage.Name = fmt.Sprintf("%s_stage_%v", c.prefix, i) stage.Alias = container.Name - config.Stages = append(config.Stages, stage) + stages = append(stages, stage) } name := fmt.Sprintf("%s_step_%d", c.prefix, i) @@ -210,6 +211,13 @@ func (c *Compiler) Compile(conf *yaml.Config) *backend.Config { stage.Steps = append(stage.Steps, step) } + if len(stages) == 0 { + // nothing will run, remove services and clone step + config.Stages = []*backend.Stage{} + } else { + config.Stages = append(config.Stages, stages...) + } + c.setupCacheRebuild(conf, config) return config diff --git a/server/api/hook.go b/server/api/hook.go index b38d23cb26..afe9211f5a 100644 --- a/server/api/hook.go +++ b/server/api/hook.go @@ -200,10 +200,20 @@ func PostHook(c *gin.Context) { return } - if zeroSteps(build, remoteYamlConfigs) { + // TODO: move global pipeline filters into own check functions ... + if z, steps := zeroSteps(build, remoteYamlConfigs); z { msg := "ignoring hook: step conditions yield zero runnable steps" log.Debug().Str("repo", repo.FullName).Msg(msg) c.String(http.StatusOK, msg) + build.Status = model.StatusSuccess + for _, step := range steps { + step.Proc.State = model.StatusSuccess + build.Procs = append(build.Procs, step.Proc) + } + // TODO: this wont create any builds the status can link to ... + if err := updateBuildStatus(c, build, repo, repoUser); err != nil { + log.Error().Err(err).Msg("updateBuildStatus") + } return } @@ -292,7 +302,7 @@ func branchFiltered(build *model.Build, remoteYamlConfigs []*remote.FileMeta) (b return true, nil } -func zeroSteps(build *model.Build, remoteYamlConfigs []*remote.FileMeta) bool { +func zeroSteps(build *model.Build, remoteYamlConfigs []*remote.FileMeta) (bool, []*shared.BuildItem) { b := shared.ProcBuilder{ Repo: &model.Repo{}, Curr: build, @@ -304,15 +314,16 @@ func zeroSteps(build *model.Build, remoteYamlConfigs []*remote.FileMeta) bool { Yamls: remoteYamlConfigs, } - buildItems, err := b.Build() + buildItemsNoEmpty, err := b.Build() if err != nil { - return false + return false, []*shared.BuildItem{} } - if len(buildItems) == 0 { - return true + b.IncludeEmpty = true + buildItems, err := b.Build() + if err != nil { + return false, []*shared.BuildItem{} } - - return false + return len(buildItemsNoEmpty) == 0, buildItems } func findOrPersistPipelineConfig(store store.Store, build *model.Build, remoteYamlConfig *remote.FileMeta) (*model.Config, error) { diff --git a/server/shared/procBuilder.go b/server/shared/procBuilder.go index 8642688788..2d844fdb2b 100644 --- a/server/shared/procBuilder.go +++ b/server/shared/procBuilder.go @@ -37,15 +37,16 @@ import ( // ProcBuilder Takes the hook data and the yaml and returns in internal data model type ProcBuilder struct { - Repo *model.Repo - Curr *model.Build - Last *model.Build - Netrc *model.Netrc - Secs []*model.Secret - Regs []*model.Registry - Link string - Yamls []*remote.FileMeta - Envs map[string]string + Repo *model.Repo + Curr *model.Build + Last *model.Build + Netrc *model.Netrc + Secs []*model.Secret + Regs []*model.Registry + Link string + Yamls []*remote.FileMeta + Envs map[string]string + IncludeEmpty bool } type BuildItem struct { @@ -114,7 +115,7 @@ func (b *ProcBuilder) Build() ([]*BuildItem, error) { ir := b.toInternalRepresentation(parsed, environ, metadata, proc.ID) - if len(ir.Stages) == 0 { + if len(ir.Stages) == 0 && !b.IncludeEmpty { continue } @@ -138,7 +139,6 @@ func (b *ProcBuilder) Build() ([]*BuildItem, error) { items = filterItemsWithMissingDependencies(items) // check if at least one proc can start, if list is not empty - procListContainsItemsToRun(items) if len(items) > 0 && !procListContainsItemsToRun(items) { return nil, fmt.Errorf("build has no startpoint") }