See
- README for how to login into Concourse with
fly. - scripts for interesting scripts (using Vault, ...).
Are the workers running?
$ fly -t main workers
name containers platform tags team state version age
worker-1 0 linux none none running 2.3 15m6s
What are the last builds?
$ fly -t main builds
id name status start end duration team created by
1 1 succeeded 2021-05-15@11:48:51+0200 2021-05-15@11:49:31+0200 40s main system
You can run individually each task that compose a pipeline. This can be useful in the following situations:
- when developing or testing code that is built by a pipeline that takes a lot of time to run or with a lot of jobs, to quickly run only what you want.
- when debugging or creating a pipeline, to focus on one piece at a time.
Contrary to whole pipelines or single jobs within a pipeline, running a task with fly execute doesn't show up in the Concourse UI, it is seen only in the output of fly execute itself.
We will be running the ci/pipelines/02-two-tasks/task.yml task:
$ fly -t main execute -c ./ci/pipelines/02-two-tasks/task.yml
executing build 42 at http://localhost:8080/builds/42
[...]
running sh -exc whoami
env
+ whoami
root
+ env
USER=root
SHLVL=1
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/tmp/build/e55deab7
succeeded
The ci/pipelines/01-hello-world/hello-world.yml has one job and that job contains one embedded task. Since the task is embedded, we can set this pipeline without the need to refer to a git repository.
Although this is quite an artificial example, it is as simple as it gets.
$ fly -t main set-pipeline -p hello-world -c ci/pipelines/01-hello-world/hello-world.yml
[...]
pipeline name: hello-world
apply configuration? [yN]: y
pipeline created!
you can view your pipeline here: http://localhost:8080/teams/main/pipelines/hello-world
the pipeline is currently paused. to unpause, either:
- run the unpause-pipeline command:
fly -t main unpause-pipeline -p hello-world
- click play next to the pipeline in the web ui
Let's unpause it:
$ fly -t main unpause-pipeline -p hello-world
Now go to the web UI. It will show a grey box with the job name, hello-job. Grey means "pending". There are two ways to trigger the job: from the web UI or from the command-line.
Let's trigger from the command line AND at the same time let's "watch" (that is, stream the output to fly like it happened before with fly execute) it running. You can also verify that the job is also being show as running in the web UI.
List all the pipelines known to Concourse:
$ fly -t main pipelines
id name paused public last updated
1 hello-world no no 2021-05-15 15:00:58 +0200 CEST
List the jobs that compose the hello-world pipeline:
$ fly -t main jobs -p hello-world
name paused status next
hello-job no n/a n/a
Let's run it:
$ fly -t main trigger-job -j hello-world/hello-job --watch
started hello-world/hello-job #1
initializing
[...]
running echo Hello, embedded world!
Hello, embedded world!
succeeded
The ci/pipelines/02-two-tasks/two-tasks.yml pipeline contains two tasks, one embedded in the pipeline itself (as in the previous example) and one loaded from a task file.
Although having external task files requires more setup, it has two advantages:
- the same task file can be reused in different pipelines (or in the same pipeline) by setting different parameters or input and output mappings (see the Concourse documentation for details).
- it allows the powerful workflow shown above with
fly execute.
Since the pipeline refers to an external task file, we need to tell it where to find such file. To do so we use the Concourse git resource.
fly -t main set-pipeline -p two-tasks -c ci/pipelines/02-two-tasks/two-tasks.yml
[..]
pipeline name: two-tasks
apply configuration? [yN]: y
pipeline created!
you can view your pipeline here: http://localhost:8080/teams/main/
$ fly -t main unpause-pipeline -p two-tasks
This time, instead of using fly, start the jobs from the web UI, then go back to the terminal and use fly builds and then fly watch to see the build logs.
The ci/pipelines/03-simple-s3/simple-s3.yml is becoming a real-world pipeline:
- it gets S3 secrets from Vault
- it gets code and pipeline configuration from a git repository
- it pushes the artifacts to Minio S3
$ fly -t main set-pipeline -p simple-s3 -c ci/pipelines/03-simple-s3/simple-s3.yml
- As usual, unpause the pipeline and trigger the
hello-job, either from the web UI or withfly. - In the Minio web UI (http://localhost:9000, see file env for the secrets), have a look at bucket
concourse, pathbuilds/simple-s3. - Do the same with the Minio CLI:
$ mc ls concourse-minio/concourse/builds/simple-s3 [2021-05-15 18:51:26 CEST] 6B gift-20210515165122$ mc cat concourse-minio/concourse/builds/simple-s3/gift-20210515165122 hello
:-)
Concourse 7.4 brought instanced pipelines, which is a way to group together highly related pipelines, for example supporting multiple release branches for the same project. See the official documentation for details.
Our sample pipeline is at ci/pipelines/04-instanced-pipelines/instanced.yml.
Set the first pipeline, to release the versions in 1.x:
$ fly -t main set-pipeline -p foo-release \
-c ci/pipelines/04-instanced-pipelines/instanced.yml \
--instance-var version=1.0.x
Set the second pipeline (from the same pipeline configuration file), to release the versions in 2.x:
$ fly -t main set-pipeline -p foo-release \
-c ci/pipelines/04-instanced-pipelines/instanced.yml \
--instance-var version=2.0.x
Note that:
- the pipeline name stays the same:
foo-release - we pass the value for the variable
((version))with the special flag--instance-var
In the UI, they appear as one pipeline, but with visual cues:
In the same spirit, they do not take space in the list view:
Clicking on them opens a new view:
This section is an approach to the question in concourse/concourse#8522.
Reference: pipeline two-level-interpolation
The task
- task: interpolation
file: concourse-in-a-box/ci/pipelines/05-two-level-interpolation/task.yml
params:
ENV: ((env))
COLOR: ((color))
SECRET_1: ((secret-1-((env))-((color))))
SECRET_2: ((secret-2-((env))-((color))))Uses a two level vars interpolation.
For example if we do
$ fly -t dev set-pipeline -p interpolation-staging-green \
-c two-level-interpolation.yml \
-y env=staging \
-y color=green
We get:
SECRET_1: ((secret-1-staging-green))
SECRET_2: ((secret-2-staging-green))For a total of T = S_N * E_N * C_N combinations
where:
- S_N number of secrets
- E_N number of environments (2: prod and staging, or more)
- C_N number of colors (probably 2: blue and green)
Once we inject the secrets into Vault:
$ vault kv put /concourse/developers/secret-1-staging-green \
value="I am secret 1 for staging green"
$ vault kv put /concourse/developers/secret-2-staging-green \
value="I am secret 2 for staging green"
Running the job:
selected worker: worker-1
...
+ env
...
ENV=staging
COLOR=green
SECRET_1=I am secret 1 for staging green
SECRET_2=I am secret 2 for staging green


