В данной статье, я решил описать свой опыт настройки gitlab CI и арендуемого VPS.
Предпосылки
На работе, ув. DevOps'ы настроили мне деплой проектов в kubernetes (
Исходные данные
- Аккаунт https://gitlab.com/
- VPS сервер с Ubuntu 18.04
Создание репозитория
Создаем репозиторий, который хотим автоматизировать.
Я решил для тестов, поднять docker с nginx и пробросом на html страницу.
Структура репозитория:
- Dockerfile
FROM nginx:latest COPY html /var/www/html COPY nginx.conf /etc/nginx/nginx.conf
- nginx.conf
events {} http { server { listen 80; location / { root /var/www/html; } } }
- html
- index.html
<html> <h1>Hello, Runner!</h1> </html>
- .gitlab-ci.yml
image: docker:19.03.8 before_script: - docker info build: stage: build script: - docker build -t hellorunner . deploy: stage: deploy script: - docker ps --filter name=hellorunner --quiet | xargs --no-run-if-empty docker stop | xargs --no-run-if-empty docker rm - docker run -d --restart=always --name hellorunner -p 8090:80 hellorunner after_script: - docker system prune -f
Настройка репозитория
Открываем settings -> CI
Затем у пункта Runners нажимаем expand
Первым делом выключаем предложенные runners — Disable shared runners
Затем, нас интересует — «Set up a specific Runner manually»
Копируем токен, в будущем он нам понадобится.
Подготовка VPS
Устанавливаем docker.
Устанавливаем gitlab-runner.
Регистрируем новый runner.
! В поле executor указываем docker версии, как и в Dockerfile!
В поле token указываем токен, который запомнили из gitlab
gitlab-runner register
Теперь, нужно внести небольшие правки в конфиг runner'а.
nano /etc/gitlab-runner/config.toml
поле
volumes = ["/cache"]
меняем на
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
Выполняем рестарт демона
gitlab-runner restart
Снова возвращаемся к gitlab/settings/CI/Runners.
Должен появиться активный runner
Редактируем runner, нажатием
Разрешаем выполнять задачи без тэгов
Теперь выполняем push коммита и следим за job'ами
И напоследок открываем браузер
Ссылка на репозиторий
P.S.: Я встретил проблему — у меня собранный образ изнутри не имел доступа к внешней сети, решение — создать файл/etc/docker/daemon.json:
{
"dns": ["8.8.4.4", "8.8.8.8"]
}
service docker restart