Связаться по:
vkarabedyants Telegram Viber
+7 (499) 350-10-69

Блог о системном администрировании серверов и сайтов

Установка, настройка программного обеспечения Linux, Windows операционных систем

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

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

Наша компания предоставляет услуги по обеспечению непрерывной интеграции проектов, различными средствами, услуги девопс, обращайтесь [email protected]

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

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

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: |-
postgres://concourse:[email protected]:5432/ ↵
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

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

$ 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 нельзя, хотя по этому адресу он также будет доступен.

$ export CONCOURSE_EXTERNAL_URL=http://192.168.2.100:8080

Запускаем:

$ docker-compose up

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

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

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

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

$ fly -t lite login
target save

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

$ 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.

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

Подтверждаем по запросу применение конфигурации (см. рис. 1).

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

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

Переходим в веб-интерфейс и выбираем pipeline. После загрузки контейнера в браузере будет выведено сообщение «Hello World» (см. рис. 2).

continuous integration CI

Выбрав задание, можем просмотреть журнал выполнения. Статус задания подсвечивается цветом. Зеленый значит выполнено, желтый – в процессе выполнения, красный – завершено с ошибкой или остановлено (см. рис. 3).

CI непрерывная интеграция
Команда:

$ fly -t lite containers

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

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

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

resources:
- name: every-1m
type: time
source: {interval: 1m}

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

plan:
– get: every-1m
trigger: true

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

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

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

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

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

автоматический деплой
Теперь научимся отслеживать изменения Docker-файла, расположенного в Git. Создаем файл, описывающий нужный ресурс:

$ 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]

Выполняем:

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

Схема такая (см. рис. 5).

автоматизация задач

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

plan:
...
– put: build_image
params: {build: test_dockerfile}

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

- name: build_image
type: docker-image
source:
repository: repo/build-image

Запускаем задание (см. рис. 6) и можем наблюдать в интерфейсе за процессом сборки (см. рис. 7).

Схема задания по сборке Docker-образа из GitСборка образа
При использовании частного репозитория нужно указать  логин и пароль для входа или ключ:

email: {{docker_mail}}
username: {{docker_user}}
password: {{docker_pass}}

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

Источник журнал «Системный администратор» март 2017

Оставить комментарий

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.