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