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

  • авторизация пользователей через Active Directory
  • e-mail уведомления о пушах
  • управление и создание репозиториев, а так же управление доступом через web-интерфейс
  • возможность размещения mercurial, git, svn
  • простота разворачивания
  • поддержка SSL

Изучение гугла и тестовые установки различного ПО привели меня к SCM-manager, который позволял практически из коробки реализовать все поставленные требования.

Внедрение сервиса проводилось на Debian 8.3 x64.

Под катом процесс установки и настройки:

1. Установка Mercurial и SCM-Manager


Устанавливаем меркуриал и доп. пакеты:

sudo apt-get install mercurial ca-certificates default-jre

Переходим в директорию куда будем устанавливать SCM-Manager:

cd ...

Скачиваем последнюю версию с официального сайта:

sudo wget https://maven.scm-manager.org/nexus/content/repositories/releases/sonia/scm//scm-server/1.46/scm-server-1.46-app.tar.gz

Разархивируем её:

sudo tar -xvf scm-server-1.46-app.tar.gz

Удаляем скачанный архив:

sudo rm scm-server-1.46-app.tar.gz

Запускаем SCM-Manager:

sudo /opt/scm-server/bin/scm-server start

На этом этом этапе сервис полностью функционален и готов к работе в своей базовой комплектации. Web-интерфейс доступен по адресу: localhost:8080. Логин и пароль администратора по умолчанию: scmadmin. Но продолжим настройку.

2. Делаем автозагрузку SCM-Manager


Создаем файл /etc/init.d/scmserver:

sudo mcedit /etc/init.d/scmserver

Вписываем в созданный файл следующее:

#!/bin/sh

### BEGIN INIT INFO
# Provides: sscmserver
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Seapine Surround SCM Server
# Description: SCM Server init file
### END INIT INFO

SCM_SERVER="*path_to_install_directory*/scm-server/bin/scm-server"

start() {
"$SCM_SERVER" start
}

