forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
1package models 2 3import ( 4 "path" 5 6 "tangled.sh/tangled.sh/core/api/tangled" 7 "tangled.sh/tangled.sh/core/spindle/config" 8) 9 10type Pipeline struct { 11 Workflows []Workflow 12} 13 14type Step struct { 15 Command string 16 Name string 17 Environment map[string]string 18} 19 20type Workflow struct { 21 Steps []Step 22 Environment map[string]string 23 Name string 24 Image string 25} 26 27// setupSteps get added to start of Steps 28type setupSteps []Step 29 30// addStep adds a step to the beginning of the workflow's steps. 31func (ss *setupSteps) addStep(step Step) { 32 *ss = append(*ss, step) 33} 34 35// ToPipeline converts a tangled.Pipeline into a model.Pipeline. 36// In the process, dependencies are resolved: nixpkgs deps 37// are constructed atop nixery and set as the Workflow.Image, 38// and ones from custom registries 39func ToPipeline(pl tangled.Pipeline, cfg config.Config) *Pipeline { 40 workflows := []Workflow{} 41 42 for _, twf := range pl.Workflows { 43 swf := &Workflow{} 44 for _, tstep := range twf.Steps { 45 sstep := Step{} 46 sstep.Environment = stepEnvToMap(tstep.Environment) 47 sstep.Command = tstep.Command 48 sstep.Name = tstep.Name 49 swf.Steps = append(swf.Steps, sstep) 50 } 51 swf.Name = twf.Name 52 swf.Environment = workflowEnvToMap(twf.Environment) 53 swf.Image = workflowImage(twf.Dependencies, cfg.Pipelines.Nixery) 54 55 swf.addNixProfileToPath() 56 swf.setGlobalEnvs() 57 setup := &setupSteps{} 58 59 setup.addStep(nixConfStep()) 60 setup.addStep(cloneStep(*twf, *pl.TriggerMetadata.Repo, cfg.Server.Dev)) 61 setup.addStep(checkoutStep(*twf, *pl.TriggerMetadata)) 62 setup.addStep(dependencyStep(*twf)) 63 64 // append setup steps in order to the start of workflow steps 65 swf.Steps = append(*setup, swf.Steps...) 66 67 workflows = append(workflows, *swf) 68 } 69 return &Pipeline{Workflows: workflows} 70} 71 72func workflowEnvToMap(envs []*tangled.Pipeline_Workflow_Environment_Elem) map[string]string { 73 envMap := map[string]string{} 74 for _, env := range envs { 75 envMap[env.Key] = env.Value 76 } 77 return envMap 78} 79 80func stepEnvToMap(envs []*tangled.Pipeline_Step_Environment_Elem) map[string]string { 81 envMap := map[string]string{} 82 for _, env := range envs { 83 envMap[env.Key] = env.Value 84 } 85 return envMap 86} 87 88func workflowImage(deps []tangled.Pipeline_Dependencies_Elem, nixery string) string { 89 var dependencies string 90 for _, d := range deps { 91 if d.Registry == "nixpkgs" { 92 dependencies = path.Join(d.Packages...) 93 } 94 } 95 96 // load defaults from somewhere else 97 dependencies = path.Join(dependencies, "bash", "git", "coreutils", "nix") 98 99 return path.Join(nixery, dependencies) 100} 101 102func (wf *Workflow) addNixProfileToPath() { 103 wf.Environment["PATH"] = "$PATH:/.nix-profile/bin" 104} 105 106func (wf *Workflow) setGlobalEnvs() { 107 wf.Environment["NIX_CONFIG"] = "experimental-features = nix-command flakes" 108 wf.Environment["HOME"] = "/tangled/workspace" 109}