Rate this post

Системы непрерывной интеграции экономят кучу времени, но сами они тоже требуют изучения, что не всегда подходит для небольших проектов. 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).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