stop() {
"$SCM_SERVER" stop
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 2
esac

Поправим права что бы файл был исполняемым:

sudo chmod 755 /etc/init.d/scmserver

Добавляем в автозагрузку:

sudo update-rc.d scmserver defaults

3. Перенос сервиса на другой порт


По умолчанию web-интерфейс доступен по http на порту 8080. Для смены необходимо сделать следующее.

Редактируем serrver-config.xml:

sudo mcedit /***path_to_install_directory***/scm-server/conf/server-config.xml

Ищем раздел:

<set name="port">
  <systemproperty name="jetty.port" default="<b>8080</b>">
</systemproperty></set>

Меняем на нужный нам и перегружаем сервис:

sudo /etc/init.d/scmserver restart

4. Добавляем SSL


# Перейдем в каталог с конфигом:

cd /***path_to_install_directory***/scm-server/conf/

Генерируем сертификат на 1 год:

sudo keytool -genkey -alias scm -validity 365 -keyalg RSA -keystore keystore.jks

Редактируем конфиг:

sudo mcedit /***path_to_install_directory***/scm-server/conf/server-config.xml

Раскоментируем строки SSL-коннектора и укажем пароль (вместо *password*) для хранилища ключа что мы вписывали создавая его, порт на котором он будет слушать SSL («Port»), а так же укажем местоположение хранилища ключей:

<Call name="addConnector">
  <Arg>
    <New class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
       <Arg>
       <!--
       Exclude SSLv3 to avoid POODLE vulnerability.
       See https://groups.google.com/d/msg/scmmanager/sX_Ydy-wAPA/-Dvs5i7RHtQJ
        -->
         <New class="org.eclipse.jetty.http.ssl.SslContextFactory">
           <Set name="excludeProtocols">
             <Array type="java.lang.String">
               <Item>SSLv2Hello</Item>
               <Item>SSLv3</Item>
             </Array>
           </Set>
         </New>
      </Arg>
      <Set name="Port"><b>443</b></Set>
      <Set name="maxIdleTime">30000</Set>
      <Set name="keystore"><SystemProperty name="basedir" default="." />/conf/keystore.jks</Set>
      <Set name="password">***password***</Set>
      <Set name="keyPassword"><b>***password***</Set>
      <Set name="truststore"><SystemProperty name="basedir" default="." />/conf/keystore.jks</Set>
      <Set name="trustPassword">***password***</Set>
    </New>
  </Arg>
</Call>

Смотрим fingerprints если нужно:

keytool -list -keystore keystore.jks

В процессе настройки SSL столкнулся с проблемой что при пушах через ssl — сервер упрямо ругался на SSL и не хотел пушить, дело оказалось в том что в Python 2.7.9 и позже версии включили по умолчанию запрет на самоподписанные сертификаты. Что бы отключить данную опцию редактируем файл:

sudo mcedit /usr/lib/python2.7/ssl.py

Меняем _create_default_https_context = create_default_context на _create_default_https_context = _create_unverified_context.

Перегружаем сервис для применения изменений:

sudo /etc/init.d/scmserver restart

На этом настройка через консоль завершена и дальше настройка продолжится через web-интерфейс.

5. Настройка SCM-Manager через web-интерфейс


Заходим в web-интерфейс localhost:8080. Убрать анонимный доступ и сменить пароль на встроенного администратора. В web-интерфейсе перейдите в «Security» — «Users» —> удалите пользователя «anonymous» —> измените пароль пользователя «scmadmin».

Установка плагинов для авторизации через AD, отправки почты, отправки уведомлений о пушах. В web-интерфейсе перейдите в «Config» — «Plugins»:

Для авторизации через AD установите: «scm-auth-ldap-plugin»
Для отправки почты установите: «scm-mail-plugin»
Для уведомлений о пушах установите: «scm-notify-plugin»

Установка плагина для просмотра активности в репозиториях через web-интерфейс:

В web-интерфейсе перейдите в «Config» — «Plugins»
Установите плагин: «scm-activity-plugin»

Для окончания установки плагинов перегрузите сервис:

sudo /etc/init.d/scmserver restart

Конфигурация плагина «LDAP Authentication». В web-интерфейсе перейдите в «Config» — «General» — Section «LDAP Authentication».

Profile: «ActiveDirectory»
Base DN: пусть к OU с пользователями для авторизации
Connection DN: пользователь для авторизации SCM-Manager в AD
Connection Password: (Пароль пользователя для авторизации SCM-Manager в AD)
Host URL: ip и порт контроллера домена
Enable nester ad groups: no
Use StartTLS: no (Включить\выключить шифрование при коннекте к AD)
Enable: yes (Включить\выключить плугин)

После внесения настроек нажать для их сохранения кнопку «Save». Можно после внесения настроек протестировать настройки кнопкой «Test Connection». Теперь любой доменный пользователь из указанной OU может залогиниться. Но при этом у него по умолчанию нет прав никуда и он не сможет увидеть ни один репозиторий. Нужно администратору дать доступ пользователя добавив его в acces-list репозитория или в группу которой дан доступ в необходимые репозитории.

Конфигурация плагина по отправке почты: в web-интерфейсе перейдите в «Config» — «General» — Section «Mail configuration».

Установить следующие параметры:

Host: адрес SMTP-сервера
Port: порт SMTP-сервера
Username: имя пользователя для авторизации на SMTP-сервере
Password: пароль пользователя для авторизации на SMTP-сервере
From: от кого будет исходить письмо
Transport Strategy: SMTP_PLAIN (Передача пароля открытым типом)
Subject Prefix: (что будет вставляться в начале темы письма)

Можно протестировать внесенные настройки кнопкой «Test Configuration».

Изменить расположение репозиториев на сервере: в web-интерфейсе перейдите в «Config» — «Repository Types».

В разделах для SVN, Mercurial, Git написать свой путь в строках «Repository directory».

Создание репозиториев: в web-интерфейсе перейдите в «Main» — «Repositories», нажать «Add». В поле «Name» указать название репозитория, в поле «Type» выбрать тип репозитория.

Настройка почтовых push-уведомлений для репозиториев: в web-интерфейсе перейдите в «Main» — «Repositories», выделите репозиторий, где нужно настроить почтовые push-уведомления, снизу появятся закладки, перейдите в закладку «Notification» и заполните:

Notify Repository Contact: no
Use Author as From Address: no
Email per Push: no
Maximum Diff Lines: 1000 (максимальное количество строк в письме в которых будут показаны изменения внесенные в файлы репозитория)

Добавте почтовый адрес на который будут приходить уведомления нажав на кнопку «Add». Сохраните внесенные изменения нажав кнопку «Ok».

На этом настройка конфигурации сервера по заданным условиям окончена и сервис готов к использованию. SCM-Server позволяет импортировать репозитории с одним ограничением — он не умеет импортировать репозитории из мест где нужна авторизация.

Комментарии (3)


  1. script88
    17.03.2016 10:56

    Скажите пожалуйста, чем данный продукт лучше или хуже своих конкурентов?


    1. bibliary
      17.03.2016 11:01

      Моё субъективное мнение — юзабилити у него для меня лучше, нотификейшины из коробки сделаны полные. Плох тем что он на Jave написан и если я вот хочу поменять структуру нотификейшенов на почту — это достаточный геморой ибо плугин не имеет таких настроек и нужно лезть в сорцы.


  1. Godless
    17.03.2016 20:02
    -1

    где то в сети есть место с готовыми .deb пакетами. Простите, с телефона не найду. и да, там крайние версии.