Пробуем GitLab Docker Container Registry и CI
В этом посте я расскажу, как поставить и запустить Docker Container Registry, а потом настроить continuous integration в докер контейнерах. Ведь очень удобно хранить в одном месте не только исходники, но и настройки для окружения в виде собранных докер образов. И это я еще не говорю о CI, которую с помощью GitLab развернуть довольно приятно. В общем, кому интересно – велкам под кат.
Подготавливаем сервер
Ставим свежую Ubuntu 16.04 и обновляем пакеты.
Устанавливаем GitLab
Нам нужна версия > 8.8, так что ставим по официальному мануалу. Для Postfix в диалоговом окне выбираем вариант Internet Site.
1 2 3 4 |
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.
Создаём сертификаты
Для работы по 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-а.
1 |
gitlab-ctl stop |
Убаждаемся, что nginx потушен.
1 2 |
gitlab-ctl status ps aux | grep nginx |
Качаем клиента Let’s Encrypt
1 2 |
git clone https://github.com/certbot/certbot ./certbot-auto certonly --standalone -d gitlab.site.ru |
После чего получаем такое сообщение:
1 2 3 4 5 6 7 8 9 10 11 |
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
1 2 3 |
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 и переконфигурируем его.
1 2 |
gitlab-ctl start sudo gitlab-ctl reconfigure |
Дальше открываем веб-морду, заходим в свойства нашего проекта и убеждаемся, что там появилась новая фича Container Registry.
Коннектимся клиентом
На клиентскую машину устанавливаем docker. Потом проверяем, что всё ок командой:
1 |
sudo docker info |
Коннектимся тоже обязательно через sudo:
1 2 3 4 |
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).
Ну а теперь пробуем протестить наш репозиторий.
1 2 3 4 5 6 |
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” проекта и смотрим, что получилось.
Юзаем Docker Registry для CI
Ну а теперь надо сказать, а зачем вообще всё это нужно. Описывать длинно не буду, по картинке сами все поймете.
Установка GitLab Runner
Runner – это софт, который собираем билд из исходников и docker образа. Есть различные типы runner-ов в GitLab, но нас сегодня интересует docker runner.
1 2 3 |
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-а в списке.
После этого создаем в корне проекта файл с настройками CI.
.gitlab-ci.yml
1 2 3 4 5 6 7 8 9 10 |
# 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/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 |
Дальше пушим файлы на сервер и смотрим, как у нас автомагически 🙂 собирается проект и проходят типа юнит тесты.
А вот и логи билда.
Кстати, вот еще один неплохой 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
А можно как-то сделать, чтоб не указывать номер порта в gitlab.rb ?
Можно, тогда будет дефолтный.
При выпуске сертификатов получаю совершенно другой результат
# tree /etc/letsencrypt/
/etc/letsencrypt/
├── accounts
│ └── acme-v02.api.letsencrypt.org
│ └── directory
│ └── d0a66a2ffed7e6e708a0854f70922c1d
│ ├── meta.json
│ ├── private_key.json
│ └── regr.json
├── csr
│ └── 0000_csr-certbot.pem
├── keys
│ └── 0000_key-certbot.pem
├── renewal
└── renewal-hooks
├── deploy
├── post
└── pre
11 directories, 5 files
Кнопка сбора денег не работает
Большое спасибо! Пофиксил!