blob: 2dc876d3d2dfc851bc8914d6b56daeb8c4876b15 [file] [log] [blame]
Mohammed Naserdabb1dc2022-09-06 14:45:59 -04001package image_repositories
2
3import (
Mohammed Naser6d6b2c92022-09-06 15:24:23 -04004 "fmt"
Mohammed Naserdabb1dc2022-09-06 14:45:59 -04005 "io"
6
7 "github.com/go-git/go-billy/v5"
8 "github.com/goccy/go-yaml"
9)
10
11type GithubWorkflow struct {
Mohammed Naser6d6b2c92022-09-06 15:24:23 -040012 Name string `yaml:"name"`
13 Concurrency GithubWorkflowConcurrency `yaml:"concurrency"`
14 On GithubWorkflowTrigger `yaml:"on"`
15 Jobs map[string]GithubWorkflowJob `yaml:"jobs"`
Mohammed Naserdabb1dc2022-09-06 14:45:59 -040016}
17
18type GithubWorkflowTrigger struct {
Mohammed Naser6d6b2c92022-09-06 15:24:23 -040019 PullRequest GithubWorkflowPullRequest `yaml:"pull_request,omitempty"`
20 Push GithubWorkflowPush `yaml:"push,omitempty"`
21 Schedule []GithubWorkflowSchedule `yaml:"schedule,omitempty"`
22 WorkflowDispatch GithubWorkflowDispatch `yaml:"workflow_dispatch,omitempty"`
Mohammed Naserdabb1dc2022-09-06 14:45:59 -040023}
24
25type GithubWorkflowPullRequest struct {
Mohammed Naser6d6b2c92022-09-06 15:24:23 -040026 Types []string `yaml:"types,omitempty"`
Mohammed Naserdabb1dc2022-09-06 14:45:59 -040027}
28
29type GithubWorkflowPush struct {
30 Branches []string `yaml:"branches"`
31}
32
Mohammed Naser6d6b2c92022-09-06 15:24:23 -040033type GithubWorkflowSchedule struct {
34 Cron string `yaml:"cron"`
35}
36
37type GithubWorkflowDispatch struct {
38 Inputs map[string]GithubWorkflowDispatchInput `yaml:"inputs,omitempty"`
39}
40
41type GithubWorkflowDispatchInput struct {
42 Description string `yaml:"description"`
43 Required bool `yaml:"required"`
44 Default string `yaml:"default"`
45}
46
47type GithubWorkflowConcurrency struct {
48 Group string `yaml:"group"`
49 CancelInProgress bool `yaml:"cancel-in-progress"`
50}
51
Mohammed Naserdabb1dc2022-09-06 14:45:59 -040052type GithubWorkflowJob struct {
Oleksandr Kozachenkod3638832023-10-31 18:54:56 +010053 Permissions map[string]string `yaml:"permissions,omitempty"`
54 RunsOn string `yaml:"runs-on"`
55 Strategy GithubWorkflowStrategy `yaml:"strategy,omitempty"`
56 Steps []GithubWorkflowStep `yaml:"steps"`
Mohammed Naserdabb1dc2022-09-06 14:45:59 -040057}
58
Mohammed Naser0c428872023-09-21 12:59:20 +000059func (j GithubWorkflowJob) DeepCopy() GithubWorkflowJob {
60 job := GithubWorkflowJob{}
61 job.RunsOn = j.RunsOn
62 job.Strategy = j.Strategy.DeepCopy()
63
64 job.Steps = make([]GithubWorkflowStep, len(j.Steps))
65 for i, step := range j.Steps {
66 job.Steps[i] = step.DeepCopy()
67 }
68
69 return job
70}
71
Mohammed Naserdabb1dc2022-09-06 14:45:59 -040072type GithubWorkflowStrategy struct {
Mohammed Naser67abe6a2022-12-03 14:24:12 -050073 Matrix map[string]interface{} `yaml:"matrix"`
Mohammed Naserdabb1dc2022-09-06 14:45:59 -040074}
75
Mohammed Naser0c428872023-09-21 12:59:20 +000076func (s *GithubWorkflowStrategy) DeepCopy() GithubWorkflowStrategy {
77 strategy := *s
78 strategy.Matrix = make(map[string]interface{})
79 for k, v := range s.Matrix {
80 strategy.Matrix[k] = v
81 }
82
83 return strategy
84}
85
Mohammed Naserdabb1dc2022-09-06 14:45:59 -040086type GithubWorkflowStep struct {
Mohammed Naser2a6c4242022-09-06 15:31:31 -040087 Name string `yaml:"name"`
Oleksandr Kozachenkoca40dce2023-11-03 14:07:54 +010088 Id string `yaml:"id,omitempty"`
Mohammed Naser2a6c4242022-09-06 15:31:31 -040089 Run string `yaml:"run,omitempty"`
90 Uses string `yaml:"uses,omitempty"`
91 If string `yaml:"if,omitempty"`
92 With map[string]string `yaml:"with,omitempty"`
93 Environment map[string]string `yaml:"env,omitempty"`
Mohammed Naserdabb1dc2022-09-06 14:45:59 -040094}
95
Mohammed Naser0c428872023-09-21 12:59:20 +000096func (s *GithubWorkflowStep) DeepCopy() GithubWorkflowStep {
97 step := *s
98 step.With = make(map[string]string)
99 for k, v := range s.With {
100 step.With[k] = v
101 }
102
103 step.Environment = make(map[string]string)
104 for k, v := range s.Environment {
105 step.Environment[k] = v
106 }
107
108 return step
109}
110
Mohammed Naserdabb1dc2022-09-06 14:45:59 -0400111func (g *GithubWorkflow) Write(wr io.Writer) error {
112 bytes, err := yaml.Marshal(g)
113 if err != nil {
114 return err
115 }
116
117 _, err = wr.Write(bytes)
118 return err
119}
120
121func (g *GithubWorkflow) WriteFile(fs billy.Filesystem) error {
Mohammed Naser6d6b2c92022-09-06 15:24:23 -0400122 file := fmt.Sprintf(".github/workflows/%s.yml", g.Name)
123
124 f, err := fs.Create(file)
Mohammed Naserdabb1dc2022-09-06 14:45:59 -0400125 if err != nil {
126 return err
127 }
128 defer f.Close()
129
130 return g.Write(f)
131}