Продолжая тему GitLab разберем что такое gitlab-runner, как устанавливается и для чего нужен
Допустим, есть программист, есть GitLab-сервер, сервера, на которых будем собирать это приложение: build, test, stage, prod. На каждый из серверов необходимо установить gitlab-runner. Можно через Ansible, можно руками. При установке gitlab-runner необходимо указать в какой среде они будут выполняться (напр.: "Docker" или "shell") и тэг. На первых двух серверах будут производиться сборка и тестирование приложения в среде Docker, а на последних двух развертывание приложения будет происходить в стандартной среде shell ОС Linux, соответственно. В первом случае при установке gitlab-runner необходимо указать тэг build. На втором сервере - test, третьем и четвертом - stage, prod, соответственно.
Pipeline всегда описывается в декларативном стиле в файле .gitlab-ci.yml и располагается в корневой директории репозитория.
stages: #Список этапов и порядок их запуска
- build #Сборка
- test #Тестирование
- staging #Пре-релиз
- prod #Конечный пользователь
variables: #глобальные переменные
TEST_DIR: /var/www
build-job: #Просто имя работы, можно назвать как хочешь
stage: build #Этап сборки приложения
image: ubuntu:20.04 #Образ, на основе которого будет запускаться docker-контейнер
tags: #Запустить на сервере с тэгом "build"
- build
script: #Что делает в контейнере
- echo "Compiling the code..."
- echo "Compile complete" >> index.html
artifacts: #Отправляет обратно на Gitlab-server собранные артефакты приложений
paths:
- build/
# allow_failure: true #Параметр "игнорирования ошибки"
unit-test-job: #Эта работа запускается в этапе "Test"
stage: test #Этап тестирования. Запустится ТОЛЬКО ЕСЛИ этап сборки был завершен успешно
image: ubuntu:20.04 #Так же запускается в контейнере для тестирования
tags: #Запустить на сервере с тегом "test"
- test
script:
- echo "Running unit tests... This will take about 60 seconds."
- sleep 60
- echo "Code coverage is 90%"
- test -f /build/index.html
lint-test-job: #Эта работа также запускается в этапе "Test"
stage: test #Может быть запущена параллельно с работой "unit-test-job"
tags: #Запустить на сервере с тэгом "test"
- test
script:
- echo "Linting code... This will take about 10 seconds."
- sleep 10
- echo "No lint issues found."
staging-deploy-job: #Эта работа запускается в этапе пре-релиза
stage: stage #Этот этап запускается ТОЛЬКО когда ОБЕ предыдущие работы были завершены успешно
tags: #Запустить на сервере с тэгом "stage"
- stage
script:
- mkdir build && cd build && touch index.html && sudo cp index.html $TEST_DIR/index.html && bash -c 'echo "stage" > '$TEST_DIR'/index.html'
- sudo bash bla-bla
prod-deploy-job: #Это работа запускается вручную, когда все остальные работы завершены успешно
stage: prod
tags: #Запустить на сервере с тэгом "prod"
- prod
script:
- cp /build/index.html $TEST_DIR/index.html
- test -f $TEST_DIR/index.html
when: manual #Условие ручного запуска
Так же GitLab предлагает другие gitlab-runner executors ознакомиться с которыми можно на официальном сайте gitlab.com
Для установки docker-runner необходимо чтобы на самих серверах был установлен Docker. На серверах "Build" и "Test" в командной строке:
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
$ sudo apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Подключение gitlab-runner к GitLab
Заходим в проект, инсталлируем и регистрируем docker-runner на build и test серверах:
# docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
# docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
--non-interactive \
--executor "docker" \
--url "https://gitlab.<DOMAIN>.COM/" \
--token "REDACTED"
Pipeline
Для того чтобы выполнялись команды с привилегиями, необходимо прописать на удаленных серверах sudo echo "gitlab-runner ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers. Заходим в проект и создаем новый файл .gitlab-ci.yml:
stages: #Список этапов и порядок их запуска
- build #Сборка
- test #Тестирование
- stage #Пре-релиз
# - prod #Конечный сервер
variables: #глобальные переменные
DIR: /var/www
build-job: #Просто имя работы, можно назвать как хочешь НУЖНО ПОРОБОВАТЬ СОБРАТЬ МОЙ САЙТ
stage: build #Этап сборки приложения
image: ubuntu:24.04 #Образ, на основе которого будет запускаться docker-контейнер
tags: #Запустить на сервере с тэгом "build"
- build
script: #Что делает в контейнере (просто команды)
- mkdir build && cd build && echo 'apt -y install nginx' >> install_nginx.sh
artifacts: #Отправляет обратно на Gitlab-server собранные артефакты приложений
paths:
- build/
unit-test-job: #Эта работа запускается в этапе "Test" вызывает Docker runner? который мы регали где?
stage: test #Этап тестирования. Запустится ТОЛЬКО ЕСЛИ этап сборки был завершен успешно
# image: ubuntu:24.04 #Так же запускается в контейнере для тестирования
tags: #Запустить на сервере с тегом "test"
- test
script:
# - echo "Running unit tests... This will take about 60 seconds."
# - sleep 60
# - echo "Code coverage is 90%" && sudo rm -rfv $DIR && sudo mkdir $DIR && sudo touch $DIR/file1
# - sudo bash -c 'echo "Фак Ю Спилберг" >> '$DIR'/file1' && sudo cat $DIR/file1
- test -f build/install_nginx.sh
allow_failure: true #Параметр "игнорирования ошибки"
lint-test-job: #Эта работа также запускается в этапе "Test"
stage: test #Может быть запущена параллельно с работой "unit-test-job"
tags: #Запустить на сервере с тэгом "test"
- test
script:
- sudo bash build/install_nginx.sh && sudo cp README.txt $DIR/index.html
# - echo "Linting code... This will take about 10 seconds."
# - sleep 10
# - echo "No lint issues found."
staging-deploy-job: #VUBNT220410 #Эта работа запускается в этапе пре-релиза #вызывает SHARED GITLAB runner? который мы регали где?
stage: stage #Этот этап запускается ТОЛЬКО когда ОБЕ предыдущие работы были завершены успешно
tags: #Запустить на сервере с тэгом "stage"
- stage
script:
- sudo bash build/install_nginx.sh && sudo cp README.txt $DIR/index.html
when: manual #Условие ручного запуска
#prod-deploy-job: #Это работа запускается вручную, когда все остальные работы завершены успешно #DEPO #вызывает SHARED GITLAB runner? который регали где? УЖЕ РУЧКАМИ КОГДА ПРОШЛИ ОСТАЛЬНЫЕ УРОВНИ
# stage: prod
# tags: #Запустить на сервере с тэгом "prod"
# - prod
# script:
# - cp /build/index.html $TEST_DIR/index.html
# - test -f $TEST_DIR/index.html
# when: manual #Условие ручного запуска
После того как нажмешь "Commit" - запустится сборочная линия, по выполнении можно скачать артефакты:
Для установки gitlab-runner с shell executor на stage и prod сервера:
# curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
# apt -y install gitlab-runner && gitlab-runner register --url https://gitlab.devopz.tech --token glrt-W1qN7x9gVxAszzSNQFTT
# systemctl enable gitlab-runner.service --now
Для регистрации Instance (Global) gitlab-runner все делается аналогично в "Admin Area".