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