forked from redhat-developer/kam
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tekton_builder.go
100 lines (90 loc) · 3.06 KB
/
tekton_builder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package pipelines
import (
"fmt"
"path/filepath"
"github.com/chetan-rns/gitops-cli/pkg/pipelines/config"
"github.com/chetan-rns/gitops-cli/pkg/pipelines/eventlisteners"
res "github.com/chetan-rns/gitops-cli/pkg/pipelines/resources"
"github.com/chetan-rns/gitops-cli/pkg/pipelines/scm"
"github.com/tektoncd/triggers/pkg/apis/triggers/v1alpha1"
)
type tektonBuilder struct {
files res.Resources
gitOpsRepo string
triggers []v1alpha1.EventListenerTrigger
}
func buildEventListenerResources(gitOpsRepo string, m *config.Manifest) (res.Resources, error) {
if gitOpsRepo == "" {
return res.Resources{}, nil
}
cfg := m.GetPipelinesConfig()
if cfg == nil {
return nil, nil
}
files := make(res.Resources)
tb := &tektonBuilder{files: files, gitOpsRepo: gitOpsRepo}
triggers, err := createTriggersForCICD(tb.gitOpsRepo, cfg)
if err != nil {
return nil, err
}
tb.triggers = append(tb.triggers, triggers...)
err = m.Walk(tb)
if err != nil {
return nil, err
}
cicdPath := config.PathForPipelines(cfg)
files[getEventListenerPath(cicdPath)] = eventlisteners.CreateELFromTriggers(cfg.Name, saName, tb.triggers)
return files, nil
}
func (tb *tektonBuilder) Service(app *config.Application, env *config.Environment, svc *config.Service) error {
if svc.SourceURL == "" {
return nil
}
repo, err := scm.NewRepository(svc.SourceURL)
if err != nil {
return err
}
pipelines := getPipelines(env, svc, repo)
ciTrigger := repo.CreatePushTrigger(triggerName(svc.Name), svc.Webhook.Secret.Name, svc.Webhook.Secret.Namespace, pipelines.Integration.Template, pipelines.Integration.Bindings)
tb.triggers = append(tb.triggers, ciTrigger)
return nil
}
func getEventListenerPath(cicdPath string) string {
return filepath.Join(cicdPath, "base", eventListenerPath)
}
func createTriggersForCICD(gitOpsRepo string, cfg *config.PipelinesConfig) ([]v1alpha1.EventListenerTrigger, error) {
triggers := []v1alpha1.EventListenerTrigger{}
repo, err := scm.NewRepository(gitOpsRepo)
if err != nil {
return []v1alpha1.EventListenerTrigger{}, err
}
ciTrigger := repo.CreatePushTrigger("ci-dryrun-from-push", eventlisteners.GitOpsWebhookSecret, cfg.Name, "ci-dryrun-from-push-template", []string{repo.PushBindingName()})
triggers = append(triggers, ciTrigger)
return triggers, nil
}
func getPipelines(env *config.Environment, svc *config.Service, r scm.Repository) *config.Pipelines {
pipelines := defaultPipelines(r)
if env.Pipelines != nil {
pipelines = clonePipelines(env.Pipelines)
}
if svc.Pipelines != nil {
if len(svc.Pipelines.Integration.Bindings) > 0 {
pipelines.Integration.Bindings = svc.Pipelines.Integration.Bindings[:]
}
if svc.Pipelines.Integration.Template != "" {
pipelines.Integration.Template = svc.Pipelines.Integration.Template
}
}
return pipelines
}
func clonePipelines(p *config.Pipelines) *config.Pipelines {
return &config.Pipelines{
Integration: &config.TemplateBinding{
Bindings: p.Integration.Bindings[:],
Template: p.Integration.Template,
},
}
}
func triggerName(svc string) string {
return fmt.Sprintf("app-ci-build-from-push-%s", svc)
}