grim/convey

Parents 4f590ae4ad97
Children 5b8a631c8d80
Added a much more complicated unit test for bitbucket pipelines' docker support. Refs #92
--- a/bitbucket/docker-parser.go Mon May 08 21:29:01 2017 -0500
+++ b/bitbucket/docker-parser.go Mon May 08 22:57:33 2017 -0500
@@ -19,6 +19,7 @@
import (
"fmt"
+ "strings"
"github.com/alecthomas/kingpin"
@@ -26,6 +27,8 @@
"bitbucket.org/rw_grim/convey/tasks"
)
+// parseDockerCommand is a super stripped down kingpin parse that will parse
+// docker command line options and return a convey task or an error
func parseDockerCommand(argv []string) (tasks.Task, error) {
app := kingpin.New("", "")
@@ -44,6 +47,24 @@
push := app.Command("push", "")
pushImage := push.Arg("", "").Required().String()
+ pull := app.Command("pull", "")
+ pullImage := pull.Arg("", "").Required().String()
+
+ rmi := app.Command("rmi", "")
+ rmi.Flag("--force", "").Short('f').Default("false").Bool()
+ rmiImage := rmi.Arg("", "").Required().String()
+
+ run := app.Command("run", "")
+ runEntryPoint := run.Flag("entrypoint", "").String()
+ runEnv := run.Flag("env", "").Short('e').Strings()
+ runImage := run.Arg("image", "").Required().String()
+ runWorkdir := run.Flag("workdir", "").Short('w').String()
+ runCommand := run.Arg("", "").Strings()
+
+ tag := app.Command("tag", "")
+ tagSource := tag.Arg("src", "").Required().String()
+ tagDestination := tag.Arg("dest", "").Required().String()
+
cmd, err := app.Parse(argv[1:])
if err != nil {
return nil, err
@@ -67,10 +88,31 @@
task = &docker.Logout{
Server: *logoutServer,
}
+ case "pull":
+ task = &docker.Pull{
+ Image: *pullImage,
+ }
case "push":
task = &docker.Push{
Image: *pushImage,
}
+ case "rmi":
+ task = &docker.Remove{
+ Image: *rmiImage,
+ }
+ case "run":
+ task = &docker.Run{
+ Command: strings.Join(*runCommand, " "),
+ Image: *runImage,
+ EntryPoint: *runEntryPoint,
+ Environment: *runEnv,
+ WorkDir: *runWorkdir,
+ }
+ case "tag":
+ task = &docker.Tag{
+ Source: *tagSource,
+ Destination: *tagDestination,
+ }
}
if task != nil {
--- a/bitbucket/loader.go Mon May 08 21:29:01 2017 -0500
+++ b/bitbucket/loader.go Mon May 08 22:57:33 2017 -0500
@@ -72,7 +72,7 @@
}
currentScript := []string{}
- scriptIdx := 0
+ last := -1
for scriptIdx, command := range pipeline.Steps.Script {
argv, err := shellwords.Parse(command)
@@ -83,12 +83,14 @@
if len(argv) > 0 {
if strings.TrimSpace(strings.ToLower(argv[0])) == "docker" {
- name := fmt.Sprintf("%s-step-%d-%d", name, idx, scriptIdx)
+ taskName := fmt.Sprintf("%s-step-%d-%d", name, idx, scriptIdx)
// if we have existing script commands add them now
if len(currentScript) > 0 {
- addScript(name, image, currentScript, plan, cfg)
+ taskName := fmt.Sprintf("%s-step-%d-%d", name, idx, scriptIdx-1)
+ addScript(taskName, image, currentScript, plan, cfg)
currentScript = []string{}
+ last = scriptIdx
}
// now figure out what docker command we're running
@@ -98,16 +100,18 @@
panic(err)
}
- addTask(name, task, plan, cfg)
+ addTask(taskName, task, plan, cfg)
+ last = scriptIdx
} else {
currentScript = append(currentScript, command)
}
+
}
}
// if we have existing script commands add them now
if len(currentScript) > 0 {
- name := fmt.Sprintf("%s-step-%d-%d", name, idx, scriptIdx)
+ name := fmt.Sprintf("%s-step-%d-%d", name, idx, last+1)
addScript(name, image, currentScript, plan, cfg)
}
}
--- a/bitbucket/loader_test.go Mon May 08 21:29:01 2017 -0500
+++ b/bitbucket/loader_test.go Mon May 08 22:57:33 2017 -0500
@@ -86,7 +86,91 @@
Expect(cfg).To(Equal(expected))
}
-func (b *bitbucketSuite) TestLoaderDocker(t *testing.T) {
+func (b *bitbucketSuite) TestLoaderDockerMixed(t *testing.T) {
+ l := Loader{}
+
+ data := []byte(`image: gliderlabs/alpine:edge
+pipelines:
+ default:
+ - step:
+ script:
+ - hostname
+ - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
+ - date +%s
+ - docker build -t atlassian/my-app:$BITBUCKET_COMMIT .
+ - docker push atlassian/my-app:$BITBUCKET_COMMIT
+ - date +%s
+options:
+ docker: true
+`)
+
+ cfg, err := l.Load("", "", data)
+
+ Expect(err).To(BeNil())
+
+ expected := &config.Config{
+ Tasks: map[string]tasks.Task{
+ "import": &docker.Import{
+ Files: []string{"."},
+ },
+ "default-step-0-0": &docker.Run{
+ Image: "gliderlabs/alpine:edge",
+ Script: []string{"hostname"},
+ WorkDir: "/workspace",
+ Shell: "/bin/sh",
+ },
+ "default-step-0-1": &docker.Login{
+ Username: "$DOCKER_USERNAME",
+ Password: "$DOCKER_PASSWORD",
+ },
+ "default-step-0-2": &docker.Run{
+ Image: "gliderlabs/alpine:edge",
+ Script: []string{"date +%s"},
+ WorkDir: "/workspace",
+ Shell: "/bin/sh",
+ },
+ "default-step-0-3": &docker.Build{
+ Files: []string{"."},
+ Tag: "atlassian/my-app:$BITBUCKET_COMMIT",
+ },
+ "default-step-0-4": &docker.Push{
+ Image: "atlassian/my-app:$BITBUCKET_COMMIT",
+ },
+ "default-step-0-5": &docker.Run{
+ Image: "gliderlabs/alpine:edge",
+ Script: []string{"date +%s"},
+ WorkDir: "/workspace",
+ Shell: "/bin/sh",
+ },
+ },
+ Plans: map[string]plans.Plan{
+ "default": {
+ Stages: []stages.Stage{
+ stages.Stage{
+ Name: "stage-0",
+ Enabled: true,
+ Always: false,
+ Concurrent: false,
+ Environment: nil,
+ Tasks: []string{
+ "import",
+ "default-step-0-0",
+ "default-step-0-1",
+ "default-step-0-2",
+ "default-step-0-3",
+ "default-step-0-4",
+ "default-step-0-5",
+ },
+ },
+ },
+ },
+ },
+ }
+
+ Expect(cfg).To(Equal(expected))
+}
+
+func (b *bitbucketSuite) TestLoaderDockerSimple(t *testing.T) {
l := Loader{}
data := []byte(`pipelines: