Настройка GitLab-Runner. Создание CI/CD Pipeline

19 September 2013
Rate this item
(0 votes)

Продолжая тему 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".

Leave a comment

Popular Posts

Advertisement

Headlines