Skip to content

Commit f51e2e4

Browse files
committed
feat: Make builds an implicit part of the deployment
Allow deployment commands to get gather the stack definition from code. BREAKING CHANGES: command structure - remove the build command - deplyoments now have the "name" passed as a flag - deployments now accept the handlerGlob
1 parent c5db5c6 commit f51e2e4

File tree

19 files changed

+449
-276
lines changed

19 files changed

+449
-276
lines changed

pkg/build/build.go

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/nitrictech/newcli/pkg/functiondockerfile"
2727
"github.com/nitrictech/newcli/pkg/stack"
2828
"github.com/nitrictech/newcli/pkg/target"
29+
"github.com/nitrictech/newcli/pkg/utils"
2930
)
3031

3132
func Create(s *stack.Stack, t *target.Target) error {
@@ -36,14 +37,14 @@ func Create(s *stack.Stack, t *target.Target) error {
3637
for _, f := range s.Functions {
3738
for _, script := range f.BuildScripts {
3839
cmd := exec.Command(script)
39-
cmd.Dir = path.Join(s.Path(), f.Context)
40+
cmd.Dir = path.Join(s.Dir, f.Context)
4041
err := cmd.Run()
4142
if err != nil {
4243
return err
4344
}
4445
}
4546

46-
fh, err := os.CreateTemp(s.Path(), "Dockerfile.*")
47+
fh, err := os.CreateTemp(s.Dir, "Dockerfile.*")
4748
if err != nil {
4849
return err
4950
}
@@ -56,15 +57,15 @@ func Create(s *stack.Stack, t *target.Target) error {
5657
fh.Close()
5758

5859
buildArgs := map[string]string{"PROVIDER": t.Provider}
59-
err = cr.Build(path.Base(fh.Name()), f.ContextDirectory(), f.ImageTagName(s, t.Provider), buildArgs)
60+
err = cr.Build(path.Base(fh.Name()), f.ContextDirectory, f.ImageTagName(s, t.Provider), buildArgs)
6061
if err != nil {
6162
return err
6263
}
6364
}
6465

6566
for _, c := range s.Containers {
6667
buildArgs := map[string]string{"PROVIDER": t.Provider}
67-
err := cr.Build(path.Join(c.Context, c.Dockerfile), c.ContextDirectory(), c.ImageTagName(s, t.Provider), buildArgs)
68+
err := cr.Build(path.Join(c.Context, c.Dockerfile), c.ContextDirectory, c.ImageTagName(s, t.Provider), buildArgs)
6869
if err != nil {
6970
return err
7071
}
@@ -73,14 +74,24 @@ func Create(s *stack.Stack, t *target.Target) error {
7374
}
7475

7576
// CreateBaseDev builds images for code-as-config
76-
func CreateBaseDev(stackPath string, imagesToBuild map[string]string) error {
77+
func CreateBaseDev(s *stack.Stack) error {
7778
ce, err := containerengine.Discover()
7879
if err != nil {
7980
return err
8081
}
82+
imagesToBuild := map[string]string{}
83+
for _, f := range s.Functions {
84+
rt, err := utils.NewRunTimeFromFilename(f.Handler)
85+
if err != nil {
86+
return err
87+
}
88+
lang := rt.String()
89+
_, ok := imagesToBuild[lang]
90+
if ok {
91+
continue
92+
}
8193

82-
for lang, imageTag := range imagesToBuild {
83-
f, err := os.CreateTemp(stackPath, fmt.Sprintf("%s.*.dockerfile", lang))
94+
f, err := os.CreateTemp(s.Dir, fmt.Sprintf("%s.*.dockerfile", lang))
8495
if err != nil {
8596
return err
8697
}
@@ -94,9 +105,10 @@ func CreateBaseDev(stackPath string, imagesToBuild map[string]string) error {
94105
return err
95106
}
96107

97-
if err := ce.Build(path.Base(f.Name()), stackPath, imageTag, map[string]string{}); err != nil {
108+
if err := ce.Build(path.Base(f.Name()), s.Dir, rt.DevImageName(), map[string]string{}); err != nil {
98109
return err
99110
}
111+
imagesToBuild[lang] = rt.DevImageName()
100112
}
101113

102114
return nil
@@ -109,15 +121,15 @@ func List(s *stack.Stack) ([]containerengine.Image, error) {
109121
}
110122
images := []containerengine.Image{}
111123
for _, f := range s.Functions {
112-
imgs, err := cr.ListImages(s.Name, f.Name())
124+
imgs, err := cr.ListImages(s.Name, f.Name)
113125
if err != nil {
114126
fmt.Println("Error: ", err)
115127
} else {
116128
images = append(images, imgs...)
117129
}
118130
}
119131
for _, c := range s.Containers {
120-
imgs, err := cr.ListImages(s.Name, c.Name())
132+
imgs, err := cr.ListImages(s.Name, c.Name)
121133
if err != nil {
122134
fmt.Println("Error: ", err)
123135
} else {

pkg/build/build_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,14 @@ func TestCreateBaseDev(t *testing.T) {
3939
}
4040
defer os.RemoveAll(dir)
4141

42+
s := &stack.Stack{Dir: dir}
43+
s.Functions = map[string]stack.Function{"foo": {Handler: "functions/list.ts"}}
44+
4245
me.EXPECT().Build(gomock.Any(), dir, "nitric-ts-dev", map[string]string{})
4346

4447
containerengine.DiscoveredEngine = me
4548

46-
if err := CreateBaseDev(dir, map[string]string{"ts": "nitric-ts-dev"}); err != nil {
49+
if err := CreateBaseDev(s); err != nil {
4750
t.Errorf("CreateBaseDev() error = %v", err)
4851
}
4952
}
@@ -54,7 +57,7 @@ func TestCreate(t *testing.T) {
5457
me.EXPECT().Build(gomock.Any(), "", "corp-abc-dev:123456", map[string]string{"PROVIDER": "aws"})
5558
me.EXPECT().Build("Dockerfile.custom", "", "corp-xyz-dev:444444", map[string]string{"PROVIDER": "aws"})
5659

57-
containerengine.MockEngine = me
60+
containerengine.DiscoveredEngine = me
5861

5962
s := &stack.Stack{
6063
Name: "test-stack",

pkg/cmd/build/root.go

Lines changed: 0 additions & 71 deletions
This file was deleted.

pkg/cmd/deployment/root.go

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,79 +19,118 @@ package deployment
1919
import (
2020
"github.com/spf13/cobra"
2121

22+
"github.com/nitrictech/newcli/pkg/build"
23+
"github.com/nitrictech/newcli/pkg/codeconfig"
2224
"github.com/nitrictech/newcli/pkg/output"
2325
"github.com/nitrictech/newcli/pkg/provider"
2426
"github.com/nitrictech/newcli/pkg/stack"
2527
"github.com/nitrictech/newcli/pkg/target"
2628
)
2729

30+
var deploymentName string
31+
2832
var deploymentCmd = &cobra.Command{
2933
Use: "deployment",
3034
Short: "Work with a deployment",
31-
Long: `Delopy a project, e.g.
32-
nitric deployment create
33-
nitric deployment delete
34-
nitric deployment list
35-
nitric deployment describe
35+
Long: `Delopy a project`,
36+
Example: `nitric deployment apply
37+
nitric deployment apply -n prod -s ../project/ -t prod
38+
nitric deployment apply -n prod -s ../project/ -t prod "functions/*.ts"
39+
40+
nitric deployment delete
41+
nitric deployment list
3642
`,
3743
}
3844

3945
var deploymentApplyCmd = &cobra.Command{
40-
Use: "apply [name]",
46+
Use: "apply [handlerGlob]",
4147
Short: "Create or Update a new application deployment",
4248
Long: `Applies a Nitric application deployment.`,
4349
Run: func(cmd *cobra.Command, args []string) {
4450
t, err := target.FromOptions()
4551
cobra.CheckErr(err)
52+
4653
s, err := stack.FromOptions()
54+
if err != nil && len(args) > 0 {
55+
s, err = stack.FromGlobArgs(args)
56+
cobra.CheckErr(err)
57+
58+
s, err = codeconfig.Populate(s)
59+
}
4760
cobra.CheckErr(err)
61+
4862
p, err := provider.NewProvider(s, t)
4963
cobra.CheckErr(err)
64+
65+
err = build.Create(s, t)
66+
cobra.CheckErr(err)
67+
5068
cobra.CheckErr(p.Apply(args[0]))
5169
},
52-
Args: cobra.ExactArgs(1),
70+
Args: cobra.MinimumNArgs(0),
5371
}
5472

5573
var deploymentDeleteCmd = &cobra.Command{
56-
Use: "delete [name]",
74+
Use: "delete [handlerGlob]",
5775
Short: "Delete an application deployment",
5876
Long: `Delete a Nitric application deployment.`,
5977
Run: func(cmd *cobra.Command, args []string) {
6078
t, err := target.FromOptions()
6179
cobra.CheckErr(err)
80+
6281
s, err := stack.FromOptions()
82+
if err != nil && len(args) > 0 {
83+
s, err = stack.FromGlobArgs(args)
84+
cobra.CheckErr(err)
85+
86+
s, err = codeconfig.Populate(s)
87+
}
6388
cobra.CheckErr(err)
89+
6490
p, err := provider.NewProvider(s, t)
6591
cobra.CheckErr(err)
92+
6693
cobra.CheckErr(p.Delete(args[0]))
6794
},
68-
Args: cobra.ExactArgs(1),
95+
Args: cobra.MinimumNArgs(0),
6996
}
7097

7198
var deploymentListCmd = &cobra.Command{
72-
Use: "list",
99+
Use: "list [handlerGlob]",
73100
Short: "list deployments for a stack",
74101
Long: `Lists Nitric application deployments for a stack.`,
75102
Run: func(cmd *cobra.Command, args []string) {
76103
t, err := target.FromOptions()
77104
cobra.CheckErr(err)
105+
78106
s, err := stack.FromOptions()
107+
if err != nil && len(args) > 0 {
108+
s, err = stack.FromGlobArgs(args)
109+
cobra.CheckErr(err)
110+
111+
s, err = codeconfig.Populate(s)
112+
}
79113
cobra.CheckErr(err)
114+
80115
p, err := provider.NewProvider(s, t)
81116
cobra.CheckErr(err)
117+
82118
deps, err := p.List()
83119
cobra.CheckErr(err)
120+
84121
output.Print(deps)
85122
},
86-
Args: cobra.MaximumNArgs(0),
123+
Args: cobra.MinimumNArgs(0),
87124
}
88125

89126
func RootCommand() *cobra.Command {
90127
deploymentCmd.AddCommand(deploymentApplyCmd)
128+
deploymentApplyCmd.Flags().StringVarP(&deploymentName, "name", "n", "dep", "the name of the deployment")
91129
cobra.CheckErr(target.AddOptions(deploymentApplyCmd, false))
92130
stack.AddOptions(deploymentApplyCmd)
93131

94132
deploymentCmd.AddCommand(deploymentDeleteCmd)
133+
deploymentDeleteCmd.Flags().StringVarP(&deploymentName, "name", "n", "dep", "the name of the deployment")
95134
cobra.CheckErr(target.AddOptions(deploymentDeleteCmd, false))
96135
stack.AddOptions(deploymentDeleteCmd)
97136

pkg/cmd/root.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
"github.com/spf13/cobra"
2727
"github.com/spf13/viper"
2828

29-
"github.com/nitrictech/newcli/pkg/cmd/build"
3029
"github.com/nitrictech/newcli/pkg/cmd/deployment"
3130
"github.com/nitrictech/newcli/pkg/cmd/provider"
3231
"github.com/nitrictech/newcli/pkg/cmd/run"
@@ -84,7 +83,6 @@ func init() {
8483
})
8584
cobra.CheckErr(err)
8685

87-
rootCmd.AddCommand(build.RootCommand())
8886
rootCmd.AddCommand(deployment.RootCommand())
8987
rootCmd.AddCommand(provider.RootCommand())
9088
rootCmd.AddCommand(stack.RootCommand())

0 commit comments

Comments
 (0)