mirror of
https://git.vectorsigma.ru/public/atlantis.git
synced 2026-07-30 23:28:46 +00:00
Fixes #1539 The branch matcher feature has been introduced in #1383, but the current implementation was broken and doesn't work at all (#1539). If my understanding is correct, there are two problems: (1) The `GlobalCfg` has a default `Repo` instance which always matches any repositries and branches. Therefore the branch matcher never be functional. (2) Validating base branches in `DefaultPreWorkflowHooksCommandRunner.RunPreHooks()` implicitly assumed that users customize `pre_workflow_hooks`, but the assumption isn't always true because it defaults to empty. For (1), I added a new method `MatchingRepo()` to `GlobalCfg` to check `BranchMatches()` for a single `Repo` instance. For (2), I moved validating branch to `DefaultCommandRunner.validateCtxAndComment()`. Since the method has already validated meta data of pull request, I think it's suitable place to check base branches, but please let me know if there is anywhere more suitable.
95 lines
2.4 KiB
Go
95 lines
2.4 KiB
Go
package events
|
|
|
|
import (
|
|
"github.com/runatlantis/atlantis/server/core/runtime"
|
|
"github.com/runatlantis/atlantis/server/events/models"
|
|
"github.com/runatlantis/atlantis/server/events/vcs"
|
|
"github.com/runatlantis/atlantis/server/events/yaml/valid"
|
|
)
|
|
|
|
//go:generate pegomock generate -m --use-experimental-model-gen --package mocks -o mocks/mock_pre_workflows_hooks_command_runner.go PreWorkflowHooksCommandRunner
|
|
|
|
type PreWorkflowHooksCommandRunner interface {
|
|
RunPreHooks(ctx *CommandContext) error
|
|
}
|
|
|
|
// DefaultPreWorkflowHooksCommandRunner is the first step when processing a workflow hook commands.
|
|
type DefaultPreWorkflowHooksCommandRunner struct {
|
|
VCSClient vcs.Client
|
|
WorkingDirLocker WorkingDirLocker
|
|
WorkingDir WorkingDir
|
|
GlobalCfg valid.GlobalCfg
|
|
PreWorkflowHookRunner runtime.PreWorkflowHookRunner
|
|
}
|
|
|
|
// RunPreHooks runs pre_workflow_hooks when PR is opened or updated.
|
|
func (w *DefaultPreWorkflowHooksCommandRunner) RunPreHooks(
|
|
ctx *CommandContext,
|
|
) error {
|
|
pull := ctx.Pull
|
|
baseRepo := pull.BaseRepo
|
|
headRepo := ctx.HeadRepo
|
|
user := ctx.User
|
|
log := ctx.Log
|
|
|
|
preWorkflowHooks := make([]*valid.PreWorkflowHook, 0)
|
|
for _, repo := range w.GlobalCfg.Repos {
|
|
if repo.IDMatches(baseRepo.ID()) && len(repo.PreWorkflowHooks) > 0 {
|
|
preWorkflowHooks = append(preWorkflowHooks, repo.PreWorkflowHooks...)
|
|
}
|
|
}
|
|
|
|
// short circuit any other calls if there are no pre-hooks configured
|
|
if len(preWorkflowHooks) == 0 {
|
|
return nil
|
|
}
|
|
|
|
log.Debug("pre-hooks configured, running...")
|
|
|
|
unlockFn, err := w.WorkingDirLocker.TryLock(baseRepo.FullName, pull.Num, DefaultWorkspace)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
log.Debug("got workspace lock")
|
|
defer unlockFn()
|
|
|
|
repoDir, _, err := w.WorkingDir.Clone(log, headRepo, pull, DefaultWorkspace)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = w.runHooks(
|
|
models.PreWorkflowHookCommandContext{
|
|
BaseRepo: baseRepo,
|
|
HeadRepo: headRepo,
|
|
Log: log,
|
|
Pull: pull,
|
|
User: user,
|
|
Verbose: false,
|
|
},
|
|
preWorkflowHooks, repoDir)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (w *DefaultPreWorkflowHooksCommandRunner) runHooks(
|
|
ctx models.PreWorkflowHookCommandContext,
|
|
preWorkflowHooks []*valid.PreWorkflowHook,
|
|
repoDir string,
|
|
) error {
|
|
|
|
for _, hook := range preWorkflowHooks {
|
|
_, err := w.PreWorkflowHookRunner.Run(ctx, hook.RunCommand, repoDir)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|