Вступление
Контейнерство быстро становится наиболее приемлемым методом упаковки и развертывания приложений в облачных средах. Стандартизация, которую он обеспечивает, наряду с эффективностью использования ресурсов (по сравнению с полноценными виртуальными машинами) и гибкостью, делает его отличным инструментом современного мышления DevOps. Многие интересные cloud native стратегии развертывания, оркестровки и мониторинга становятся возможными, когда ваши приложения и микросервисы полностью упакованы.
Контейнеры Docker на сегодняшний день являются наиболее распространенным типом контейнеров. Хотя общедоступные репозитории образов Docker, такие как Docker Hub, полны контейнерных образов программного обеспечения с открытым исходным кодом, которые вы можете + docker pull +
и использовать сегодня, для частного кода вам придется заплатить либо сервис для создания и хранения ваших изображений или запуска собственного программного обеспечения для этого.
GitLab Community Edition - это пакет программного обеспечения с автономным размещением, который предоставляет хостинг репозитория Git, отслеживание проекта, услуги CI / CD и реестр образов Docker, а также другие функции. В этом руководстве мы будем использовать сервис непрерывной интеграции GitLab для создания образов Docker из примера приложения Node.js. Эти изображения будут затем протестированы и загружены в наш собственный реестр Docker.
Предпосылки
Прежде чем мы начнем, нам нужно настроить * безопасный сервер GitLab * и * бегуна GitLab CI * для выполнения задач непрерывной интеграции. Разделы ниже предоставят ссылки и более подробную информацию.
Сервер GitLab, защищенный с помощью SSL
Для хранения нашего исходного кода, выполнения задач CI / CD и размещения реестра Docker нам необходим экземпляр GitLab, установленный на сервере Ubuntu 16.04. GitLab в настоящее время рекомендует * сервер с как минимум 2 ядрами процессора и 4 ГБ ОЗУ *. Кроме того, мы защитим сервер с помощью SSL-сертификатов от Let’s Encrypt. Для этого вам потребуется доменное имя, указанное на сервере.
Вы можете выполнить эти предварительные требования с помощью следующих руководств:
-
How для установки имени хоста с DigitalOcean покажет вам, как управлять доменом с панелью управления DigitalOcean
-
Initial Server Setup с Ubuntu 16.04 получит некорневую настройку с поддержкой sudo и включить брандмауэр Ubuntu
+ ufw +
-
Как установить и настроить GitLab в Ubuntu 16.04 покажет вам, как установить GitLab и настройте его с помощью бесплатного сертификата TLS / SSL от Let’s Encrypt
GitLab CI Runner
Как настроить конвейеры непрерывной интеграции с GitLab CI в Ubuntu 16.04 даст вам обзор службы GitLab CI и покажет, как настроить CI runner для обработки заданий. Мы будем основываться на демо-приложениях и инфраструктуре бегунов, созданных в этом руководстве.
Шаг 1 - Настройка привилегированного GitLab CI Runner
В обязательном учебном пособии по непрерывной интеграции GitLab мы настроили бегун GitLab с помощью + sudo gitlab-runner register +
и его интерактивного процесса настройки. Этот бегун способен запускать сборки и тесты программного обеспечения внутри изолированных контейнеров Docker.
Однако для построения образов Docker нашему бегуну необходим полный доступ к самой службе Docker. Рекомендуемый способ настроить это - использовать официальный образ Docker + docker-in-docker
для запуска заданий. Это требует предоставления бегуну особого режима исполнения «+ привилегированный +», поэтому мы создадим второго бегуна с включенным этим режимом.
Поскольку использование привилегированного бегуна имеет последствия для безопасности, мы собираемся создать бегун для конкретного проекта, который будет принимать только задания Docker в нашем проекте + hello_hapi +
(администраторы GitLab всегда могут вручную добавить этого бегуна в другие проекты позднее. ). На странице проекта + hello_hapi +
нажмите * Настройки * в нижней части левого меню, затем нажмите * CI / CD * в подменю:
изображение: https: //assets.digitalocean.com/articles/gitlab-docker/settings-ci.png [меню настроек проекта GitLab]
Теперь нажмите кнопку * Развернуть * рядом с разделом * Настройки бегунов *:
изображение: https: //assets.digitalocean.com/articles/gitlab-docker/runner-expand.png [GitLab, кнопка расширения «Настройки бегунов»]
Там будет некоторая информация о настройке * Specific Runner *, включая регистрационный токен. Запишите этот токен. Когда мы используем его для регистрации нового участника, он будет привязан только к этому проекту.
изображение: https: //assets.digitalocean.com/articles/gitlab-docker/runner-token.png [параметры бегунов для проекта GitLab]
Находясь на этой странице, нажмите кнопку * Disable shared Runners *. Мы хотим, чтобы наши задания Docker всегда выполнялись на нашем привилегированном бегуне. Если общедоступный непривилегированный бегун был доступен, GitLab мог бы выбрать его, что приведет к ошибкам сборки.
Войдите на сервер, на котором установлен текущий CI Runner. Если у вас нет машины, на которой уже установлены бегуны, вернитесь и выполните https://www.digitalocean.com/community/tutorials/how-to-set-up-continuous-integration-pipelines-with-gitlab -ci-on-ubuntu-16-04 # Установка-раздел-gitlab-ci-runner-service [Установка GitLab CI Runner Service +] обязательного руководства перед продолжением.
Теперь выполните следующую команду для настройки привилегированного специфичного для проекта бегуна:
sudo gitlab-runner register -n \
--url https:/// \
--registration-token \
--executor docker \
--description "" \
--docker-image "docker:latest" \
--docker-privileged
OutputRegistering runner... succeeded runner=61SR6BwV
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
Обязательно подставьте свою собственную информацию. Мы устанавливаем все наши параметры запуска в командной строке вместо использования интерактивных подсказок, потому что подсказки не позволяют нам указывать режим «+ - docker-privileged +».
Ваш бегун теперь настроен, зарегистрирован и работает. Для подтверждения вернитесь в браузер. Нажмите значок гаечного ключа в главной строке меню GitLab, затем нажмите * Бегуны * в левом меню. Ваши бегуны будут перечислены:
изображение: https: //assets.digitalocean.com/articles/gitlab-docker/runner-list.png [список участников GitLab]
Теперь, когда у нас есть бегун, способный создавать образы Docker, давайте настроим личный реестр Docker, на который он будет загружать изображения.
Шаг 2 - Настройка реестра Docker GitLab
Настройка собственного реестра Docker позволяет передавать и извлекать изображения с собственного частного сервера, повышая безопасность и уменьшая зависимости вашего рабочего процесса от внешних служб.
GitLab настроит личный реестр Docker с помощью всего нескольких обновлений конфигурации. Сначала мы настроим URL, на котором будет находиться реестр. Затем мы (необязательно) настроим реестр для использования S3-совместимой службы хранения объектов для хранения своих данных.
SSH на ваш сервер GitLab, затем откройте файл конфигурации GitLab:
sudo nano /etc/gitlab/gitlab.rb
Прокрутите вниз до раздела * Настройки реестра контейнеров *. Мы собираемся раскомментировать строку + registry_external_url +
и установить для нее имя хоста GitLab с номером порта + 5555 +
:
/etc/gitlab/gitlab.rb
registry_external_url 'https://:5555'
Затем добавьте следующие две строки, чтобы указать реестру, где найти наши сертификаты Let Encrypt:
/etc/gitlab/gitlab.rb
registry_nginx['ssl_certificate'] = "/etc/letsencrypt/live//fullchain.pem"
registry_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live//privkey.pem"
Сохраните и закройте файл, затем перенастройте GitLab:
sudo gitlab-ctl reconfigure
Output. . .
gitlab Reconfigured!
Обновите брандмауэр, чтобы разрешить трафик к порту реестра:
sudo ufw allow 5555
Теперь переключитесь на другой компьютер с установленным Docker и войдите в личный реестр Docker. Если у вас нет Docker на локальном компьютере разработки, вы можете использовать любой сервер, настроенный для запуска ваших заданий GitLab CI, поскольку на нем уже установлен Docker:
docker login :5555
Вам будет предложено ввести имя пользователя и пароль. Используйте свои учетные данные GitLab для входа.
OutputLogin Succeeded
Успех! Реестр настроен и работает. В настоящее время он будет хранить файлы в локальной файловой системе сервера GitLab. Если вы хотите вместо этого использовать службу хранения объектов, перейдите к этому разделу. Если нет, перейдите к шагу 3.
Чтобы настроить серверную часть хранилища объектов для реестра, нам нужно знать следующую информацию о нашей службе хранения объектов:
-
Ключ доступа
-
Секретный ключ
-
* Region * (
+ us-east-1 +
), например, если используется Amazon S3, или * Region Endpoint *, если используется S3-совместимый сервис (+ https: // nyc.digitaloceanspaces.com +
) -
* Название ковша *
Если вы используете DigitalOcean Spaces, вы можете узнать, как настроить новое пространство и получить вышеуказанную информацию, прочитав https://www.digitalocean.com/community/tutorials/how-to-create-a-digitalocean- space-and-api-key [Как создать пространство DigitalOcean и ключ API].
Когда у вас есть информация о хранилище объектов, откройте файл конфигурации GitLab:
sudo nano /etc/gitlab/gitlab.rb
Еще раз прокрутите вниз до раздела реестра контейнера. Найдите блок + registry ['storage'] +
, раскомментируйте его и обновите до следующего, снова убедившись в необходимости подставить собственную информацию:
/etc/gitlab/gitlab.rb
registry['storage'] = {
's3' => {
'accesskey' => '',
'secretkey' => '',
'bucket' => '',
'region' => '',
'regionendpoint' => ''
}
}
Если вы используете Amazon S3, вам нужен только + region +
, а не + regionendpoint +
. Если вы используете S3-совместимый сервис, такой как Spaces, вам понадобится + regionendpoint +
. В этом случае + region +
на самом деле ничего не настраивает, и значение, которое вы вводите, не имеет значения, но оно все равно должно присутствовать и не быть пустым.
Сохраните и закройте файл.
Переконфигурируйте GitLab еще раз:
sudo gitlab-ctl reconfigure
На другом компьютере Docker снова войдите в реестр, чтобы убедиться, что все в порядке:
docker login :5555
Вы должны получить сообщение + Login Succeeded +
.
Теперь, когда мы настроили наш реестр Docker, давайте обновим конфигурацию CI нашего приложения, чтобы создать и протестировать наше приложение, и перенести образы Docker в наш частный реестр.
Шаг 3 - Обновление + gitlab-ci.yaml +
и создание образа Docker
Чтобы получить наше приложение в Docker, нам нужно обновить файл + .gitlab-ci.yml +
. Вы можете редактировать этот файл прямо в GitLab, щелкнув по нему на главной странице проекта, затем нажав кнопку * Редактировать *. Кроме того, вы можете клонировать репозиторий на локальный компьютер, отредактировать файл, а затем + git push +
вернуть его в GitLab. Это будет выглядеть так:
git clone [email protected]:sammy/hello_hapi.git
cd hello_hapi
# edit the file w/ your favorite editor
git commit -am "updating ci configuration"
git push
Сначала удалите все в файле, затем вставьте следующую конфигурацию:
image: docker:latest
services:
- docker:dind
stages:
- build
- test
- release
variables:
TEST_IMAGE: //hello_hapi:$CI_COMMIT_REF_NAME
RELEASE_IMAGE: //hello_hapi:latest
before_script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN
build:
stage: build
script:
- docker build --pull -t $TEST_IMAGE .
- docker push $TEST_IMAGE
test:
stage: test
script:
- docker pull $TEST_IMAGE
- docker run $TEST_IMAGE npm test
release:
stage: release
script:
- docker pull $TEST_IMAGE
- docker tag $TEST_IMAGE $RELEASE_IMAGE
- docker push $RELEASE_IMAGE
only:
- master
Обязательно обновите выделенные URL-адреса и имена пользователей своей собственной информацией, затем сохраните ее с помощью кнопки * Commit Changes * в GitLab. Если вы обновляете файл вне GitLab, передайте изменения и + git push +
обратно в GitLab.
Этот новый файл конфигурации говорит GitLab использовать последний образ docker (+ image: docker: latest +
) и связать его со службой docker-in-docker (docker: dind). Затем определяются этапы + build
,` + test` и + release
. Этап + build
создает образ Docker с использованием` + Dockerfile`, предоставленного в репозитории, а затем загружает его в наш реестр образов Docker. Если это удастся, этап + test
загрузит только что созданный образ и запустит внутри него команду` + npm test`. Если этап тестирования пройден успешно, этап + release +
извлечет изображение, пометит его как + hello_hapi: latest +
и вернет его обратно в реестр.
В зависимости от вашего рабочего процесса, вы также можете добавить дополнительные этапы «+ test» или даже этапы «+ deploy», которые перемещают приложение в промежуточную или производственную среду.
Обновление файла конфигурации должно было вызвать новую сборку. Вернитесь в проект + hello_hapi +
в GitLab и нажмите на индикатор состояния CI для фиксации:
изображение: https: //assets.digitalocean.com/articles/gitlab-docker/commit-widget.png [GitLab уведомление о коммите с иконкой состояния конвейера]
На полученной странице вы можете нажать на любой из этапов, чтобы увидеть их прогресс:
изображение: https: //assets.digitalocean.com/articles/gitlab-docker/commit-pipeline.png [Сведения о конвейере GitLab]
изображение: https: //assets.digitalocean.com/articles/gitlab-docker/stage-detail.png [Ход этапа конвейера GitLab]
В конце концов, все этапы должны указывать на их успешность, показывая зеленые значки галочки. Мы можем найти изображения Docker, которые были только что созданы, щелкнув пункт * Registry * в левом меню:
изображение: https: //assets.digitalocean.com/articles/gitlab-docker/docker-list.png [список изображений реестра GitLab]
Если вы щелкнете по маленькому значку «документ» рядом с именем изображения, он скопирует соответствующую команду + docker pull … +
в буфер обмена. Затем вы можете вытащить и запустить свое изображение:
docker pull
docker run -it --rm -p 3000:3000
Output> [email protected] start /usr/src/app
> node app.js
Server running at: http://56fd5df5ddd3:3000
Изображение было извлечено из реестра и запущено в контейнере. Переключитесь в браузер и подключитесь к приложению через порт 3000 для проверки. В этом случае мы запускаем контейнер на нашей локальной машине, поэтому мы можем получить к нему доступ через * localhost * по следующему URL:
http://localhost:3000/hello/test
OutputHello, test!
Успех! Вы можете остановить контейнер с помощью + CTRL-C +
. С этого момента каждый раз, когда мы добавляем новый код в ветку + master +
нашего репозитория, мы автоматически собираем и тестируем новое изображение + hello_hapi: latest +
.
Заключение
В этом уроке мы настроили новый GitLab runner для создания образов Docker, создали частный реестр Docker для их хранения и обновили приложение Node.js, которое будет собираться и тестироваться внутри контейнеров Docker.
Чтобы узнать больше о различных компонентах, используемых в этой настройке, вы можете прочитать официальную документацию GitLab CE, https://docs.gitlab.com/ee. /administration/container_registry.html[GitLab Container Registry] и Docker.