Monorepo for Tangled
tangled.org
1package models
2
3import (
4 "strings"
5
6 "github.com/go-git/go-git/v5/plumbing"
7 "tangled.org/core/api/tangled"
8 "tangled.org/core/workflow"
9)
10
11// PipelineEnvVars builds the standard CI environment variables for a pipeline
12func PipelineEnvVars(tr *tangled.Pipeline_TriggerMetadata, pipelineId PipelineId) map[string]string {
13 return PipelineEnvVarsForSource(tr, pipelineId, nil)
14}
15
16func PipelineEnvVarsForSource(tr *tangled.Pipeline_TriggerMetadata, pipelineId PipelineId, sourceRepo *tangled.Pipeline_TriggerRepo) map[string]string {
17 if tr == nil {
18 return nil
19 }
20
21 env := make(map[string]string)
22
23 // standard CI env vars
24 env["CI"] = "true"
25
26 env["TANGLED_PIPELINE_ID"] = pipelineId.AtUri().String()
27 env["TANGLED_PIPELINE_KIND"] = tr.Kind
28
29 if tr.SourceRepo != nil && *tr.SourceRepo != "" {
30 env["TANGLED_PIPELINE_SOURCE"] = *tr.SourceRepo
31 } else if tr.Repo != nil && tr.Repo.RepoDid != nil {
32 env["TANGLED_PIPELINE_SOURCE"] = *tr.Repo.RepoDid
33 }
34
35 // prefer source repo, e.g. if this is a wf running on a fork
36 repoInfo := tr.Repo
37 if sourceRepo != nil {
38 repoInfo = sourceRepo
39 }
40 if repoInfo != nil {
41 env["TANGLED_REPO_KNOT"] = repoInfo.Knot
42 env["TANGLED_REPO_DID"] = repoInfo.Did
43 if repoInfo.Repo != nil {
44 env["TANGLED_REPO_NAME"] = *repoInfo.Repo
45 }
46 if repoInfo.RepoDid != nil {
47 env["TANGLED_REPO_REPO_DID"] = *repoInfo.RepoDid
48 }
49 env["TANGLED_REPO_DEFAULT_BRANCH"] = repoInfo.DefaultBranch
50 env["TANGLED_REPO_URL"] = BuildRepoURL(repoInfo)
51 }
52
53 switch workflow.TriggerKind(tr.Kind) {
54 case workflow.TriggerKindPush:
55 if tr.Push != nil {
56 refName := plumbing.ReferenceName(tr.Push.Ref)
57 refType := "branch"
58 if refName.IsTag() {
59 refType = "tag"
60 }
61
62 env["TANGLED_REF"] = tr.Push.Ref
63 env["TANGLED_REF_NAME"] = refName.Short()
64 env["TANGLED_REF_TYPE"] = refType
65 env["TANGLED_SHA"] = tr.Push.NewSha
66 env["TANGLED_COMMIT_SHA"] = tr.Push.NewSha
67 }
68
69 case workflow.TriggerKindPullRequest:
70 if tr.PullRequest != nil {
71 // for PRs, ref is the source branch
72 env["TANGLED_REF"] = "refs/heads/" + tr.PullRequest.SourceBranch
73 env["TANGLED_REF_NAME"] = tr.PullRequest.SourceBranch
74 env["TANGLED_REF_TYPE"] = "branch"
75 env["TANGLED_SHA"] = tr.PullRequest.SourceSha
76 env["TANGLED_COMMIT_SHA"] = tr.PullRequest.SourceSha
77
78 // PR-specific env vars
79 env["TANGLED_PIPELINE_SOURCE_BRANCH"] = tr.PullRequest.SourceBranch
80 env["TANGLED_PIPELINE_TARGET_BRANCH"] = tr.PullRequest.TargetBranch
81 env["TANGLED_PR_SOURCE_BRANCH"] = tr.PullRequest.SourceBranch
82 env["TANGLED_PR_TARGET_BRANCH"] = tr.PullRequest.TargetBranch
83 env["TANGLED_PR_SOURCE_SHA"] = tr.PullRequest.SourceSha
84 }
85
86 case workflow.TriggerKindManual:
87 if tr.Manual != nil {
88 env["TANGLED_SHA"] = tr.Manual.Sha
89 env["TANGLED_COMMIT_SHA"] = tr.Manual.Sha
90 if tr.Manual.Ref != nil && *tr.Manual.Ref != "" {
91 refName := plumbing.ReferenceName(*tr.Manual.Ref)
92 refType := "branch"
93 if refName.IsTag() {
94 refType = "tag"
95 }
96 env["TANGLED_REF"] = *tr.Manual.Ref
97 env["TANGLED_REF_NAME"] = refName.Short()
98 env["TANGLED_REF_TYPE"] = refType
99 }
100 // include manual inputs if present
101 for _, pair := range tr.Manual.Inputs {
102 env["TANGLED_INPUT_"+strings.ToUpper(pair.Key)] = pair.Value
103 }
104 }
105 }
106
107 return env
108}