-
Notifications
You must be signed in to change notification settings - Fork 1
/
create_lile.go
149 lines (126 loc) · 3.63 KB
/
create_lile.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package cmd
import (
"bytes"
"fmt"
"io"
"os"
"os/exec"
"runtime"
"github.com/spf13/cobra"
"github.com/jenkins-x/jx/pkg/jx/cmd/templates"
cmdutil "github.com/jenkins-x/jx/pkg/jx/cmd/util"
"github.com/jenkins-x/jx/pkg/log"
"github.com/jenkins-x/jx/pkg/util"
)
const (
optionOutputDir = "output-dir"
)
var (
createLileLong = templates.LongDesc(`
Creates a new lile application and then optionally setups CI/CD pipelines and GitOps promotion.
Lile is an application generator for gRPC services in Go with a set of tools/libraries.
This command is expected to be run within your '$GOHOME' directory. e.g. at '$GOHOME/src/github.com/myOrgOrUser/'
For more documentation about lile see: [https://github.com/lileio/lile](https://github.com/lileio/lile)
`)
createLileExample = templates.Examples(`
# Create a lile application and be prompted for the folder name
jx create lile
# Create a lile application under test1
jx create lile -o test1
`)
)
// CreateLileOptions the options for the create spring command
type CreateLileOptions struct {
CreateProjectOptions
OutDir string
}
// NewCmdCreateLile creates a command object for the "create" command
func NewCmdCreateLile(f cmdutil.Factory, out io.Writer, errOut io.Writer) *cobra.Command {
options := &CreateLileOptions{
CreateProjectOptions: CreateProjectOptions{
ImportOptions: ImportOptions{
CommonOptions: CommonOptions{
Factory: f,
Out: out,
Err: errOut,
},
},
},
}
cmd := &cobra.Command{
Use: "lile",
Short: "Create a new lile based application and import the generated code into git and Jenkins for CI/CD",
Long: createLileLong,
Example: createLileExample,
Run: func(cmd *cobra.Command, args []string) {
options.Cmd = cmd
options.Args = args
err := options.Run()
cmdutil.CheckErr(err)
},
}
cmd.Flags().StringVarP(&options.OutDir, optionOutputDir, "o", "", "Relative directory to output the project to. Defaults to current directory")
return cmd
}
// checkLileInstalled lazily install lile if its not installed already
func (o CreateLileOptions) checkLileInstalled() error {
_, err := o.getCommandOutput("", "lile", "help")
if err != nil {
log.Infoln("Installing lile's dependencies...")
// lets install lile
err = o.installBrewIfRequired()
if err != nil {
return err
}
if runtime.GOOS == "darwin" && !o.NoBrew {
err = o.runCommand("brew", "install", "protobuf")
if err != nil {
return err
}
}
log.Infoln("Downloading and building lile - this can take a while...")
err = o.runCommand("go", "get", "-u", "github.com/lileio/lile/...")
if err == nil {
log.Infoln("Installed lile and its dependencies!")
}
}
return err
}
// GenerateLile creates a fresh lile project by running lile on local shell
func (o CreateLileOptions) GenerateLile(dir string) error {
var cmdOut bytes.Buffer
e := exec.Command("lile", "new", dir)
e.Env = os.Environ()
e.Env = append(e.Env, "CI=do_not_prompt")
e.Stdout = &cmdOut
e.Stderr = o.Err
err := e.Run()
return err
}
// Run implements the command
func (o *CreateLileOptions) Run() error {
err := o.checkLileInstalled()
if err != nil {
return err
}
dir := o.OutDir
if dir == "" {
if o.BatchMode {
return util.MissingOption(optionOutputDir)
}
dir, err = util.PickValue("Pick a name for the new project:", "myapp", true)
if err != nil {
return err
}
if dir == "" || dir == "." {
return fmt.Errorf("Invalid project name: %s", dir)
}
}
// generate lile project
err = o.GenerateLile(dir)
if err != nil {
return err
}
log.Infof("Created lile project at %s\n\n", util.ColorInfo(dir))
return o.ImportCreatedProject(dir)
}