--- a/ChangeLog Sun Jan 21 00:24:21 2018 -0600
+++ b/ChangeLog Sun Jan 21 00:24:55 2018 -0600
@@ -1,5 +1,6 @@
- * Nothing yet! Be the first!!
+ * Changed tasks names for bitbucket pipeline tasks. + * Abstracted the bitbucket pipeline script parsing to a library function. * Write warning, error, and fatal log messages to stderr. Fixed #156
--- a/loaders/bitbucket/loader.go Sun Jan 21 00:24:21 2018 -0600
+++ b/loaders/bitbucket/loader.go Sun Jan 21 00:24:55 2018 -0600
@@ -20,13 +20,11 @@
- "github.com/kballard/go-shellquote"
"bitbucket.org/rw_grim/convey/config"
"bitbucket.org/rw_grim/convey/docker"
"bitbucket.org/rw_grim/convey/plans"
+ "bitbucket.org/rw_grim/convey/script" "bitbucket.org/rw_grim/convey/stages"
"bitbucket.org/rw_grim/convey/state"
"bitbucket.org/rw_grim/convey/tasks"
@@ -37,23 +35,6 @@
// Loader is a loader.Loader that loads bitbucket-pipelines.yml files
-func addTask(name string, task tasks.Task, plan plans.Plan, cfg *config.Config) {
- plan.Stages[0].Tasks = append(plan.Stages[0].Tasks, name)
-func addScript(name string, image image, script []string, plan plans.Plan, cfg *config.Config) {
- addTask(name, task, plan, cfg)
func addPipeline(name string, defImage image, pipelines []pipeline, cfg *config.Config) error {
@@ -103,47 +84,17 @@
plan.Stages[idx].Tasks = append(plan.Stages[idx].Tasks, loginTask)
- // now figure out how to parse the script in the config
- currentScript := []string{}
- for scriptIdx, command := range pipeline.Steps.Script {
- argv, err := shellquote.Split(command)
- if strings.TrimSpace(strings.ToLower(argv[0])) == "docker" {
- taskName := fmt.Sprintf("%s-step-%d-%d", name, idx, scriptIdx)
- // if we have existing script commands add them now
- if len(currentScript) > 0 {
- taskName := fmt.Sprintf("%s-step-%d-%d", name, idx, scriptIdx-1)
- addScript(taskName, image, currentScript, plan, cfg)
- currentScript = []string{}
- // now figure out what docker command we're running
- task, err := docker.ParseCommand(argv)
- addTask(taskName, task, plan, cfg)
- currentScript = append(currentScript, command)
+ parsedTasks, err := script.Parse(image.Name, "/bin/sh", pipeline.Steps.Script) - // if we have existing script commands add them now
- if len(currentScript) > 0 {
- name := fmt.Sprintf("%s-step-%d-%d", name, idx, last+1)
- addScript(name, image, currentScript, plan, cfg)
+ for idx, task := range parsedTasks { + name := fmt.Sprintf("%s-%d", name, idx) + plan.Stages[0].Tasks = append(plan.Stages[0].Tasks, name) // if we have a logout task, add it to the tasks for this stage
--- a/loaders/bitbucket/loader_test.go Sun Jan 21 00:24:21 2018 -0600
+++ b/loaders/bitbucket/loader_test.go Sun Jan 21 00:24:55 2018 -0600
@@ -42,7 +42,7 @@
- PYTHONPATH=$(pwd) py.test --color=auto --cov=pipelines --cov-report=term-missing tests`)
- cfg, err := l.Load("", "", data, true)
+ cfg, err := l.Load("", "", data, []string{}, true) @@ -51,7 +51,7 @@
"import": &docker.Import{
- "default-step-0-0": &docker.Run{
+ "default-0": &docker.Run{ @@ -74,7 +74,7 @@
- Tasks: []string{"import", "default-step-0-0"},
+ Tasks: []string{"import", "default-0"}, @@ -100,7 +100,7 @@
- PYTHONPATH=$(pwd) py.test --color=auto --cov=pipelines --cov-report=term-missing tests`)
- cfg, err := l.Load("", "", data, true)
+ cfg, err := l.Load("", "", data, []string{}, true) @@ -109,7 +109,7 @@
"import": &docker.Import{
- "default-step-0-0": &docker.Run{
+ "default-0": &docker.Run{ @@ -132,7 +132,7 @@
- Tasks: []string{"import", "default-step-0-0"},
+ Tasks: []string{"import", "default-0"}, @@ -161,7 +161,7 @@
- PYTHONPATH=$(pwd) py.test --color=auto --cov=pipelines --cov-report=term-missing tests`)
- cfg, err := l.Load("", "", data, true)
+ cfg, err := l.Load("", "", data, []string{}, true) @@ -175,7 +175,7 @@
Server: "registry.docker.io",
- "default-step-0-0": &docker.Run{
+ "default-0": &docker.Run{ Image: "registry.docker.io/python:3",
@@ -201,7 +201,7 @@
- Tasks: []string{"import", "login", "default-step-0-0", "logout"},
+ Tasks: []string{"import", "login", "default-0", "logout"}, @@ -227,7 +227,7 @@
- PYTHONPATH=$(pwd) py.test --color=auto --cov=pipelines --cov-report=term-missing tests`)
- cfg, err := l.Load("", "", data, true)
+ cfg, err := l.Load("", "", data, []string{}, true) @@ -236,7 +236,7 @@
"import": &docker.Import{
- "default-step-0-0": &docker.Run{
+ "default-0": &docker.Run{ @@ -259,7 +259,7 @@
- Tasks: []string{"import", "default-step-0-0"},
+ Tasks: []string{"import", "default-0"}, @@ -287,7 +287,7 @@
- PYTHONPATH=$(pwd) py.test --color=auto --cov=pipelines --cov-report=term-missing tests`)
- cfg, err := l.Load("", "", data, true)
+ cfg, err := l.Load("", "", data, []string{}, true) @@ -301,7 +301,7 @@
Server: "registry.docker.io",
- "default-step-0-0": &docker.Run{
+ "default-0": &docker.Run{ Image: "registry.docker.io/python:3",
@@ -327,7 +327,7 @@
- Tasks: []string{"import", "default-0-login", "default-step-0-0", "default-0-logout"},
+ Tasks: []string{"import", "default-0-login", "default-0", "default-0-logout"}, @@ -355,7 +355,7 @@
- cfg, err := l.Load("", "", data, true)
+ cfg, err := l.Load("", "", data, []string{}, true) @@ -364,30 +364,30 @@
"import": &docker.Import{
- "default-step-0-0": &docker.Run{
+ "default-0": &docker.Run{ Image: "gliderlabs/alpine:edge",
Script: []string{"hostname"},
- "default-step-0-1": &docker.Login{
+ "default-1": &docker.Login{ Username: "$DOCKER_USERNAME",
Password: "$DOCKER_PASSWORD",
- "default-step-0-2": &docker.Run{
+ "default-2": &docker.Run{ Image: "gliderlabs/alpine:edge",
Script: []string{"date +%s"},
- "default-step-0-3": &docker.Build{
+ "default-3": &docker.Build{ Tag: "atlassian/my-app:$BITBUCKET_COMMIT",
- "default-step-0-4": &docker.Push{
+ "default-4": &docker.Push{ Image: "atlassian/my-app:$BITBUCKET_COMMIT",
- "default-step-0-5": &docker.Run{
+ "default-5": &docker.Run{ Image: "gliderlabs/alpine:edge",
Script: []string{"date +%s"},
@@ -405,12 +405,12 @@
@@ -435,7 +435,7 @@
- cfg, err := l.Load("", "", data, true)
+ cfg, err := l.Load("", "", data, []string{}, true) @@ -444,15 +444,15 @@
"import": &docker.Import{
- "default-step-0-0": &docker.Login{
+ "default-0": &docker.Login{ Username: "$DOCKER_USERNAME",
Password: "$DOCKER_PASSWORD",
- "default-step-0-1": &docker.Build{
+ "default-1": &docker.Build{ Tag: "atlassian/my-app:$BITBUCKET_COMMIT",
- "default-step-0-2": &docker.Push{
+ "default-2": &docker.Push{ Image: "atlassian/my-app:$BITBUCKET_COMMIT",
@@ -467,9 +467,9 @@
--- a/loaders/codebuild/loader.go Sun Jan 21 00:24:21 2018 -0600
+++ b/loaders/codebuild/loader.go Sun Jan 21 00:24:55 2018 -0600
@@ -19,14 +19,13 @@
"github.com/go-yaml/yaml"
- "github.com/kballard/go-shellquote"
"bitbucket.org/rw_grim/convey/config"
"bitbucket.org/rw_grim/convey/docker"
"bitbucket.org/rw_grim/convey/plans"
+ "bitbucket.org/rw_grim/convey/script" "bitbucket.org/rw_grim/convey/stages"
"bitbucket.org/rw_grim/convey/state"
"bitbucket.org/rw_grim/convey/tasks"
@@ -76,73 +75,33 @@
func (l *Loader) addPhase(cb CodeBuild, cfg *config.Config, phaseName, imageName string, plan *plans.Plan) error {
phase, ok := cb.Phases[phaseName]
// ignore phases that are not in the yaml
- currentScript := []string{}
- for idx, cmd := range phase.Commands {
- argv, err := shellquote.Split(cmd)
- if strings.TrimSpace(argv[0]) == "docker" {
- taskName := fmt.Sprintf("%s-%d", phaseName, idx)
- if len(currentScript) > 0 {
- // create and add the task
- taskName := fmt.Sprintf("%s-%d", phaseName, idx-1)
- cfg.Tasks[taskName] = &docker.Run{
- stage.Tasks = append(stage.Tasks, taskName)
- currentScript = []string{}
- task, err := docker.ParseCommand(argv)
- cfg.Tasks[taskName] = task
- stage.Tasks = append(stage.Tasks, taskName)
- currentScript = append(currentScript, cmd)
+ parsedTasks, err := script.Parse(imageName, "/bin/sh", phase.Commands) - if len(currentScript) > 0 {
- taskName := fmt.Sprintf("%s-%d", phaseName, last+1)
- cfg.Tasks[taskName] = &docker.Run{
- stage.Tasks = append(stage.Tasks, taskName)
+ // now add the tasks to the config and the stage + for idx, task := range parsedTasks { + name := fmt.Sprintf("%s-%d", phaseName, idx) + stage.Tasks = append(stage.Tasks, name) + // add the stage to the plan plan.Stages = append(plan.Stages, stage)