github.com/JarrahG/buffalocli@v0.0.0-20230801092127-b85bfd5d395a/internal/genny/ci/ci.go (about) 1 package ci 2 3 import ( 4 "embed" 5 "fmt" 6 "html/template" 7 "io/fs" 8 "strings" 9 10 "github.com/gobuffalo/genny/v2" 11 "github.com/gobuffalo/genny/v2/gogen" 12 ) 13 14 //go:embed templates/* 15 var templates embed.FS 16 17 // New generator for adding circleci, github, gitlab or travis 18 func New(opts *Options) (*genny.Generator, error) { 19 g := genny.New() 20 21 if err := opts.Validate(); err != nil { 22 return g, err 23 } 24 25 g.Transformer(genny.Replace("-no-pop", "")) 26 g.Transformer(genny.Dot()) 27 28 // TODO: workaround for 1.16, remove when we upgrade to 1.17 and rename "dot-*" files back to "-dot-*" 29 g.Transformer(genny.NewTransformer("*", func(f genny.File) (genny.File, error) { 30 name := f.Name() 31 if strings.HasPrefix(name, "dot-") { 32 name = strings.TrimPrefix(name, "dot-") 33 name = "." + name 34 } 35 return genny.NewFile(name, f), nil 36 })) 37 g.Transformer(genny.Replace("/dot-", "/.")) 38 39 var fname string 40 switch opts.Provider { 41 case "circleci": 42 fname = "dot-circleci/config.yml.tmpl" 43 case "github": 44 fname = "dot-github/workflows/test.yml.tmpl" 45 case "gitlab", "gitlab-ci": 46 if opts.App.WithPop { 47 fname = "dot-gitlab-ci.yml.tmpl" 48 } else { 49 fname = "dot-gitlab-ci-no-pop.yml.tmpl" 50 } 51 case "travis", "travis-ci": 52 fname = "dot-travis.yml.tmpl" 53 default: 54 return g, fmt.Errorf("could not find a template for %s", opts.Provider) 55 } 56 57 sub, err := fs.Sub(templates, "templates") 58 if err != nil { 59 return g, err 60 } 61 62 f, err := sub.Open(fname) 63 if err != nil { 64 return g, err 65 } 66 67 g.File(genny.NewFile(fname, f)) 68 69 data := map[string]interface{}{ 70 "opts": opts, 71 } 72 73 if opts.DBType == "postgres" { 74 data["testDbUrl"] = "postgres://postgres:postgres@postgres:5432/" + opts.App.Name.File().String() + "_test?sslmode=disable" 75 } else if opts.DBType == "mysql" { 76 data["testDbUrl"] = "mysql://root:root@(mysql:3306)/" + opts.App.Name.File().String() + "_test?parseTime=true&multiStatements=true&readTimeout=1s" 77 } else { 78 data["testDbUrl"] = "" 79 } 80 81 helpers := template.FuncMap{} 82 83 t := gogen.TemplateTransformer(data, helpers) 84 g.Transformer(t) 85 86 return g, nil 87 }