Система непрерывной интеграции Concourse CI
Системы непрерывной интеграции экономят кучу времени, но сами они тоже требуют изучения, что не всегда подходит для небольших проектов. Concourse CI очень выручает в этом случае.
Наша компания предоставляет услуги по обеспечению непрерывной интеграции проектов, различными средствами, услуги девопс, обращайтесь [email protected]
Установка системы непрерывной интеграции
Развернуть Concourse CI можно несколькими способами. Проект предоставляет бинарники для Linux, Mac OSX и Windows, готовые образы Docker и Vagrant. Последний вариант универсальный и позволяет поднять нужный сервис в считанные минуты, но, учитывая, что будут запущены две VM (одна для СУБД), потребует чуть больше ресурсов и нужен компьютер минимум с 8 ОЗУ. Поддерживается работа нескольких экземпляров в кластере, использующих одну базу.
Самый удобный способ быстро поднять сервер – это Docker. Создаем файл docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
concourse-db: image: postgres:9.5 environment: POSTGRES_DB: concourse POSTGRES_USER: concourse POSTGRES_PASSWORD: password PGDATA: /database concourse-web: image: concourse/concourse links: [concourse-db] command: web ports: ["8080:8080"] volumes: ["./keys/web:/concourse-keys"] environment: CONCOURSE_BASIC_AUTH_USERNAME: concourse CONCOURSE_BASIC_AUTH_PASSWORD: password CONCOURSE_EXTERNAL_URL: "${CONCOURSE_EXTERNAL_URL}" CONCOURSE_POSTGRES_DATA_SOURCE: |- concourse?sslmode=disable concourse-worker: image: concourse/concourse privileged: true links: [concourse-web] command: worker volumes: ["./keys/worker:/concourse-keys"] environment: CONCOURSE_TSA_HOST: concourse-web |
Сгенерируем беспарольные ключи, необходимые для авторизации:
1 2 3 4 5 6 7 |
$ mkdir -p keys/web keys/worker $ ssh-keygen -t rsa -f ./keys/web/tsa_host_key -N '' $ ssh-keygen -t rsa -f ./keys/web/session_signing_key -N '' $ ssh-keygen -t rsa -f ./keys/worker/worker_key -N '' $ cp ./keys/worker/worker_key.pub ↵ ./keys/web/authorized_worker_keys $ cp ./keys/web/tsa_host_key.pub ./keys/worker |
Для доступа нужно установить переменную CONCOURSE_EXTERNAL_URL, указав IP внешнего сетевого интерфейса. Задать localhost нельзя, хотя по этому адресу он также будет доступен.
1 |
$ export CONCOURSE_EXTERNAL_URL=http://192.168.2.100:8080 |
Запускаем:
1 |
$ docker-compose up |
Это все. После перехода на страницу будет предложено скачать утилиту Fly CLI. Сохраняем, делаем ее исполняемой и копируем в каталог, видный в переменной $PATH.
1 2 |
$ chmod +x fly $ sudo cp -v fly /usr/bin |
Первое задание
Команд у утилиты предостаточно, их все можно увидеть по ключу —help. Для выполнения команд необходимо зарегистрироваться, указав логин и парорль, прописанный в docker-compose.yml в environment:
1 2 |
$ fly -t lite login target save |
Созданный токен сохраняется в файле ~/.flyrc.
Параметры можно задавать как непосредственно в командной строке, так и в YAML-конфигурационном файле. Создадим задание с одной простой задачей – запуск Dockerконтейнера.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ nano hello.yml jobs: - name: hello-world plan: – task: hello config: platform: linux image_resource: type: docker-image source: {repository: ubuntu} run: path: echo args: ["Hello, world!"] |
Параметры, в общем, понятны, запускаем контейнер ubuntu, передав ему параметр. Теперь можем создать тестовый pipeline.
1 |
$ fly -t lite set-pipeline -p hello-world -c hello.yml |
Подтверждаем по запросу применение конфигурации (см. рис. 1).
При первом запуске во избежание проблем контейнеры всегда находятся в состоянии паузы, для его активации необходимо его запустить через веб-интерфейс или при помощи параметра unpause-pipeline:
1 |
$ fly -t lite unpause-pipeline -p hello-world |
Переходим в веб-интерфейс и выбираем pipeline. После загрузки контейнера в браузере будет выведено сообщение «Hello World» (см. рис. 2).
Выбрав задание, можем просмотреть журнал выполнения. Статус задания подсвечивается цветом. Зеленый значит выполнено, желтый – в процессе выполнения, красный – завершено с ошибкой или остановлено (см. рис. 3).
1 |
$ fly -t lite containers |
покажет список контейнеров и привязку их к заданиям. Если задание нужно повторить (например, контейнер изменен), достаточно нажать на кнопку «+» в браузере.
Настройка триггеров и ресурсов
Чтобы Concourse CI выполнял все действия автоматически, нужно подключить ресурсы – репозитории Git, Docker Hub, задать время и т.д. Полный список официальных и неофициальных ресурсов доступен на сайте https://concourse.ci/resource-types.html. Добавим в начало файла ресурс, который будет просто активироваться каждую минуту.
1 2 3 4 |
resources: - name: every-1m type: time source: {interval: 1m} |
И в секцию plan триггер:
1 2 3 |
plan: – get: every-1m trigger: true |
Запускаем задачу повторно.
1 |
$ fly -t lite set-pipeline -p hello-world -c hello.yml |
Утилита запросит подтвердить изменения в задаче, выдав новые поля. Также можем проверить настройки задания, чтобы убедиться, что изменения приняты:
1 |
$ fly -t lite get-pipeline -p hello-world |
Если перейти на http://192.168.2.100:8080/teams/main/pipelines/hello-world, то увидим, что появился новый элемент, обозначающий ресурс (см. рис. 4), а задача будет выполняться каждую минуту.
Теперь научимся отслеживать изменения Docker-файла, расположенного в Git. Создаем файл, описывающий нужный ресурс:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ nano docker.yml jobs: - name: build_job plan: – get: test_dockerfile trigger: true resources: - name: test_dockerfile type: git source: uri: https://github.com/githubrepo/docker.git branch: master paths: [Dockerfile] |
Выполняем:
1 2 |
$ fly -t lite set-pipeline -p docker -c docker.yml $ fly -t lite unpause-pipeline -p docker |
Схема такая (см. рис. 5).
Для теста внесем какие-то правки в репозиторий и увидим, что задание выполняется каждый раз при обнаружении изменений. Осталось научить Concourse CI самостоятельно собирать образы. Для этого добавим в секцию plan задание на сборку образа:
1 2 3 4 |
plan: ... – put: build_image params: {build: test_dockerfile} |
И новый ресурс с типом docker-imag в конец файла:
1 2 3 4 |
- name: build_image type: docker-image source: repository: repo/build-image |
Запускаем задание (см. рис. 6) и можем наблюдать в интерфейсе за процессом сборки (см. рис. 7).
При использовании частного репозитория нужно указать логин и пароль для входа или ключ:
1 2 3 |
email: {{docker_mail}} username: {{docker_user}} password: {{docker_pass}} |
Для удобства их лучше подключать отдельным файлом. Как видите, ничего сложного. Конечно, в реальных проектах больше параметров, но как минимум время, потраченное на создание заданий, в последующем существенно упростит процесс разработки и окупится втройне. В GitHub можно найти множество готовых решений для Concourse CI, которые можно взять за основу для своих проектов.
Источник журнал «Системный администратор» март 2017