Система непрерывной интеграции Concourse CI

Система непрерывной интеграции Concourse CI

Системы непрерывной интеграции экономят кучу времени, но сами они тоже требуют изучения, что не всегда подходит для небольших проектов. Concourse CI очень выручает в этом случае.n

Наша компания предоставляет услуги по обеспечению непрерывной интеграции проектов, различными средствами, услуги девопс, обращайтесь office@itfb.com.ua

Установка системы непрерывной интеграции

Развернуть Concourse CI можно несколькими способами. Проект предоставляет бинарники для Linux, Mac OSX и Windows, готовые образы Docker и Vagrant. Последний вариант универсальный и позволяет поднять нужный сервис в считанные минуты, но, учитывая, что будут запущены две VM (одна для СУБД), потребует чуть больше ресурсов и нужен компьютер минимум с 8 ОЗУ. Поддерживается работа нескольких экземпляров в кластере, использующих одну базу.nСамый удобный способ быстро поднять сервер – это Docker. Создаем файл docker-compose.yml:n

concourse-db:nimage: postgres:9.5nenvironment:nPOSTGRES_DB: concoursenPOSTGRES_USER: concoursenPOSTGRES_PASSWORD: passwordnPGDATA: /databasenconcourse-web:nimage: concourse/concoursenlinks: [concourse-db]ncommand: webnports: ["8080:8080"]nvolumes: ["./keys/web:/concourse-keys"]nenvironment:nCONCOURSE_BASIC_AUTH_USERNAME: concoursenCONCOURSE_BASIC_AUTH_PASSWORD: passwordnCONCOURSE_EXTERNAL_URL: "${CONCOURSE_EXTERNAL_URL}"nCONCOURSE_POSTGRES_DATA_SOURCE: |-npostgres://concourse:changeme@concourse-db:5432/ ↵nconcourse?sslmode=disablenconcourse-worker:nimage: concourse/concoursenprivileged: truenlinks: [concourse-web]ncommand: workernvolumes: ["./keys/worker:/concourse-keys"]nenvironment:nCONCOURSE_TSA_HOST: concourse-web

Сгенерируем беспарольные ключи, необходимые для авторизации:n

$ mkdir -p keys/web keys/workern$ ssh-keygen -t rsa -f ./keys/web/tsa_host_key -N ''n$ ssh-keygen -t rsa -f ./keys/web/session_signing_key -N ''n$ ssh-keygen -t rsa -f ./keys/worker/worker_key -N ''n$ cp ./keys/worker/worker_key.pub ↵n./keys/web/authorized_worker_keysn$ cp ./keys/web/tsa_host_key.pub ./keys/worker

Для доступа нужно установить переменную CONCOURSE_EXTERNAL_URL, указав IP внешнего сетевого интерфейса. Задать localhost нельзя, хотя по этому адресу он также будет доступен.n

$ export CONCOURSE_EXTERNAL_URL=http://192.168.2.100:8080

Запускаем:n

$ docker-compose up

Это все. После перехода на страницу будет предложено скачать утилиту Fly CLI. Сохраняем, делаем ее исполняемой и копируем в каталог, видный в переменной $PATH.n

$ chmod +x flyn$ sudo cp -v fly /usr/bin

Первое задание

Команд у утилиты предостаточно, их все можно увидеть по ключу –help. Для выполнения команд необходимо зарегистрироваться, указав логин и парорль, прописанный в docker-compose.yml в environment:n

$ fly -t lite loginntarget save

Созданный токен сохраняется в файле ~/.flyrc.nПараметры можно задавать как непосредственно в командной строке, так и в YAML-конфигурационном файле. Создадим задание с одной простой задачей – запуск Dockerконтейнера.n

$ nano hello.ymlnjobs:n- name: hello-worldnplan:n– task: hellonconfig:nplatform: linuxnimage_resource:ntype: docker-imagensource: {repository: ubuntu}nrun:npath: echonargs: ["Hello, world!"]

