git - это система контроля версий, используется для ведения проектов в том числе распределенными группами разработчиков.
GitLab - это проект, который используя систему управления репозиториями git полностью обеспечивает жизненный цикл DevOps, включая wiki, CI/CD и многое другое.
GitLab поставляется в нескольких вариантах:
Мы рассмотрим вариант 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.halfoff.rupostfix
systemctl start postfix
systemctl enable postfix
На официальном сайте 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.halfoff.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.halfoff.ru'
gitlab_rails['time_zone'] = 'UTC'
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'gitlab@halfoff.ru'
gitlab_rails['gitlab_email_display_name'] = 'GitLab'
gitlab_rails['gitlab_email_reply_to'] = 'noreply@halfoff.ru'
gitlab_rails['gitlab_email_subject_suffix'] = 'gitlab.halfoff.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.halfoff.ru'
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = "registry.halfoff.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.halfoff.ru;
return 301 https://$http_host$request_uri;
}
# блок обработки основного сайта с выдачей контента через proxy_pass с сервера в DMZ
server {
server_name gitlab.halfoff.ru;
listen 443 http2 ssl;
location / {
resolver 10.0.2.2;
proxy_pass https://gitlab.halfoff.lan;
proxy_set_header Host $host;
}
access_log /var/log/nginx/gitlab.halfoff.ru.access.log;
error_log /var/log/nginx/gitlab.halfoff.ru.error.log;
#ssl_certificate /etc/letsencrypt/live/gitlab.halfoff.ru/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/live/gitlab.halfoff.ru/privkey.pem;
}
# блок для реестра registry также с выдачей контента через proxy_pass из DMZ
server {
server_name registry.halfoff.ru;
listen 5005 ssl;
listen 443 http2 ssl;
location / {
resolver 10.0.2.2;
proxy_pass https://gitlab.halfoff.lan:5005;
proxy_set_header Host $host;
proxy_cache off;
proxy_buffering off;
proxy_request_buffering off;
}
access_log /var/log/nginx/registry.halfoff.ru.access.log;
error_log /var/log/nginx/registry.halfoff.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.halfoff.ru (используйте указанный при настройке gitlab) - первая авторизация по указанному выше в статье паролю или из файла в /etc/gitlab/initial_root_password
.
Авторизуйтесь, смените пароль (правое верхнее меню, profile, password), создайте группу (левое верхнее меню, groups, create group) и проект (левое верхнее меню, projects, create project).
В настройках проекта в левом меню Packages & Registries / Container Registry есть настройки доступа к репозиторию образов Container Registry. Например, при указании адреса реестра registry.halfoff.ru, в группе group1 и проекте project1:
docker login registry.halfoff.ru
docker build -t registry.halfoff.ru:/group1/project1 .
docker push registry.halfoff.ru/group1/project1
Создадим тестовый образ и проверим работу реестра registry:
docker login registry.halfoff.ru
# Введите Username / Password
# сборка образа из Dockerfile
docker image build -t registry.halfoff.ru:5005/group1/project1:latest -<<EOF
FROM busybox
RUN echo "Hello from Busybox"
EOF
# копирование образа в registry
docker push registry.halfoff.ru/group1/project1:latest
# запуск контейнера из образа
docker run registry.halfoff.ru/group1/project1:latest
Для установки сборщика нужно воспользоваться официальным репозиторием 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
и ответить на вопросы
Конфигурация /etc/gitlab-runner/config.toml
. Здесь в конфиг по умолчанию добавлены параметры
concurrent = 2
check_interval = 0
listen_address = ":9252"
[[runners]]
name = "gitlab-runner-1"
url = "https://gitlab.halfoff.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.halfoff.ru"]
[runners.cache]
Type = "s3"
Shared = true
[runners.cache.s3]
ServerAddress = "s3.halfoff.ru:9000"
AccessKey = "minio"
SecretKey = "S3SecretPass"
BucketName = "runners"
BucketLocation = "ru-east-1"
Insecure = true
Конфигурация /etc/docker/daemon.json
{
"registry-mirrors": [ "https://dockerhub.halfoff.ru" ],
"dns": ["10.0.3.2", "8.8.8.8", "1.1.1.1"]
}
После изменения конфиуграции gitlab-runner, она должна автоматически подхватиться раннером. Перезапуск и просмотр состояния выполняется простыми командами:
gitlab-runner restart
gitlab-runner status
В 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: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
Убедиться, что все необходимые компоненты сохраняются в резервной копии в конфигурационном файле /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.halfoff.ru:~
scp /var/opt/gitlab/backups/* user@newserver.halfoff.ru:~
Установить 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