Sysadmin
February 25

Установка GitLab CE на Debian/Ubuntu Linux

Git - это система контроля версий, используется для ведения проектов в том числе распределенными группами разработчиков.

Справка по Git | Настройка клиента Git

GitLab - это проект, который используя систему управления репозиториями git полностью обеспечивает жизненный цикл DevOps, включая wiki, CI/CD и многое другое.

GitLab поставляется в нескольких вариантах:

  • Docker - запускается в виде контейнера;
  • Source code - компилируется под конкретную ОС;
  • Omnibus - "все в одном".

Мы рассмотрим вариант Omnibus - он подразумевает установку всех необходимых для функционирования GitLab утилит вместе с GitLab: PostgreSQL, Redis, Nginx, Prometheus, Grafana, Registry, и т.д.

Подготовка системы

Установить имя хоста, записать значение в /etc/hosts

hostnamectl set-hostname gitlab
sed -i s/127.0.1.1/\#127.0.1.1/g /etc/hosts
echo "10.0.3.101 gitlab" >> /etc/hosts

Укажите в DNS IP-адрес Gitlab сервера и настройте обратный прокси в случае необходимости.
Установить дополнительные пакеты

apt install -y curl ca-certificates openssl perl

Установить локаль, потребуется для PostgreSQL

sh -c "echo 'LANG=en_US.UTF-8\nLC_ALL=en_US.UTF-8' > /etc/default/locale"

Установить агент передачи почты (MTA), например Postfix

apt install -y postfix

Для выбора пунктов в установщике используйте клавишу Tab и клавишу Enter для подтверждения.

  • Выберите Internet site
  • Задайте в Mail name полное доменное имя (FQDN), например gitlab.antroot.ru
  • Остальные настройки можно пропустить, нажав Enter
    Запустить и включить postfix
systemctl start postfix
systemctl enable postfix

Установка Gitlab

На официальном сайте gitlab.com можно уточнить инструкции для установки на определенные дистрибутивы операционных систем. В варианте Debian для добавления репозитория используется скрипт (задать переменные os и dist, если скрипт не смог определить):

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | os=debian dist=buster bash

Установка

EXTERNAL_URL="https://gitlab.antroot.ru" \
GITLAB_ROOT_PASSWORD="MyStrongPassword" \
apt install gitlab-ce gitlab-cli

Если перед установкой не была задана переменная с паролем администратора, после установки пароль администратора в течение 24 часов хранится в файле

/etc/gitlab/initial_root_password

Основные файлы GitLab расположены:

  • /etc/gitlab/ - конфигурация gitlab
  • /var/log/gitlab/ - журналы gitlab
  • /opt/gitlab/ - бинарные файлы gitlab
  • /var/opt/gitlab/ - рабочие директории nginx, postgresql, redis, registry, prometheus, grafana

Основные параметры GitLab
В файле /etc/gitlab/gitlab.rb

external_url 'https://gitlab.antroot.ru'
gitlab_rails['time_zone'] = 'UTC'

gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'gitlab@antroot.ru'
gitlab_rails['gitlab_email_display_name'] = 'GitLab'
gitlab_rails['gitlab_email_reply_to'] = 'noreply@antroot.ru'
gitlab_rails['gitlab_email_subject_suffix'] = 'gitlab.antroot.ru'

gitlab_rails['gitlab_default_theme'] = 2

Расположение репозиториев по умолчанию /var/opt/gitlab/git-data:

git_data_dirs({
  "default" => {
    "path" => "/mnt/git-data"
   }
})
# или
git_data_dirs({
  "default" => { "path" => "/var/opt/gitlab/git-data" },
  "alternative" => { "path" => "/mnt/git-data" }
})

Для синхронизации выполните:

gitlab-ctl stop
rsync -av --delete /var/opt/gitlab/git-data/repositories /mnt/git-data/
gitlab-ctl reconfigure
gitlab-ctl start

Registry располагается по умолчанию в /var/opt/gitlab/gitlab-rails/shared/registry:

registry_external_url 'https://registry.antroot.ru'
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = "registry.antroot.ru"
gitlab_rails['registry_port'] = "5005"
gitlab_rails['registry_path'] = "/mnt/shared/registry"

registry_nginx['enable'] = true
registry_nginx['listen_port'] = 5005

Другие хранилища из /var/opt/gitlab/gitlab-rails/shared/ также можно переместить на подключенные диски:

gitlab_rails['lfs_enabled'] = true
gitlab_rails['lfs_storage_path'] = "/mnt/shared/lfs-objects"

gitlab_rails['uploads_directory'] = "/mnt/uploads"

gitlab_rails['terraform_state_enabled'] = true
gitlab_rails['terraform_state_storage_path'] = "/mnt/shared/terraform_state"

gitlab_rails['pages_local_store_enabled'] = true
gitlab_rails['pages_local_store_path'] = "/mnt/shared/pages"

gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/mnt/backups"
# default skip
#gitlab_rails['env'] = {
#    "SKIP" => "db,uploads,repositories,builds,artifacts,lfs,registry,pages"
#}
gitlab_rails['env'] = {
    "SKIP" => "uploads,builds,artifacts,lfs,registry"
}

После применения настроек из файла /etc/gitlab/gitlab.rb необходимо выполнить реконфигурацию gitlab

gitlab-ctl reconfigure

Конфигурация обратного прокси (reverse proxy) для gitlab на примере nginx

# переадресация на HTTPS
server {
    listen 80;
    server_name gitlab.antroot.ru;
    return 301 https://$http_host$request_uri;
}

# блок обработки основного сайта с выдачей контента через proxy_pass с сервера в DMZ
server {
    server_name gitlab.antroot.ru;
    listen 443 http2 ssl;

    location / {
        resolver 10.0.2.2;
        proxy_pass https://gitlab.antroot.lan;
        proxy_set_header Host $host;
    }
    access_log /var/log/nginx/gitlab.antroot.ru.access.log;
    error_log  /var/log/nginx/gitlab.antroot.ru.error.log;

    #ssl_certificate /etc/letsencrypt/live/gitlab.antroot.ru/fullchain.pem;
    #ssl_certificate_key /etc/letsencrypt/live/gitlab.antroot.ru/privkey.pem;
}

