Пробуем GitLab Docker Container Registry и CI

// Июнь 28th, 2016 // Веб-разработка, Виртуализация, Системы контроля версий (VCS)

docker-logoВ этом посте я расскажу, как поставить и запустить Docker Container Registry, а потом настроить continuous integration в докер контейнерах. Ведь очень удобно хранить в одном месте не только исходники, но и настройки для окружения в виде собранных докер образов. И это я еще не говорю о CI, которую с помощью GitLab развернуть довольно приятно. В общем, кому интересно — велкам под кат.

Подготавливаем сервер

Ставим свежую Ubuntu 16.04 и обновляем пакеты.

Устанавливаем GitLab

Нам нужна версия > 8.8, так что ставим по официальному мануалу. Для Postfix в диалоговом окне выбираем вариант Internet Site.

sudo apt-get install curl openssh-server ca-certificates postfix
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt-get install gitlab-ce
sudo gitlab-ctl reconfigure

Дальше заходим на веб-морду, ставим пароль и логинимся под пользователем root и введенным ранее паролем. Создаем тестовый проект, заходим в его свойства и видим, что там в списке фич нет Container Registry.

docker-and-gitlab

Создаём сертификаты

Для работы по SSL для Docker нам понадобятся сертификаты. Генерировать мы будем их с помощью сервиса Let’s Encrypt.

Важно! Для корректной работы клиента Let’s Encrypt нам понадобится валидная A запись на DNS серверах на наш hostname. Создаём её у на DNS сервере (я использую веб-морду от pdd.yadnex.ru). Проверяем, что адрес резолвится в наш IP. Пробрасываем 80, 443, 22, 4567 порт через роутер на наш сервер, тестим telnet-ом. Ок, пошли дальше. Итак, что же произойдёт. Мы вырубим Nginx, освободим 80 и 443 порт. Запустим certbot-а, который займет на время работы эти порты, сделает запрос к серверу за сертификатом, сервер проверит, что домен принадлежит нам (сделав запрос на 80/443 порт), мы получим сертификат и клиент освободит порты. В терминологии certbot это называется standalone-получение сертификата. Есть еще опции, но этот вариант самый простой. Итак, поехали.

Тормозим сервисы gitlab-а.

gitlab-ctl stop

Убаждаемся, что nginx потушен.

gitlab-ctl status
ps aux | grep nginx

Качаем клиента Let’s Encrypt

git clone https://github.com/certbot/certbot
./certbot-auto certonly --standalone -d gitlab.site.ru

После чего получаем такое сообщение:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/gitlab.site.ru/fullchain.pem. Your cert
will expire on 2016-09-22. To obtain a new or tweaked version of
this certificate in the future, simply run certbot-auto again. To
non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

Потом не забываем, что надо будет перевыпустить сертификаты, как эти кончатся. Отлично, заходим в папку /etc/letsencrypt/live/gitlab.site.ru/ и видим наши сертификаты.

Дальше редактируем файл /etc/gitlab/gitlab.rb

registry_external_url 'https://gitlab.site.ru:4567'
registry_nginx['ssl_certificate'] = "/etc/letsencrypt/live/gitlab.site.ru/fullchain.pem"
registry_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.site.ru/privkey.pem"

Теперь врубаем gitlab и переконфигурируем его.

gitlab-ctl start
sudo gitlab-ctl reconfigure

Дальше открываем веб-морду, заходим в свойства нашего проекта и убеждаемся, что там появилась новая фича Container Registry.

docker-container-registry

Коннектимся клиентом

На клиентскую машину устанавливаем docker. Потом проверяем, что всё ок командой:

sudo docker info

Коннектимся тоже обязательно через sudo:

andrey@docker:~$ sudo docker login gitlab.site.ru:4567
Username (root): root
Password:
Login Succeeded

Важное замечание!

@vaclav-adamec usually that message just means you aren’t running docker locally. I know it seems kind of stupid that you need to, but the docker CLI needs a local docker daemon even just to log in to a remote registry.

Т.е. даже если мы коннектимся к удалённому серверу Docker Registry, локальный Docker daemon должен быть запущен. И коннектиться надо из под того юзера, который запускал демон докера (в моем случае root).

Ну а теперь пробуем протестить наш репозиторий.

mkdir test
cd ./test
echo "FROM nginx:latest" > ./Dockerfile
docker login gitlab.site.ru:4567
docker build -t gitlab.site.ru:4567/root/test .
docker push gitlab.site.ru:4567/root/test

Дальше заходим в закладку «Registry» проекта и смотрим, что получилось.

image-success-nginx

Юзаем Docker Registry для CI

Ну а теперь надо сказать, а зачем вообще всё это нужно. Описывать длинно не буду, по картинке сами все поймете.

Docker-Workflow-Schema

Author: Dominique HAAS License: Creative Commons

Установка GitLab Runner

Runner — это софт, который собираем билд из исходников и docker образа. Есть различные типы runner-ов в GitLab, но нас сегодня интересует docker runner.

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
sudo apt-get install gitlab-ci-multi-runner
sudo gitlab-ci-multi-runner register

После регистрации видим runner-а в списке.
runner

После этого создаем в корне проекта файл с настройками CI.
.gitlab-ci.yml

# Select image from https://hub.docker.com/r/_/php/
image: php:5.6

before_script:
# Install dependencies
- bash ci/docker_install.sh > /dev/null

test:app:
  script:
   - uname -a #just for test

И файлик, дополняющий образ.

./ci/docker_install.sh

#!/bin/bash

# We need to install dependencies only for Docker
[[ ! -e /.dockerenv ]] && [[ ! -e /.dockerinit ]] && exit 0

set -xe

# Install git (the php image doesn't have it) which is required by composer
apt-get update -yqq
apt-get install git -yqq

# Install phpunit, the tool that we will use for testing
curl -o /usr/local/bin/phpunit https://phar.phpunit.de/phpunit.phar
chmod +x /usr/local/bin/phpunit

# Install mysql driver
# Here you can install any other extension that you need
docker-php-ext-install pdo_mysqla

Дальше пушим файлы на сервер и смотрим, как у нас автомагически :-) собирается проект и проходят типа юнит тесты.

build-history

А вот и логи билда.

build-success

Кстати, вот еще один неплохой GitLab Runner именно для PHP разработчика.

Резюме

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

Ссылки

GitLab Maintenance commands
CertBot for certificate to GitLab Docker Registry properly working
GitLab, Docker and Let’s Encrypt
CertBot sources
http://docs.gitlab.com/ee/administration/container_registry.html#configure-container-registry-under-an-existing-gitlab-domain
http://docs.gitlab.com/omnibus/maintenance/README.html
Workflow with Docker
https://blog.ouvrard.it/2016/03/12/gitlab-docker-lets-encrypt/
Docker on Synology
https://gitlab.com/gitlab-org/gitlab-ce/issues/18635
Mon workflow Docker avec Gitlab-CI
GitLab Container Registry
GitLab CI examples testing PHP project

Share

Спасибо!


Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это:


2 Responses to “Пробуем GitLab Docker Container Registry и CI”

  1. Oleg:

    А можно как-то сделать, чтоб не указывать номер порта в gitlab.rb ?

Комментировать