Skip to content

Commit d8f1e25

Browse files
committed
feat(pipeline): add dryccfile support
1 parent 9b90884 commit d8f1e25

4 files changed

Lines changed: 92 additions & 43 deletions

File tree

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ go 1.22
55
require (
66
github.com/aws/aws-sdk-go v1.50.25
77
github.com/distribution/distribution/v3 v3.0.0-alpha.1.0.20240215070122-62aa44edfde0
8-
github.com/drycc/controller-sdk-go v0.0.0-20240304053455-0352ebbb02dc
8+
github.com/drycc/controller-sdk-go v0.0.0-20240403162730-10676f2b328d
99
github.com/drycc/pkg v0.0.0-20240225112316-78fc9239f51f
1010
github.com/google/uuid v1.6.0
1111
github.com/kelseyhightower/envconfig v1.4.0
12-
github.com/stretchr/testify v1.8.4
12+
github.com/stretchr/testify v1.9.0
1313
github.com/urfave/cli/v2 v2.27.1
1414
golang.org/x/crypto v0.19.0
1515
gopkg.in/yaml.v3 v3.0.1

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ github.com/distribution/distribution/v3 v3.0.0-alpha.1.0.20240215070122-62aa44ed
1818
github.com/distribution/distribution/v3 v3.0.0-alpha.1.0.20240215070122-62aa44edfde0/go.mod h1:wEFrX2NpxlKzg7JIqU/xYPgbzTR35TAlT4KJSdqRKcI=
1919
github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
2020
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
21-
github.com/drycc/controller-sdk-go v0.0.0-20240304053455-0352ebbb02dc h1:tRMSrNX3qFzQsfVhij1pO2pwHIWTdSvCbrAcsX+wwrQ=
22-
github.com/drycc/controller-sdk-go v0.0.0-20240304053455-0352ebbb02dc/go.mod h1:EAzlvB5kQq4pFP+h+zl0mx2q1GUlHgzdQ92tlYtDQfQ=
21+
github.com/drycc/controller-sdk-go v0.0.0-20240403162730-10676f2b328d h1:qffye+xHsNTpn9/kD0YY/fkov6IBJTJIVXWxoXtXCrw=
22+
github.com/drycc/controller-sdk-go v0.0.0-20240403162730-10676f2b328d/go.mod h1:RJ0QxVNWhximzfd08+FkZfKzrX7gOp2gsgXfpqVPJZQ=
2323
github.com/drycc/pkg v0.0.0-20240225112316-78fc9239f51f h1:kgjvUQJeAszDoU1Vo4vTTE92KI8Av3JPb6Qn890niXg=
2424
github.com/drycc/pkg v0.0.0-20240225112316-78fc9239f51f/go.mod h1:n+QxGif6ha9CEoxVnlipxb9IdmerybcUSzTEDFkvjiA=
2525
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
@@ -146,8 +146,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
146146
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
147147
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
148148
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
149-
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
150-
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
149+
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
150+
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
151151
github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho=
152152
github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
153153
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=

pkg/gitreceive/build.go

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,10 @@ func build(
249249
if err != nil {
250250
return err
251251
}
252+
dryccfile, err := getDryccfile(tmpDir)
253+
if err != nil {
254+
return err
255+
}
252256
dockerfile, err := getDockerfile(tmpDir, stack)
253257
if err != nil {
254258
return err
@@ -257,7 +261,7 @@ func build(
257261

258262
quit := progress("...", conf.SessionIdleInterval())
259263
log.Info("Launching App...")
260-
release, err := hooks.CreateBuild(client, conf.Username, conf.App(), imageName, stack["name"], gitSha.Short(), procfile, dockerfile)
264+
release, err := hooks.CreateBuild(client, conf.Username, conf.App(), imageName, stack["name"], gitSha.Short(), procfile, dryccfile, dockerfile)
261265
quit <- true
262266
<-quit
263267
if controller.CheckAPICompat(client, err) != nil {
@@ -301,25 +305,41 @@ func prettyPrintJSON(data interface{}) (string, error) {
301305

302306
func getProcfile(dirName string) (dryccAPI.ProcessType, error) {
303307
procfile := dryccAPI.ProcessType{}
304-
if _, err := os.Stat(fmt.Sprintf("%s/Procfile", dirName)); err == nil {
305-
rawProcFile, err := os.ReadFile(fmt.Sprintf("%s/Procfile", dirName))
308+
file := fmt.Sprintf("%s/Procfile", dirName)
309+
if _, err := os.Stat(file); err == nil {
310+
rawProcFile, err := os.ReadFile(file)
306311
if err != nil {
307-
return nil, fmt.Errorf("error in reading %s/Procfile (%s)", dirName, err)
312+
return nil, fmt.Errorf("error in reading %s (%s)", file, err)
308313
}
309314
if err := yaml.Unmarshal(rawProcFile, &procfile); err != nil {
310-
return nil, fmt.Errorf("procfile %s/ProcFile is malformed (%s)", dirName, err)
315+
return nil, fmt.Errorf("procfile %s is malformed (%s)", file, err)
316+
}
317+
}
318+
return procfile, nil
319+
}
320+
321+
func getDryccfile(dirName string) (map[string]interface{}, error) {
322+
dryccfile := map[string]interface{}{}
323+
file := fmt.Sprintf("%s/drycc.yaml", dirName)
324+
if _, err := os.Stat(file); err == nil {
325+
rawDryccfile, err := os.ReadFile(file)
326+
if err != nil {
327+
return nil, fmt.Errorf("error in reading %s (%s)", file, err)
328+
}
329+
if err := yaml.Unmarshal(rawDryccfile, &dryccfile); err != nil {
330+
return nil, fmt.Errorf("drycc.yaml %s is malformed (%s)", file, err)
311331
}
312-
return procfile, nil
313332
}
314-
return nil, fmt.Errorf("no Procfile can be matched in (%s)", dirName)
333+
return dryccfile, nil
315334
}
316335

317336
func getDockerfile(dirName string, stack map[string]string) (string, error) {
318337
if stack["name"] == "container" {
319-
if _, err := os.Stat(fmt.Sprintf("%s/Dockerfile", dirName)); err == nil {
320-
rawDockerfile, err := os.ReadFile(fmt.Sprintf("%s/Dockerfile", dirName))
338+
file := fmt.Sprintf("%s/Dockerfile", dirName)
339+
if _, err := os.Stat(file); err == nil {
340+
rawDockerfile, err := os.ReadFile(file)
321341
if err != nil {
322-
return "", fmt.Errorf("error in reading %s/Dockerfile (%s)", dirName, err)
342+
return "", fmt.Errorf("error in reading %s (%s)", file, err)
323343
}
324344
return string(rawDockerfile), nil
325345
}

pkg/gitreceive/build_test.go

Lines changed: 56 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package gitreceive
33
import (
44
"bytes"
55
"context"
6-
"fmt"
76
"os"
87
"os/exec"
98
"path/filepath"
@@ -96,6 +95,59 @@ func TestRepoCmd(t *testing.T) {
9695
}
9796
}
9897

98+
func TestGetDryccfileFromRepoSuccess(t *testing.T) {
99+
tmpDir, err := os.MkdirTemp("", "tmpdir")
100+
if err != nil {
101+
t.Fatalf("error creating temp directory (%s)", err)
102+
}
103+
104+
data := `
105+
build:
106+
docker:
107+
web: Dockerfile
108+
worker: worker/Dockerfile
109+
config:
110+
RAILS_ENV: development
111+
FOO: bar
112+
run:
113+
command:
114+
- ./deployment-tasks.sh
115+
image: worker
116+
deploy:
117+
web:
118+
command:
119+
- bash
120+
- -c
121+
args: bundle exec puma -C config/puma.rb
122+
worker:
123+
command:
124+
- bash
125+
- -c
126+
args:
127+
- python myworker.py
128+
asset-syncer:
129+
command:
130+
- bash
131+
- -c
132+
args:
133+
- python asset-syncer.py
134+
image: worker
135+
`
136+
if err := os.WriteFile(tmpDir+"/drycc.yaml", []byte(data), 0644); err != nil {
137+
t.Fatalf("error creating %s/drycc.yaml (%s)", tmpDir, err)
138+
}
139+
defer func() {
140+
if err := os.RemoveAll(tmpDir); err != nil {
141+
t.Fatalf("failed to remove drycc.yaml from %s (%s)", tmpDir, err)
142+
}
143+
}()
144+
dryccfile, err := getDryccfile(tmpDir)
145+
actualData := map[string]interface{}{}
146+
yaml.Unmarshal([]byte(data), &actualData)
147+
assert.Equal(t, err, nil)
148+
assert.Equal(t, dryccfile, actualData, "data")
149+
}
150+
99151
func TestGetProcfileFromRepoSuccess(t *testing.T) {
100152
tmpDir, err := os.MkdirTemp("", "tmpdir")
101153
if err != nil {
@@ -110,10 +162,6 @@ func TestGetProcfileFromRepoSuccess(t *testing.T) {
110162
t.Fatalf("failed to remove Procfile from %s (%s)", tmpDir, err)
111163
}
112164
}()
113-
config := api.Config{}
114-
config.Values = map[string]interface{}{
115-
"DRYCC_STACK": "buildpack",
116-
}
117165
procType, err := getProcfile(tmpDir)
118166
actualData := api.ProcessType{}
119167
yaml.Unmarshal(data, &actualData)
@@ -135,36 +183,17 @@ func TestGetProcfileFromRepoFailure(t *testing.T) {
135183
t.Fatalf("failed to remove Procfile from %s (%s)", tmpDir, err)
136184
}
137185
}()
138-
config := api.Config{}
139-
config.Values = map[string]interface{}{
140-
"DRYCC_STACK": "buildpack",
141-
}
142186
_, err = getProcfile(tmpDir)
143187

144188
assert.True(t, err != nil, "no error received when there should have been")
145189
}
146190

147191
func TestGetProcfileFromServerSuccess(t *testing.T) {
148-
data := []byte("web: example-go")
149-
config := api.Config{}
150-
config.Values = map[string]interface{}{
151-
"DRYCC_STACK": "buildpack",
152-
}
153-
154-
_, err := getProcfile("")
192+
data := []byte("")
193+
expect, _ := getProcfile("")
155194
actualData := api.ProcessType{}
156195
yaml.Unmarshal(data, &actualData)
157-
assert.Error(t, err, fmt.Errorf("no Procfile can be matched in (%s)", ""))
158-
}
159-
160-
func TestGetProcfileFromServerFailure(t *testing.T) {
161-
config := api.Config{}
162-
config.Values = map[string]interface{}{
163-
"DRYCC_STACK": "buildpack",
164-
}
165-
_, err := getProcfile("")
166-
assert.Error(t, err, fmt.Errorf("no Procfile can be matched in (%s)", ""))
167-
assert.True(t, err != nil, "no error received when there should have been")
196+
assert.Equal(t, expect, actualData)
168197
}
169198

170199
func TestPrettyPrintJSON(t *testing.T) {

0 commit comments

Comments
 (0)