Системы непрерывной интеграции экономят кучу времени, но сами они тоже требуют изучения, что не всегда подходит для небольших проектов. Concourse CI очень выручает в этом случае.n
Наша компания предоставляет услуги по обеспечению непрерывной интеграции проектов, различными средствами, услуги девопс, обращайтесь [email protected]
Установка системы непрерывной интеграции
Развернуть 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).nnnПри первом запуске во избежание проблем контейнеры всегда находятся в состоянии паузы, для его активации необходимо его запустить через веб-интерфейс или при помощи параметра unpause-pipeline:n
$ fly -t lite unpause-pipeline -p hello-world
Переходим в веб-интерфейс и выбираем pipeline. После загрузки контейнера в браузере будет выведено сообщение «Hello World» (см. рис. 2).nnnnВыбрав задание, можем просмотреть журнал выполнения. Статус задания подсвечивается цветом. Зеленый значит выполнено, желтый – в процессе выполнения, красный – завершено с ошибкой или остановлено (см. рис. 3).nnnКоманда: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), а задача будет выполняться каждую минуту.nnnТеперь научимся отслеживать изменения 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).nnnnДля теста внесем какие-то правки в репозиторий и увидим, что задание выполняется каждый раз при обнаружении изменений. Осталось научить 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).nnnПри использовании частного репозитория нужно указать логин и пароль для входа или ключ:n
email: {{docker_mail}}nusername: {{docker_user}}npassword: {{docker_pass}}
Для удобства их лучше подключать отдельным файлом. Как видите, ничего сложного. Конечно, в реальных проектах больше параметров, но как минимум время, потраченное на создание заданий, в последующем существенно упростит процесс разработки и окупится втройне. В GitHub можно найти множество готовых решений для Concourse CI, которые можно взять за основу для своих проектов.nnИсточник журнал «Системный администратор» март 2017