Browse Source
add multi-branch workflow example
add multi-branch workflow example
Signed-off-by: Aidan Oldershaw <aoldershaw@pivotal.io>pull/4/head
5 changed files with 225 additions and 0 deletions
-
81pipelines/multi-branch/template.yml
-
83pipelines/multi-branch/tracker.yml
-
28tasks/go-build.yml
-
20tasks/go-test.yml
-
13terraform/staging/main.tf
@ -0,0 +1,81 @@ |
|||
resource_types: |
|||
- name: terraform |
|||
type: registry-image |
|||
source: |
|||
repository: ljfranklin/terraform-resource |
|||
|
|||
- name: gcs |
|||
type: registry-image |
|||
source: |
|||
repository: frodenas/gcs-resource |
|||
|
|||
resources: |
|||
- name: branch |
|||
type: git |
|||
source: |
|||
uri: https://github.com/concourse/examples |
|||
branch: ((branch)) |
|||
|
|||
- name: examples |
|||
type: git |
|||
source: |
|||
uri: https://github.com/concourse/examples |
|||
|
|||
- name: build-artifact |
|||
type: gcs |
|||
source: |
|||
bucket: concourse-examples |
|||
json_key: ((concourse_artifacts_json_key)) |
|||
regexp: multi-branch/features/((feature))/my-app-(.+)\.tgz |
|||
|
|||
- name: staging-env |
|||
type: terraform |
|||
source: |
|||
env_name: ((feature)) |
|||
backend_type: gcs |
|||
backend_config: |
|||
bucket: concourse-examples |
|||
prefix: multi-branch/terraform |
|||
credentials: ((concourse_artifacts_json_key)) |
|||
|
|||
jobs: |
|||
- name: test |
|||
plan: |
|||
- in_parallel: |
|||
- get: branch |
|||
trigger: true |
|||
- get: examples |
|||
- task: unit |
|||
file: examples/tasks/go-test.yml |
|||
input_mapping: {repo: branch} |
|||
params: {MODULE: apps/golang} |
|||
|
|||
- name: build |
|||
plan: |
|||
- in_parallel: |
|||
- get: branch |
|||
passed: [test] |
|||
trigger: true |
|||
- get: examples |
|||
- task: build |
|||
file: examples/tasks/go-build.yml |
|||
params: |
|||
MODULE: apps/golang |
|||
BINARY_NAME: my-app |
|||
input_mapping: {repo: branch} |
|||
- put: build-artifact |
|||
params: {file: "binary/my-app-*.tgz"} |
|||
|
|||
- name: deploy |
|||
plan: |
|||
- in_parallel: |
|||
- get: build-artifact |
|||
passed: [build] |
|||
trigger: true |
|||
- get: examples |
|||
- load_var: bundle_url |
|||
file: build-artifact/url |
|||
- put: staging-env |
|||
params: |
|||
terraform_source: examples/terraform/staging |
|||
vars: {bundle_url: ((.:bundle_url))} |
|||
@ -0,0 +1,83 @@ |
|||
resource_types: |
|||
- name: git-branches |
|||
type: registry-image |
|||
source: |
|||
repository: aoldershaw/git-branches-resource |
|||
|
|||
resources: |
|||
- name: feature-branches |
|||
type: git-branches |
|||
source: |
|||
uri: https://github.com/concourse/examples |
|||
branch_regex: 'feature/(?P<feature>.*)' |
|||
|
|||
- name: examples |
|||
type: git |
|||
source: |
|||
uri: https://github.com/concourse/examples |
|||
|
|||
jobs: |
|||
- name: set-feature-pipelines |
|||
plan: |
|||
- in_parallel: |
|||
- get: feature-branches |
|||
trigger: true |
|||
- get: examples |
|||
- load_var: branches |
|||
file: feature-branches/branches.json |
|||
- across: |
|||
- var: branch |
|||
values: ((.:branches)) |
|||
set_pipeline: dev |
|||
file: examples/pipelines/multi-branch/template.yml |
|||
instance_vars: {feature: ((.:branch.groups.feature))} |
|||
vars: {branch: ((.:branch.name))} |
|||
|
|||
- name: cleanup-inactive-workspaces |
|||
plan: |
|||
- get: feature-branches |
|||
passed: [set-feature-pipelines] |
|||
trigger: true |
|||
- load_var: active_branches |
|||
file: feature-branches/branches.json |
|||
- task: cleanup |
|||
config: |
|||
platform: linux |
|||
image_resource: |
|||
type: registry-image |
|||
source: {repository: hashicorp/terraform} |
|||
params: |
|||
ACTIVE_BRANCHES: ((.:active_branches)) |
|||
TERRAFORM_BACKEND_CONFIG: |
|||
terraform: |
|||
backend: |
|||
gcs: |
|||
bucket: concourse-examples |
|||
prefix: multi-branch/terraform |
|||
credentials: ((concourse_artifacts_json_key)) |
|||
run: |
|||
path: sh |
|||
args: |
|||
- -c |
|||
- | |
|||
set -euo pipefail |
|||
|
|||
apk add jq |
|||
|
|||
active_features="$(echo "$ACTIVE_BRANCHES" | jq '[.[].groups.feature]')" |
|||
|
|||
echo "$TERRAFORM_BACKEND_CONFIG" > backend.tf.json |
|||
terraform init |
|||
active_workspaces="$(terraform workspace list | grep -v '^[*]' | tr -d ' ' | jq --raw-input --slurp 'split("\n") | map(select(. != ""))')" |
|||
|
|||
jq -nr "$active_workspaces - $active_features | .[]" | while read extra_workspace |
|||
do |
|||
echo "deleting workspace $extra_workspace" |
|||
terraform workspace select "$extra_workspace" |
|||
terraform init |
|||
|
|||
terraform destroy -auto-approve |
|||
|
|||
terraform workspace select default |
|||
terraform workspace delete "$extra_workspace" |
|||
done |
|||
@ -0,0 +1,28 @@ |
|||
platform: linux |
|||
|
|||
image_resource: |
|||
type: registry-image |
|||
source: { repository: golang } |
|||
|
|||
inputs: |
|||
- name: repo |
|||
path: . |
|||
|
|||
outputs: |
|||
- name: binary |
|||
|
|||
params: |
|||
MODULE: |
|||
BINARY_NAME: |
|||
|
|||
run: |
|||
path: sh |
|||
args: |
|||
- -ce |
|||
- | |
|||
root=$(pwd) |
|||
cd "$MODULE" |
|||
go build -o "/tmp/$BINARY_NAME" |
|||
|
|||
timestamp=$(date '+%Y%m%d%H%M%S') |
|||
tar czf "$root/binary/$BINARY_NAME-$timestamp.tgz" -C /tmp "$BINARY_NAME" |
|||
@ -0,0 +1,20 @@ |
|||
platform: linux |
|||
|
|||
image_resource: |
|||
type: registry-image |
|||
source: { repository: golang } |
|||
|
|||
inputs: |
|||
- name: repo |
|||
path: . |
|||
|
|||
params: |
|||
MODULE: |
|||
|
|||
run: |
|||
path: sh |
|||
args: |
|||
- -ce |
|||
- | |
|||
cd "$MODULE" |
|||
go test -v ./... |
|||
@ -0,0 +1,13 @@ |
|||
variable "bundle_url" { |
|||
type = string |
|||
} |
|||
|
|||
resource "null_resource" "fake_deployment" { |
|||
triggers = { |
|||
bundle_url = var.bundle_url |
|||
} |
|||
|
|||
provisioner "local-exec" { |
|||
command = "echo \"pretending to deploy from ${var.bundle_url}\"..." |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue