From b25307fc5b8b9f20b0e3de188bbb2471ed07cafb Mon Sep 17 00:00:00 2001 From: Gosuke Miyashita Date: Tue, 21 Apr 2015 11:56:28 +0900 Subject: [PATCH 1/4] Implement `parallel' (just alias of run_after) --- config/parser.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/config/parser.go b/config/parser.go index a17864c..d874bb4 100644 --- a/config/parser.go +++ b/config/parser.go @@ -219,7 +219,12 @@ func mapStage(stageMap map[interface{}]interface{}, envs *EnvVariables) (stages. } } - if runAfters := stageMap["run_after"]; runAfters != nil { + runAfters := stageMap["run_after"] + if runAfters == nil { + runAfters = stageMap["parallel"] + } + + if runAfters != nil { for _, runAfter := range runAfters.([]interface{}) { childStage, err := mapStage(runAfter.(map[interface{}]interface{}), envs) if err != nil { From 7fb3f5d102cf412d8347ca2e3db26f1f2c21d241 Mon Sep 17 00:00:00 2001 From: Gosuke Miyashita Date: Tue, 21 Apr 2015 22:13:09 +0900 Subject: [PATCH 2/4] Rewrite parallel related code and show warning if run_after is used --- config/parser.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/config/parser.go b/config/parser.go index d874bb4..ae3bab1 100644 --- a/config/parser.go +++ b/config/parser.go @@ -219,14 +219,16 @@ func mapStage(stageMap map[interface{}]interface{}, envs *EnvVariables) (stages. } } - runAfters := stageMap["run_after"] - if runAfters == nil { - runAfters = stageMap["parallel"] + parallelStages := stageMap["parallel"] + if parallelStages == nil { + if parallelStages = stageMap["run_after"]; parallelStages != nil { + log.Warn("`run_after' will be obsoleted in near future. Use `parallel' instead.") + } } - if runAfters != nil { - for _, runAfter := range runAfters.([]interface{}) { - childStage, err := mapStage(runAfter.(map[interface{}]interface{}), envs) + if parallelStages != nil { + for _, parallelStages := range parallelStages.([]interface{}) { + childStage, err := mapStage(parallelStages.(map[interface{}]interface{}), envs) if err != nil { return nil, err } From 831b8a714a06cab1ac084a7d083cec4de3168c22 Mon Sep 17 00:00:00 2001 From: Gosuke Miyashita Date: Tue, 21 Apr 2015 22:13:47 +0900 Subject: [PATCH 3/4] Add tests for parallel --- config/parser_test.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/config/parser_test.go b/config/parser_test.go index 8483187..e524799 100644 --- a/config/parser_test.go +++ b/config/parser_test.go @@ -67,6 +67,24 @@ func TestParseConfWithChildren(t *testing.T) { assert.Equal(t, 2, childStages.Len()) } +func TestParseConfWithParallel(t *testing.T) { + configData := ReadConfigBytes([]byte(`pipeline: + - name: parallel stages + parallel: + - name: parallel command 1 + type: command + command: echo "hello, world, parallel command 1" + - name: parallel command 2 + type: command + command: echo "hello, world, parallel command 2"`)) + result, err := Parse(configData) + assert.Equal(t, 1, result.Pipeline.Size()) + assert.Nil(t, err) + + childStages := result.Pipeline.Stages.Front().Value.(stages.Stage).GetChildStages() + assert.Equal(t, 2, childStages.Len()) +} + func TestParseConfDefaultStageTypeIsCommand(t *testing.T) { configData := ReadConfigBytes([]byte(`pipeline: - name: command_stage_1 @@ -148,6 +166,18 @@ func TestParseConfWithInvalidChildStage(t *testing.T) { assert.NotNil(t, err) } +func TestParseConfWithInvalidParallelStage(t *testing.T) { + configData := ReadConfigBytes([]byte(`pipeline: + - name: parallel stages + parallel: + - name: parallel command 1 + type: xxxxx +`)) + result, err := Parse(configData) + assert.Nil(t, result) + assert.NotNil(t, err) +} + func TestParseConfWithServiceBlock(t *testing.T) { configData := ReadConfigBytes([]byte(` service: From 3e756b2bb124c57bcda11fae08ecb097ccea5657 Mon Sep 17 00:00:00 2001 From: Gosuke Miyashita Date: Tue, 21 Apr 2015 22:22:47 +0900 Subject: [PATCH 4/4] Add description of parallel stages --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index b64adf2..c839a20 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,27 @@ The following is the parameter of Shell script stage. |:----------------:|:----------:|:--------------------------------------:| | file | false | shell script file run in the stage | +## Parallel stages + + You can set child stages and run these stages in parallel like this. + +```yaml +pipeline: + - name: parallel stages + parallel: + - name: parallel command 1 + type: command + command: parallel command 1 + - name: parallel command 2 + type: command + command: parallel command 2 + - name: parallel command 3 + type: command + command: parallel command 3 +``` + +`parallel command 1`, `parallel command 2` and `parallel command 3` are executed in parallel. + ## Cleanup pipeline Walter configuraiton can have one **cleanup** block; cleanup is another pipeline which needs to be executed after a pipeline has either failed or passed.