# блок для реестра registry также с выдачей контента через proxy_pass из DMZ
server {
    server_name registry.antroot.ru;
    listen 5005 ssl;
    listen 443 http2 ssl;

    location / {
        resolver 10.0.2.2;
        proxy_pass https://gitlab.antroot.lan:5005;
        proxy_set_header Host $host;
        proxy_cache off;
        proxy_buffering off;
        proxy_request_buffering off;
    }
    access_log /var/log/nginx/registry.antroot.ru.access.log;
    error_log  /var/log/nginx/registry.antroot.ru.error.log;

    #ssl_certificate /etc/letsencrypt/live/registry.mijor.ru/fullchain.pem;
    #ssl_certificate_key /etc/letsencrypt/live/registry.mijor.ru/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

Здесь закрыты комментарием ссылки на файлы сертификатов, которые можно установить с помощью certbot, подробнее смотрите в статье

Проверка

После установки и настройки можно зайти браузером на адрес http://gitlab.antroot.ru (используйте указанный при настройке gitlab) - первая авторизация по указанному выше в статье паролю или из файла в /etc/gitlab/initial_root_password.
Авторизуйтесь, смените пароль (правое верхнее меню, profile, password), создайте группу (левое верхнее меню, groups, create group) и проект (левое верхнее меню, projects, create project).
В настройках проекта в левом меню Packages & Registries / Container Registry есть настройки доступа к репозиторию образов Container Registry. Например, при указании адреса реестра registry.antroot.ru, в группе group1 и проекте project1:

docker login registry.antroot.ru
docker build -t registry.antroot.ru:/group1/project1 .
docker push registry.antroot.ru/group1/project1

Создадим тестовый образ и проверим работу реестра registry:

docker login registry.antroot.ru
# Введите Username / Password

# сборка образа из Dockerfile
docker image build -t registry.antroot.ru:5005/group1/project1:latest -<<EOF
FROM busybox
RUN echo "Hello from Busybox"
EOF

# копирование образа в registry
docker push registry.antroot.ru/group1/project1:latest

# запуск контейнера из образа
docker run registry.antroot.ru/group1/project1:latest

Установка GitLab Runner

Для установки сборщика нужно воспользоваться официальным репозиторием GitLab, например для Debian 10 (Buster):

# установка Docker
apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io

# установка GitLab-Runner
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | bash -
apt update
apt install -y gitlab-runner

После установки открыть в GitLab раздел Admin Area / Runners - скопировать URL и Token, а затем на устанавливаемом раннере запустить регистрацию:

gitlab-runner register

и ответить на вопросы:

  • Gitlab URL: https://gitlab.antroot.ru ;
  • Registration token: из раздела Admin / Runners;
  • Description: описание, отображаемое в GitLab (gitlab-runner-1);
  • Tags: теги, по которым можно назначать задания в CI (docker, intel, x86);
  • Executor: способ запуска, например docker;
  • Default image: образ по умолчанию: alpine:3.12.8

Конфигурация /etc/gitlab-runner/config.toml. Здесь в конфиг по умолчанию добавлены параметры:

  • dns - установка своего DNS сервера;
  • daemon.json - подключение конфигурации docker на раннере в запускаемый контейнер;
  • registry-mirror - подключение зеркала docker hub.
concurrent = 2
check_interval = 0
listen_address = ":9252"

[[runners]]
  name = "gitlab-runner-1"
  url = "https://gitlab.antroot.ru"
  token = "SomeHashedStringXJKSKFJS"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.docker]
    dns = ["10.0.3.2"]
    pull_policy = ["always", "if-not-present"]
    tls_verify = false
    image = "alpine:3.12.8"
    privileged = true
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache", "/certs/client","/etc/docker/daemon.json:/etc/docker/daemon.json:ro"]
    shm_size = 0
    [[runners.docker.services]]
      command = ["--registry-mirror", "https://dockerhub.antroot.ru"]
  [runners.cache]
    Type = "s3"
    Shared = true
    [runners.cache.s3]
      ServerAddress = "s3.antroot.ru:9000"
      AccessKey = "minio"
      SecretKey = "S3SecretPass"
      BucketName = "runners"
      BucketLocation = "ru-east-1"
      Insecure = true

Конфигурация /etc/docker/daemon.json

{
    "registry-mirrors": [ "https://dockerhub.antroot.ru" ],
    "dns": ["10.0.3.2", "8.8.8.8", "1.1.1.1"]
}

После изменения конфиугурации gitlab-runner, она должна автоматически подхватиться раннером. Перезапуск и просмотр состояния выполняется простыми командами:

gitlab-runner restart
gitlab-runner status

В GitLab в администрировании можно увидеть статус подключенного раннера.


Обновление GitLab

GitLab обновляется очень просто!

apt update
apt install gitlab-ce

Обновление GPG ключа репозитория:

curl -L https://packages.gitlab.com/gitlab/gitlab-ee/gpgkey | sudo apt-key add -

Для обновления на специфичную версию, нужно выяснить номер версии и затем обновиться:

apt update
apt-cache policy gitlab-ce
apt install gitlab-ce=14.4.1-ce.0

Версии GitLab нумеруются так: XX.YY.ZZ, где:

  • XX - мажорная версия
  • YY - минор
  • ZZ - патч

Обновления без изменения минорной версии можно выполнять через любое количество патчей.
Обновления минора лучше выполнить последовательно.

Иногда после обновления GitLab может не стартовать автоматически, тогда достаточно попробовать выполнить перезапуск:

gitlab-ctl restart

Если все ещё не работает, выполнить переконфигурацию:

gitlab-ctl reconfigure
gitlab-ctl restart