Параметры, в общем, понятны, запускаем контейнер ubuntu, передав ему параметр. Теперь можем создать тестовый pipeline.n

$ fly -t lite set-pipeline -p hello-world -c hello.yml

Подтверждаем по запросу применение конфигурации (см. рис. 1).nnнепрерывная интеграция CInПри первом запуске во избежание проблем контейнеры всегда находятся в состоянии паузы, для его активации необходимо его запустить через веб-интерфейс или при помощи параметра unpause-pipeline:n

$ fly -t lite unpause-pipeline -p hello-world

Переходим в веб-интерфейс и выбираем pipeline. После загрузки контейнера в браузере будет выведено сообщение «Hello World» (см. рис. 2).nncontinuous integration CInnВыбрав задание, можем просмотреть журнал выполнения. Статус задания подсвечивается цветом. Зеленый значит выполнено, желтый – в процессе выполнения, красный – завершено с ошибкой или остановлено (см. рис. 3).nnCI непрерывная интеграцияnКоманда:n

$ fly -t lite containers

покажет список контейнеров и привязку их к заданиям. Если задание нужно повторить (например, контейнер изменен), достаточно нажать на кнопку «+» в браузере.n

Настройка триггеров и ресурсов

Чтобы Concourse CI выполнял все действия автоматически, нужно подключить ресурсы – репозитории Git, Docker Hub, задать время и т.д. Полный список официальных и неофициальных ресурсов доступен на сайте https://concourse.ci/resource-types.html. Добавим в начало файла ресурс, который будет просто активироваться каждую минуту.n

resources:n- name: every-1mntype: timensource: {interval: 1m}

И в секцию plan триггер:n

plan:n– get: every-1mntrigger: true

Запускаем задачу повторно.n

$ fly -t lite set-pipeline -p hello-world -c hello.yml

Утилита запросит подтвердить изменения в задаче, выдав новые поля. Также можем проверить настройки задания, чтобы убедиться, что изменения приняты:n

$ fly -t lite get-pipeline -p hello-world

Если перейти на http://192.168.2.100:8080/teams/main/pipelines/hello-world, то увидим, что появился новый элемент, обозначающий ресурс (см. рис. 4), а задача будет выполняться каждую минуту.nnавтоматический деплойnТеперь научимся отслеживать изменения Docker-файла, расположенного в Git. Создаем файл, описывающий нужный ресурс:n

$ nano docker.ymlnjobs:n- name: build_jobnplan:n– get: test_dockerfilentrigger: truenresources:n- name: test_dockerfilentype: gitnsource:nuri: https://github.com/githubrepo/docker.gitnbranch: masternpaths: [Dockerfile]

Выполняем:n

$ fly -t lite set-pipeline -p docker -c docker.ymln$ fly -t lite unpause-pipeline -p docker

Схема такая (см. рис. 5).nnавтоматизация задачnnДля теста внесем какие-то правки в репозиторий и увидим, что задание выполняется каждый раз при обнаружении изменений. Осталось научить Concourse CI самостоятельно собирать образы. Для этого добавим в секцию plan задание на сборку образа:n

plan:n...n– put: build_imagenparams: {build: test_dockerfile}

И новый ресурс с типом docker-imag в конец файла:n

- name: build_imagentype: docker-imagensource:nrepository: repo/build-image

Запускаем задание (см. рис. 6) и можем наблюдать в интерфейсе за процессом сборки (см. рис. 7).nnСхема задания по сборке Docker-образа из GitСборка образаnПри использовании частного репозитория нужно указать  логин и пароль для входа или ключ:n

email: {{docker_mail}}nusername: {{docker_user}}npassword: {{docker_pass}}

Для удобства их лучше подключать отдельным файлом. Как видите, ничего сложного. Конечно, в реальных проектах больше параметров, но как минимум время, потраченное на создание заданий, в последующем существенно упростит процесс разработки и окупится втройне. В GitHub можно найти множество готовых решений для Concourse CI, которые можно взять за основу для своих проектов.nnИсточник журнал “Системный администратор” март 2017