Установка 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, где:
Обновления без изменения минорной версии можно выполнять через любое количество патчей.
Обновления минора лучше выполнить последовательно.
Иногда после обновления GitLab может не стартовать автоматически, тогда достаточно попробовать выполнить перезапуск:
gitlab-ctl restart
Если все ещё не работает, выполнить переконфигурацию:
gitlab-ctl reconfigure gitlab-ctl restart
Также при обновлении через большое количество версий, или с большим количеством проектов внутри GitLab возможны ошибки:
TASK: gitlab tasks: top => db:migrateUpgrade 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-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