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}