
Concourse CI — это современная система непрерывной интеграции, которая автоматизирует конвейеры тестирования.
Он очень самоуверен в нескольких вещах:
- Идемпотентность,
- Неизменность,
- Имеет декларативный конфиг,
- Stateless workers (воркеры без сохранения состояния),
- Воспроизводимые сборки.
Пайплайн выглядит следующим образом:

Перейдем к установке.
Установка Concourse CI в Unix/Linux
Concourse можно установить несколькими способами. Приведу примеры установок.
Установка Concourse CI используя бинарный файл
Скачиваем архивы (для MacOS):
$ wget https://github.com/concourse/concourse/releases/download/v5.3.0/concourse-5.3.0-darwin-amd64.tgz && wget https://github.com/concourse/concourse/releases/download/v5.3.0/fly-5.3.0-darwin-amd64.tgz
Скачиваем архивы (для Linux):
$ wget https://github.com/concourse/concourse/releases/download/v5.3.0/concourse-5.3.0-linux-amd64.tgz && wget https://github.com/concourse/concourse/releases/download/v5.3.0/fly-5.3.0-linux-amd64.tgz
Замините архивы для своих целей (версию или тип ОС).
Распаковываем:
$ tar -xfvz concourse-*.tgz -C /usr/local
$ tar -xfvz fly-*.tgz -C /usr/local
ЗАМЕЧАНИЕ: Нужно добавить PATH для использования данных тулов (если этого не было сделано). Например, у меня такой:
export PATH="$PATH:/usr/local/bin:/usr/local/sbin:/opt/X11/bin:/usr/local/git/bin:/usr/local/go/bin:/sbin:/bin:/opt/local/bin:/opt/local/sbin"
Добавил я его в:
$ vim ~/.bash_profile
Чтобы настройка применилась, выполняем:
$ source ~/.bash_profile
или:
$ . ~/.bash_profile
Вот и вся установка.
Установка Concourse CI используя исходный код
Скачаем архив:
$ wget -O concourse-latest.tar.gz https://github.com/concourse/concourse/archive/v5.3.0.tar.gz
Распаковываем:
$ tar xfvz concourse-latest.tar.gz
В папке concourse-5.3.0 лежит исходный код ( на golang). Можно перейти в папку и скомпилировать:
$ cd concourse-*
PS: Компилировать я не стал (не было необходимости). Использую докер для своих реализаций. Будет время, дополню материал….
Возможно, кто-то хочет помогать мне в этом — я буду не против.
Установка Concourse CI используя Docker
Ставим Docker, docker-compose, статьи вот тут:
Установка Docker на CentOS/RedHat/Fedora
Установка Docker на Debian/Ubuntu
Установка docker-compose в Unix/Linux
Работа с docker + docker-compose в Unix/Linux
Другие полезные статьи:
Запустить Docker контейнер от пользователя в Unix/Linux
Создание docker контейнера в Unix/Linux
Остановить/Удалить все Docker контейнеры/images
Запуск docker контейнеров в Unix/Linux
Запустить bash/SSH в контейнере с Docker
Использование статического IP адреса в docker-compose
Работа с сетью (Networking) в Docker
Работа с томами (Volumes) в Docker
Работа с логами (Logs) в Docker
Приступим….
Для консоурса, нужны 3 сервиса, можно получить помощь так:
$ docker run -t concourse/concourse --help
$ docker run -t concourse/concourse web --help
$ docker run -t concourse/concourse worker --help
Понять что и как работает и потом запустить. Честно говоря, я не использовал данный вариант, я использовал установку через docker-compose. Скачиваем файл:
$ wget https://concourse-ci.org/docker-compose.yml
Запускаем билд консоурса:
$ docker-compose up
Creating docs_concourse-db_1 ... done
Creating docs_concourse_1 ... done
PS: Можно скачать архив (вытянуть все через git):
$ git clone https://github.com/concourse/concourse-docker.git && cd concourse-docker
Можно сгенерировать ключи:
$ ./keys/generate
Unable to find image 'concourse/concourse:latest' locally
latest: Pulling from concourse/concourse
6abc03819f3e: Already exists
05731e63f211: Already exists
0bd67c50d6be: Already exists
f81c432f3eb1: Pull complete
28ed15a59bee: Pull complete
Digest: sha256:df37aa611cc0f75fdd400665a0c422211974cbfe09d3cca6311cc90b17a079e2
Status: Downloaded newer image for concourse/concourse:latest
wrote private key to /keys/session_signing_key
wrote private key to /keys/tsa_host_key
wrote ssh public key to /keys/tsa_host_key.pub
wrote private key to /keys/worker_key
wrote ssh public key to /keys/worker_key.pub
Ну и потом выполнить запуск сервиса:
$ docker-compose up -d
Creating network "concourse-docker_default" with the default driver
Pulling db (postgres:)...
latest: Pulling from library/postgres
fc7181108d40: Pull complete
81cfa12d39e9: Pull complete
793d305ca761: Pull complete
41e3ced3a2aa: Pull complete
a300bc9d5405: Pull complete
3c6a5c3830ed: Pull complete
fb8c79b24338: Pull complete
fcda1144379f: Pull complete
476a22a819cc: Pull complete
78b36b49bb24: Pull complete
6a096a28591f: Pull complete
c0cb89b5217b: Pull complete
778f1469a309: Pull complete
7c4413fcad87: Pull complete
Digest: sha256:1518027f4aaee49b836c5cf4ece1b4a16bdcd820af873402e19e1cc181c1aff2
Status: Downloaded newer image for postgres:latest
Creating concourse-docker_db_1 ... done
Creating concourse-docker_web_1 ... done
Creating concourse-docker_worker_1 ... done
Чтобы проверить старталули ли сервисы, проверяем:
$ docker ps
Поглядеть логи, можно так:
$ docker-compose logs -f
Если все стартануло и без каких либо ошибок, — переходим к проверке работоспсобности и настройке.
Установка Concourse CI используя BOSH
Пока, не было обходимости в этой настройке…
Установка Concourse CI используя Kubernetes
Установка k8s описана тут:
Установка Kubernetes в Unix/Linux
Установка Kubernetes кластера в Unix/Linux
Ставим утилиту через чарт:
$ helm install --name concourse-ci stable/concourse
Удалить можно так:
$ helm delete concourse-ci
На этом у меня закончилось тестирование concourse-ci. Перейдем к использованию.
Настройка Concourse CI в Unix/Linux
Я установил Concourse через docker-compose. После установки данной утилиты, сервис должен работать по 127.0.0.1:8080 УРЛ. Выглядит это так:

