In the same fashion as a method or function in programming languages, Concourse pipeline tasks can be executed with parameterized variables, inputs and outputs.
That allows for the reuse of common task definitions, for example, package release or deploy application, in multiple contexts and in multiple executions for distinct artifacts.
Key-value pairs can be passed to a task through a params section in the task definition. Each key entry will become an environment variable during the execution of the task.
The inputs and outputs of a task can be parameterized with input-mappings and output-mappings respectively.
That means that an entire input or output folder that is expected by the task (e.g. a github release or S3) can be "substituted" with another folder from a pipeline resource for each run of the task.
Supposed that individual Docker Tutorial packages need to be created for Java
and Go languages. Each package will contain the same tutorial files, but will
have to ship the specific Dockerfile for the corresponding language's docker image.
The common task that packages the tutorial files from input tutorial-release along with a Dockerfile expected from input dockerfile into a file name defined by environment variable $PACKAGE_NAME would look like this:
platform: linux
image_resource:
...
inputs:
- name: tutorial-release
- name: dockerfile
outputs:
- name: output-directory
run:
path: sh
args:
- -exc
- |
cp ./dockerfile/Dockerfile ./tutorial-release
tar -cvf ./output-directory/$PACKAGE_NAME ./tutorial-release
The excerpt of a pipeline definition file below uses the task above (stored in the common-tasks git repository as package-with-dockerfile.yml) to create two tutorial packages: one for Go and one for Java.
There are two jobs in the pipeline that invoke the package-with-dockerfile.yml
task, each one passing in specific input-mapping and params attributes.
The input_mapping section maps the expected dockerfile input to the resource that
contains the corresponding Dockerfile for each language (e.g. java-dockerfile for Java, go-dockerfile for Go).
The PACKAGE_NAME param creates the environment variable that defines the package file name (e.g. java-docker-tutorial.tgz) to be created.
jobs:
...
- name: Package-Java-Tutorial
plan:
- get: tutorial-release
- get: java-dockerfile
- get: common-tasks
- task: package-java-docker-tutorial
file: common-tasks/.../package-with-dockerfile.yml
input_mapping:
dockerfile: java-dockerfile
params:
PACKAGE_NAME: java-docker-tutorial.tgz
- name: Package-Go-Tutorial
plan:
- get: tutorial-release
- get: go-dockerfile
- get: common-tasks
- task: package-go-docker-tutorial
file: common-tasks/.../package-with-dockerfile.yml
input_mapping:
dockerfile: go-dockerfile
params:
PACKAGE_NAME: go-docker-tutorial.tgz
resources:
- name: tutorial-release
type: git
source:
uri: https://github.com/docker/labs.git
- name: java-dockerfile
type: git
source:
uri: https://github.com/dockerfile/java.git
- name: go-dockerfile
type: git
source:
uri: https://github.com/dockerfile/go
- name: common-tasks
type: git
source:
uri: https://github.com/pivotalservices/concourse-pipeline-samples.git
Download the complete pipeline file for the sample above from here and then set a pipeline with it on your Concourse server to inspect the results of the parameterized tasks feature.
