Содержание
GitLab: организация совместной разработки проектов
GitLab — платформа для организации совместной работы с git-репозиториями. Представляет собой web-приложение, которое можно развернуть на любом сервере. GitLab популярен в области организации командной разработки, благодаря своим широким функциональным возможностям: созданию отдельных проектов, добавлению кода, обработке запросов, отслеживанию ошибок, средствам визуализации и многим другим. Код проекта написан на языке Ruby и распространяется под лицензией MIT.
В данной статье описывается процесс установки GitLab 8.4 на FreeBSD 10.2.
Git: установка и настройка
Git — распределенная система контроля версий. С более подробной информацией о Git можно ознакомиться в соответствующей статье.
Установка git
Установка сложностей не представляет. Я ставлю пакеты из собственного репозитория1) с именем FreeBSD_102_local:
tau# pkg install -r FreeBSD_102_local git
Для сборки git со своей конфигурацией перед сборкой пакета для репозитория выполняем
epsilon# poudriere options -c devel/git
и выбираем нужные опции.
Настройка git
Репозитории git будут храниться в домашней директории пользователя git. Кроме того, для корректной работы GitLab у пользователя должна быть интерактивная оболочка. Поэтому выполняем:
tau# pw user mod -n git -m -s /bin/csh
Для работы с git по протоколу git запускаем соответствующий daemon. Для запуска сервиса при старте системы пишем в файл /etc/rc.conf:
tau# echo 'git_daemon_enable="YES"' >> /etc/rc.conf
и запускаем сервис:
tau# service git_daemon start
Мы не будем работать по этому протоколу, т.к. это протокол без аутентификации пользователей2).
Работа с git
Более детальную информацию по работе с Git можно найти в статье о Git.
Установка и настройка GitLab 8
Системы GitLab нет в портах FreeBSD, поэтому установку придется проводить вручную. Это не представляет особых сложностей, поскольку GitLab написан на Ruby и почти на 100% платформонезависим. Однако, GitLab зависит от некоторых программ, которые предварительно нужно установить в систему. Так, GitLab Shell зависит от node. Кроме того, начиная с версии 8.0, веб-запросы к Git осуществляются c помощью утилиты, написанной на языке go, которая компилируется во время развертывания GitLab. Проверяем, что пакеты node и go находятся в репозитории FreeBSD_102_local и выполняем установку:
tau# pkg install -r FreeBSD_102_local node go
Про остальные зависимости написано ниже.
Ruby
Устанавливаем RubyGems - фреймворк для установки библиотек и приложений, написанных на Ruby. При этом пакет ruby будет поставлен через зависимости:
tau# pkg install -r FreeBSD_102_local ruby22-gems
Далее нам придется установить несколько Ruby-приложений. Представляется, что наилучший способ следующий: приложения из коллекции портов установить через pkg, а остальные поставить через Bundler — менеджер управления зависимостями в Ruby.
Ставим пакеты:
tau# pkg install -r FreeBSD_102_local rubygem-gitlab_git rubygem-sidekiq rubygem-omniauth-gitlab rubygem-gitlab-grack
Устанавливаем Bundler:
tau# gem install bundler --no-ri --no-rdoc
Позже, при развертывании GitLab, мы воспользуемся Bundler-ом для установки Ruby-приложений.
Redis
Redis — это высокопроизводительная база данных, которая размещается в памяти и хранит данные типа «ключ-значение». Часто используется для ускорения сетевых приложений.
Ставим пакет:
tau# pkg install -r FreeBSD_102_local redis
Далее нам потребуется минимальная настройка конфигурационного файла: нужно запретить слушать tcp, разрешить unixsocket и выставить права доступа на сокет. Это можно сделать с помощью любимого текстового редактора ee:
tau# ee /usr/local/etc/redis.conf
В результате соответствующие строки должны быть такими:
port 0 unixsocket /var/run/redis/redis.sock unixsocketperm 770
Обратите внимание, что файл redis.sock должен находиться в директории, на которую выставлены права полного доступа для группы. Это нужно, чтобы обеспечить доступ к файлу для пользователя git, которого мы добавим в группу redis. В противном случае при перезапуске сервиса права доступа на группу и группа будут перезаписаны.
Для автоматического запуска после старта системы редактируем /etc/rc.conf:
tau# echo 'redis_enable="YES"' >> /etc/rc.conf
Запускаем сервис:
tau# service redis start
В результате будет создан файл /var/run/redis/redis.sock, которому мы назначим владельца и права доступа:
tau# chown redis:redis /var/run/redis/redis.sock tau# chmod g+rw /var/run/redis/redis.sock
Наконец, не забываем добавить пользователя git в группу redis:
tau# pw user mod git -G redis
PostgreSQL
PostgreSQL — это объектно-реляционная система управления базами данных. Именно эта СУБД рекомендована для хранения данных GitLab3).
Устанавливаем сервер PostgreSQL.
tau# pkg install -r FreeBSD_102_local postgresql93-server
Версия выбрана из тех соображений, что на данный момент эта версия ставится по умолчанию. Опции компиляции пакета для репозитория можно предварительно выставить командой
epsilon# poudriere options -c databases/postgresql93-server
Разрешаем автозапуск после старта системы:
tau# echo 'postgresql_enable="YES"' >> /etc/rc.conf
По умолчанию PostgreSQL работает в кодировке UTF-8. Но, как видно из файла /etc/login.conf для FreeBSD пользовательской кодировкой по умолчанию является KOI8-R. Поэтому пользователю PostgreSQL придется сменить локаль. Для этого в файл /etc/login.conf добавим следующие строки:
postgres|PostgreSQL User Account:\ :charset=UTF-8:\ :lang=ru_RU.UTF-8:\ :setenv=LC_COLLATE=C:\ :tc=default:
и запустим обновление системной базы данных:
tau# cap_mkdb /etc/login.conf
Затем пропишем класс в rc.conf:
tau# echo 'postgresql_class="postgres"' >> /etc/rc.conf
Перед запуском сервиса проводим инициализацию:
tau# service postgresql initdb
После этого можно работать с базой данных. Запускаем сервер:
tau# service postgresql start
Следующим шагом ставим пароль администратора на СУБД:
tau# psql -U pgsql -d template1 psql (9.3.10) Введите "help", чтобы получить справку. template1=# \password Введите новый пароль: Повторите его: template1=# \q
Теперь запрещаем вход в БД без пароля для всех, кроме пользователя git. Пользователю git разрешим беспарольный доступ к БД gitlab. Запускаем текстовый редактор
tau# ee /usr/local/pgsql/data/pg_hba.conf
и правим файл так, чтобы в нем были следующие строки:
local gitlab git trust local all all md5 host all all 127.0.0.1/32 md5 host all all ::1/128 md5
Подключаемся к базе:
tau# psql -U pgsql -d template1 psql (9.3.10) Введите "help", чтобы получить справку. template1=#
В интерактивном терминале создаем новую базу данных gitlab для пользователя git:
template1=# CREATE USER git CREATEDB; template1=# CREATE DATABASE gitlab OWNER git; template1=# \q
Проверим, что локально разрешен вход без пароля, для чего подключимся к новой базе:
tau# psql -U git -d gitlab psql (9.3.10) Введите "help", чтобы получить справку. template1=> \q tau#
Далее отредактируем основной конфигурационный файл postgresql.conf:
tau# ee /usr/local/pgsql/data/postgresql.conf
Параметр max_connection отвечает за максимальное число пользователей, одновременно подключенных к СУБД. По умолчанию max_connection=100. Уменьшим это число до 20.
Параметр shared_buffers определяет объем разделяемой памяти, используемый сервером. Для машины с 2Гб ОЗУ выставим этот параметр до 256Mb.
Остальные параметры оставим по умолчанию. Перезапустим сервис:
tau# service postgresql restart
На этом настройку СУБД для работы с GitLab можно считать завершенной.
Установка и настройка GitLab
Ядро GitLab
GitLab устанавливаем в домашнюю директории пользователя git, предварительно войдя в систему:
tau# su - git tau% pwd /home/git tau% git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 8-4-stable gitlab
Затем создадим необходимые директории и выставим нужные права доступа:
tau% mkdir gitlab/public/uploads tau% chmod -R u+rwX,o-rwx gitlab/public/uploads tau% chown -R git:git gitlab/log tau% chmod -R u+rwX,go-w gitlab/log tau% chown -R git:git gitlab/tmp tau% chmod -R u+rwX gitlab/tmp tau% chmod -R u+rwX gitlab/builds tau% chmod -R u+rwX shared/artifacts
Заходим в директорию gitlab и копируем конфигурационные файлы:
tau% cd /home/git/gitlab tau% cp config/gitlab.yml.example config/gitlab.yml tau% cp config/secrets.yml.example config/secrets.yml tau% cp config/unicorn.rb.example config/unicorn.rb tau% cp config/resque.yml.example config/resque.yml tau% cp config/database.yml.postgresql config/database.yml tau% cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb
Пользователи других СУБД должны скопировать файл настроек с другим расширением.
Посторонним запрещаем доступ к файлам:
tau% chmod 0600 config/secrets.yml tau% chmod o-rwx config/database.yml
Далее редактируем настройки конфигурации:
tau% ee config/unicorn.rb
Параметр worker_processes должен быть равен число процессоров машины.
В файле config/resque.yml необходимо откорректировать redis-сокет. В нашем случае оставляем как есть:
unix:/var/run/redis/redis.sock
Файл config/gitlab.yml должен содержать следующие строки:
host: tau.home.local port: 443 https: true bin_path: /usr/local/bin/git
где tau.home.local - имя хоста, на котором разворачивается GitLab. Вторая и третья строки меняются только в том случае, когда мы хотим работать с веб-интерфейсом через защищенное соединение.
Файл config/database.yml должен содержать корректное имя базы данных:
database:gitlab
Создаем директорию для сателлитов:
tau% mkdir /home/git/gitlab-satellites tau% chmod u+rwx,g=rx,o-rwx /home/git/gitlab-satellites
С помощью менеджера bundler устанавливаем Ruby-пакеты:
tau% bundle install --deployment --without development test mysql aws kerberos
Задаем настройки git:
tau% git config --global user.name "GitLab" tau% git config --global user.email "ladilova@home.local" tau% git config --global core.autocrlf input
Последняя строка определяет настройки git, когда к нему происходит обращение через веб-сервер.
Установка и настройка GitLab Shell
Выполняем установку:
tau% bundle exec rake gitlab:shell:install REDIS_URL=unix:/var/run/redis/redis.sock RAILS_ENV=production tau% chmod -R ug+rwX,o-rwx /home/git/repositories tau% chmod -R ug-s /home/git/repositories
Чтобы обеспечить доступ по протоколу https, изменяем файл config.yml:
tau% ee /home/git/gitlab-shell/config.yml
так, чтобы в нем содержалась строка
gitlab_url: https://tau.home.local
где tau.home.local - имя машины с GitLab.
Также указываем, что будем использовать самоподписанный сертификат:
http_settings: self_signed_cert: true
GitLab WorkHorse
WorkHorse не требует дополнительных настроек. Устанавливаем и компилируем утилиту.
tau% cd /home/git tau% git clone https://gitlab.com/gitlab-org/gitlab-workhorse.git tau% cd gitlab-workhorse tau% git checkout 0.6.2 tau% make
Инициализация базы данных
Команда
tau% cd /home/git/gitlab tau% bundle exec rake gitlab:setup RAILS_ENV=production GITLAB_ROOT_PASSWORD=yourpassword tau% exit
создает таблицы базы данных.
Скрипт запуска
Скрипт запуска GitLab нужно скачать отдельно и положить его в директорию /usr/local/etc/rc.d, разрешив запуск скрипта:
tau# wget -O /usr/local/etc/rc.d/gitlab https://gitlab.com/gitlab-org/gitlab-recipes/raw/master/init/init/freebsd/gitlab-unicorn tau# chmod u+x /usr/local/etc/rc.d/gitlab
После этого можно добавить в /etc/rc.conf:
tau# echo 'gitlab_enable="YES"' >> /etc/rc.conf
Последние штрихи
Проверим, что GitLab установлен корректно:
tau# su - git tau% cd /home/git/gitlab tau% bundle exec rake gitlab:env:info RAILS_ENV=production
На ошибку о неустановленном скрипте запуска можно не обращать внимание: у нас FreeBSD. С ошибкой Sidekiq не очень понятно, но вроде бы приложение работает.
Осталось поставить какое-то жутко нужное волшебство
tau% bundle exec rake assets:precompile RAILS_ENV=production tau% exit
и организовать ротацию логов. Для этого в директории /etc/newsyslog.d.conf создаем файл gitlab:
tau# cat /etc/newsyslog.d.conf/gitlab /home/git/gitlab/log/*.log git:git 640 7 * $W0D2 JC /home/git/gitlab-shell/gitlab-shell.log git:git 640 7 * $W0D2 JC
На этом установка и настройка GitLab завершена. Осталось сделать так:
tau# service gitlab start
Установка и настройка Nginx
Nginx — веб-сервер, официально рекомендованный для работы с GitLab.
Выполняем установку пакета:
tau# pkg install -r FreeBSD_102_local nginx
Пользователя www, под которым работает nginx, добавим в группу git:
tau# pw user mod -n www -G git
Настраиваем Nginx для работы с GitLab по протоколу https. Создаем директории для хранения настроек хостов и сертификатов:
tau# mkdir /usr/local/etc/nginx/hosts tau# mkdir /usr/local/etc/nginx/certs
это мы делаем для удобства, чтобы не загромождать основной файл nginx.conf. Копируем файл настроек:
tau# cp lib/support/nginx/gitlab-ssl /usr/local/etc/nginx/hosts/
и редактируем его. Для сертификатов прописываем следующие пути:
ssl_certificate certs/gitlab.crt; ssl_certificate_key certs/gitlab.key;
Создаем сертификаты:
tau# cd /usr/local/etc/nginx/certs tau# openssl req -newkey rsa:2048 -x509 -nodes -days 3560 -out gitlab.crt -keyout gitlab.key tau# chmod o-r gitlab.key
Создаем отдельные файлы для хранения логов:
tau# mkdir /var/log/nginx tau# chown www:www /var/log/nginx
Основной конфигурационный файл приводим к следующему виду:
tau# cat /usr/local/etc/nginx/nginx.conf user www www; worker_processes 5; events { worker_connections 1024; use kqueue; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; client_max_body_size 64m; include hosts/gitlab-ssl; }
Добавляем в rc.conf:
tau# echo 'nginx_enable="YES"' >> /etc/rc.conf
и запускаем:
tau# service nginx start
Настройка клиентской части
TortoiseGit
TortoiseGit — клиент системы контроля версий с графическим интерфейсом для ОС Windows. Является расширением Проводника Windows. Установка и настройка проблем обычно не вызывает.
Если при работе: клонировании или push-запросе возникает ошибка, связанная с самоподписанным сертификатом, то команда
> git config --global http.sslverify false
решает данную проблему. Однако, так делать не рекомендуется. Более длинный способ решения проблемы — добавить сертификат в настройках git:
- Сохраните сертификат в формате pem. (Просмотреть его можно из браузера, нажав кнопку просмотр сертификата.)
- Запустите команду
> git config --global http.sslcainfo "полный_путь_к_сертификату"