Также при обновлении через большое количество версий, или с большим количеством проектов внутри GitLab возможны ошибки:

  • TASK: gitlab tasks: top => db:migrate
  • Upgrade fails with "Error executing action 'run' on resource 'bash[migrate gitlab-rails database]'

это связано с ошибкой миграции данных при обновлении. Посмотреть состояние миграций можно так:

gitlab-rake db:migrate:status

на выходе появится длинный список миграций в состоянии up - выполнена, down - не выполнена. Запустить миграции вручную можно так:

gitlab-rake db:migrate

После выполнения иногда может понадобиться завершить какую-нибудь миграцию блокирующую дальнейшие преобразования вручную, о чем будет выведено сообщение, например такое:

... run it manually
sudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,taggings,id,'[["id"\, "taggable_id"]\, ["id_convert_to_bigint"\, "taggable_id_convert_to_bigint"]]']

нужно выполнить это вручную, затем снова запустить миграции gitlab-rake db:migrate, и так до победного, чтобы в выводе gitlab-rake db:migrate:status все миграции были выполнены. Затем останется перезапустить gitlab

gitlab-ctl restart

Проверка состояния GitLab

gitlab-rake gitlab:env:info
gitlab-rake gitlab:check

Миграция GitLab на другой сервер

GitLab сервер - источник

Убедиться, что все необходимые компоненты сохраняются в резервной копии в конфигурационном файле /etc/gitlab/gitlab.rb - SKIP определяет, какой компонент пропустить и не копировать:

#"SKIP" => "db,uploads,repositories,builds,artifacts,lfs,registry,pages"
gitlab_rails['env'] = {
    "SKIP" => "uploads,builds,artifacts,lfs"
}

Вначале нужно остановить сервер, чтобы сохранить целостность резервной копии:

gitlab-ctl stop unicorn
gitlab-ctl stop puma
gitlab-ctl stop sidekiq

Сохранить конфигурацию и данные:

gitlab-ctl backup-etc
# для версий до 12.1 включительно
gitlab-rake gitlab:backup:create
# для версий после 12.1
gitlab-backup create

Полученные файлы необходимо скопировать на новый сервер:

  • /etc/gitlab/config_backups/gitlab_config_<TIMESTAMP>_<DATE>.tar - архви с конфигурационными файлами gitlab.rb, config.json, ssl
  • /var/opt/gitlab/backups/<TIMESTAMP>_<DATE>_<VERSION>_gitlab_backup.tar - архив с данными
scp /etc/gitlab/config_backups/* user@newserver.antroot.ru:~
scp /var/opt/gitlab/backups/* user@newserver.antroot.ru:~

GitLab сервер - приемник

Установить GitLab такой же версии, что исходный сервер, согласно инструкции по Установке GitLab (описано выше)

apt install gitlab-ce=14.4.1-ce.0

Распаковать архив конфигурационных файлов в /etc/gitlab

tar zxvf ~/config_backups/gitlab_config_<TIMESTAMP>_<DATE>.tar -C /

Скопировать архив данных в директорию с резервными копиями:

scp ~/<TIMESTAMP>_<DATE>_gitlab_backup.tar /var/opt/gitlab/backups/
chown -R git:git /var/opt/gitlab/backups/

Поправить значения в конфигурации /etc/gitlab/gitlab.rb при необходимости (например, указать новый URL):

gitlab-ctl reconfigure
gitlab-ctl restart

Остановить сервисы, использующие PostgreSQL:

gitlab-ctl stop unicorn
gitlab-ctl stop puma
gitlab-ctl stop sidekiq

Восстановить архив:

# для версий до 12.1 включительно
gitlab-rake gitlab:backup:restore BACKUP=<TIMESTAMP>_<DATE>_<VERSION>
# для версий после 12.1
gitlab-backup restore BACKUP=<TIMESTAMP>_<DATE>_<VERSION>

Запустить GitLab и выполнить проверку:

gitlab-ctl start
gitlab-rake gitlab:check SANITIZE=true