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 if tr == nil {
14 return nil
15 }
16
17 env := make(map[string]string)
18
19 // standard CI env vars
20 env["CI"] = "true"
21
22 env["TANGLED_PIPELINE_ID"] = pipelineId.AtUri().String()
23 env["TANGLED_PIPELINE_KIND"] = tr.Kind
24
25 // repo info
26 if tr.Repo != nil {
27 env["TANGLED_REPO_KNOT"] = tr.Repo.Knot
28 env["TANGLED_REPO_DID"] = tr.Repo.Did
29 if tr.Repo.Repo != nil {
30 env["TANGLED_REPO_NAME"] = *tr.Repo.Repo
31 }
32 if tr.Repo.RepoDid != nil {
33 env["TANGLED_REPO_REPO_DID"] = *tr.Repo.RepoDid
34 }
35 env["TANGLED_REPO_DEFAULT_BRANCH"] = tr.Repo.DefaultBranch
36 env["TANGLED_REPO_URL"] = BuildRepoURL(tr.Repo)
37 }
38
39 switch workflow.TriggerKind(tr.Kind) {
40 case workflow.TriggerKindPush:
41 if tr.Push != nil {
42 refName := plumbing.ReferenceName(tr.Push.Ref)
43 refType := "branch"
44 if refName.IsTag() {
45 refType = "tag"
46 }
47
48 env["TANGLED_REF"] = tr.Push.Ref
49 env["TANGLED_REF_NAME"] = refName.Short()
50 env["TANGLED_REF_TYPE"] = refType
51 env["TANGLED_SHA"] = tr.Push.NewSha
52 env["TANGLED_COMMIT_SHA"] = tr.Push.NewSha
53 }
54
55 case workflow.TriggerKindPullRequest:
56 if tr.PullRequest != nil {
57 // for PRs, ref is the source branch
58 env["TANGLED_REF"] = "refs/heads/" + tr.PullRequest.SourceBranch
59 env["TANGLED_REF_NAME"] = tr.PullRequest.SourceBranch
60 env["TANGLED_REF_TYPE"] = "branch"
61 env["TANGLED_SHA"] = tr.PullRequest.SourceSha
62 env["TANGLED_COMMIT_SHA"] = tr.PullRequest.SourceSha
63
64 // PR-specific env vars
65 env["TANGLED_PR_SOURCE_BRANCH"] = tr.PullRequest.SourceBranch
66 env["TANGLED_PR_TARGET_BRANCH"] = tr.PullRequest.TargetBranch
67 env["TANGLED_PR_SOURCE_SHA"] = tr.PullRequest.SourceSha
68 env["TANGLED_PR_ACTION"] = tr.PullRequest.Action
69 }
70
71 case workflow.TriggerKindManual:
72 if tr.Manual != nil {
73 env["TANGLED_SHA"] = tr.Manual.Sha
74 env["TANGLED_COMMIT_SHA"] = tr.Manual.Sha
75 if tr.Manual.Ref != nil && *tr.Manual.Ref != "" {
76 refName := plumbing.ReferenceName(*tr.Manual.Ref)
77 refType := "branch"
78 if refName.IsTag() {
79 refType = "tag"
80 }
81 env["TANGLED_REF"] = *tr.Manual.Ref
82 env["TANGLED_REF_NAME"] = refName.Short()
83 env["TANGLED_REF_TYPE"] = refType
84 }
85 // include manual inputs if present
86 for _, pair := range tr.Manual.Inputs {
87 env["TANGLED_INPUT_"+strings.ToUpper(pair.Key)] = pair.Value
88 }
89 }
90 }
91
92 return env
93}