Monorepo for Tangled tangled.org
1

Configure Feed

Select the types of activity you want to include in your feed.

core / spindle / models / pipeline_env.go
3.3 kB 108 lines
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}