Как видно с экрана, можно выполнить вход в панель, для этого нажать нужно на «Login». Логин/пароль — test и test.
Fly — это утилита командной строки, которая позволяет управлять всем вашим кластером ConcourseCI из терминала. Ставится на ваш рабочий компьютер и упралвяет сервером. С ней вы можете совершать все необходимые операции и обслуживать кластер.
Скачиваем утилиту fly:
- Если вы сиспользуете MacOS:
$ wget -O /usr/local/bin/fly --user=test --password=test "http://localhost:8080/api/v1/cli?arch=amd64&platform=darwin"
- Если вы сиспользуете Linux:
$ wget -O /usr/local/bin/fly --user=test --password=test "http://localhost:8080/api/v1/cli?arch=amd64&platform=linux"
После скачивания файла, выставим права на исполнение данного бинарника:
$ chmod +x /usr/local/bin/fly
Получить помошь, можно:
$ fly --help
Выполним вход в сервис через утилиту fly:
$ fly -t ci login -c http://127.0.0.1:8080 -u test -p test
logging in to team 'main'
target saved
Смотрим какой таргет используем сейчас:
$ fly targets
name url team expiry
ci http://127.0.0.1:8080 main Sat, 15 Jun 2019 13:05:43 UTC
Проверить статус можно так:
$ fly -t ci status
logged in successfully
Смотрим информацию по таргету:
$ fly -t ci userinfo
username team/role
test main/owner
Чтобы выйти:
$ fly -t ci logout
Чтобы очистить свой токен для всех targets:
$ fly logout -a
Чтобы изменить имя, команду или URL-адрес target-а, выполните:
$ fly -t ci edit-target \
--target-name new-name \
--concourse-url http://127.0.0.1:8080 \
--team-name my-team
Updated target: ci
И проверяем что вышло:
$ fly targets
name url team expiry
new-name http://127.0.0.1:8080 my-team Sat, 15 Jun 2019 13:05:43 UTC
Удалить таргет можно следующим образом:
$ fly -t new-name delete-target
Чтобы удалить все таргеты, выполните:
$ fly delete-target -a
Время от времени утилиты обновляетсяи выходят релизы, чтобы обновить локальную версию тулы можно использовать:
$ fly -t new-name sync
version 5.3.0 already matches; skipping
Работа с локальными юзерами (Добавление/Удаление) в concourse
Все операции с юзерами выполняються на web ноде, т.к я использую докер, для добавление юзеров, стоит открыть:
$ vim docker-compose.yml
И привести к виду:
CONCOURSE_ADD_LOCAL_USER: test:test,your_user:your_password
CONCOURSE_MAIN_TEAM_LOCAL_USER: test,your_user
Ну и потом, запустить:
$ docker-compose up -d
Проверим:
$ fly --target ci login --username=captain --password=captain --team-name main
logging in to team 'main'
target saved
Работа с team-ами в concourse
Пример создания тимы:
$ fly -t ci set-team --team-name new-team \
> --local-user captain
setting team: new-team
role owner:
users:
- local:captain
groups:
none
apply team configuration? [yN]: y
team created
Логинимся в тиму:
$ fly --target ci login -n new-team --concourse-url http://localhost:8080 -k -u captain -p captain
Чтобы посмотреть team-ы:
$ fly -t ci teams
name
main
new-team
Или, с более подробной инфой:
$ fly -t ci teams -d
name/role users groups
main/owner local:test,local:captain none
new-team/owner local:captain none
Чтобы посмотреть найтройки тимы, выполните:
$ fly -t ci get-team -n new-team
name/role users groups
new-team/owner local:captain none
Для переименования тимы, можно заюзать:
$ fly -t ci rename-team --old-name new-team --new-name cool-team
Team successfully renamed to cool-team
Смотрим что вышло:
$ fly -t ci teams
name
cool-team
main
Для удаления тимы, служит команда:
$ fly -t ci destroy-team --team-name cool-team
!!! this will remove all data for team `cool-team`
please type the team name to confirm: cool-team
`cool-team` deleted
Приступим к пайплайнам.
Конфигурация Concourse CI pipeline-ов в Unix/Linux
Прежде чем покажу какой-либо написанный пайплайн, расскажу какие команды можно использовать при работы с ними.
Логинимся:
$ fly -t ci login -c http://127.0.0.1:8080 -u captain -p captain
logging in to team 'main'
target saved
Чтобы просмотреть список настроенных конвейеров и их приостановленное состояние, выполните:
$ fly -t ci pipelines
name paused public
Т.к у меня чистый\только созданный проект, у меня нет никаких пайплайнов.
Чтобы переименовать конвейер, запустите:
$ fly -t ci rename-pipeline \
--old-name my-pipeline \
--new-name my-cool-pipeline
Чтобы приостановить конвейер, запустите:
$ fly -t ci pause-pipeline --pipeline pipeline_name_here
Данная команда, предотвратит планирование заданий и прекратит периодическую проверку новых версий ресурсов. Сборки, которые находятся уже в запуске, будут закончены.
Чтобы снять с паузы пайплайн, запустите:
$ fly -t ci unpause-pipeline --pipeline pipeline_name_here
По умолчанию, вновь настроенные конвейеры видны только команде. Чтобы сделать конвейер видимым для других команд и пользователей, не прошедших проверку подлинности, выполните:
$ fly -t ci expose-pipeline --pipeline pipeline_name_here
Если вы понимаете, что совершили ужасную ошибку что дали доступ к пайплайну другим тимам, можно скрыть:
$ fly -t ci hide-pipeline --pipeline pipeline_name_here
Fly можно использовать для получения и обновления конфигурации ваших конвейеров. Например, чтобы получить текущую конфигурацию вашего конвейера и вывести ее в STDOUT, выполните следующее:
$ fly -t ci get-pipeline --pipeline pipeline_name_here
PS: чтобы получить вывод в JSON вместо YAML, вы можете использовать аргумент -j или —json. Это может быть полезно при проверке вашей конфигурации с утилитой jq.
Чтобы остановить работу конвейера и удалить все данные, собранные конвейером, включая историю сборки и собранные версии, можно выполнив:
$ fly -t ci destroy-pipeline --pipeline pipeline_name_here
Чтобы настроить порядок трубопроводов, выполните:
$ fly -t ci order-pipelines \
--pipeline pipeline-1 \
--pipeline pipeline-2 \
--pipeline pipeline-3
Обратите внимание, что эта команда только гарантирует то, что указанные конвейеры находятся в заданном порядке. Если есть другие пайплайны, которые вы не включили в данную команду, они могут появляться между, до или после заданного набора.
Для валидации, можно использовать:
$ fly validate-pipeline --config your_pipeline_name_here.yml
looks good
Так же, можно выполнить команду и проверить форматинг:
$ fly format-pipeline --config your_pipeline_name_here.yml
Перейдем к примеру(ам). У Concourse еет графического интерфейса для настройки пайплайнов и вместо этого, пайплайны настраиваются как декларативные YAML файлы. Выглядит это так:
jobs:
- name: hello-world
plan:
- task: say-hello
config:
platform: linux
image_resource:
type: docker-image
source: {repository: alpine}
run:
path: echo
args: ["Hello, world!"]
Сохраните данный вывод в файл (например: hello.yml) и потом, запустите:
$ fly -t ci set-pipeline -p hello -c hello.yml
jobs:
job hello-world has been added:
+ name: hello-world
+ plan:
+ - task: say-hello
+ config:
+ platform: linux
+ image_resource:
+ type: docker-image
+ source:
+ repository: alpine
+ run:
+ path: echo
+ args:
+ - Hello, world!
apply configuration? [yN]: y
pipeline created!
you can view your pipeline here: http://127.0.0.1:8080/teams/main/pipelines/hello
the pipeline is currently paused. to unpause, either:
- run the unpause-pipeline command:
fly -t ci unpause-pipeline -p hello
- click play next to the pipeline in the web ui
Написало что нужно анпаузить проект:
$ fly -t ci unpause-pipeline -p hello
unpaused 'hello'
Открываем веб-линку с консоурсом и смотрим что вышло. Написание пайплайнов будет позже. Я дополню данную статью или создам новую.
Вот и все, статья «Установка Concourse CI в Unix/Linux» завершена.