Как подружить TeamCity Windows c Mercurial на BitBucket через SSH

Jun 18, 2013 01:49

Имеется Mercurial репозиторий на BitBucket. Имеется Windows TeamCity сервер. Ранее сервер работал с SVN репозиториями, после переезда проектов на Mercurial необходимо, чтобы TeamCity работал с Mercurial. Основная сложность состоит в том, чтобы все работало через SSH.
Итак начнем. Предположим, что на TeamCity сервере уже установлен PuTTY, добавлен в PATH и сгенерированы ключи.

1. Скачаем свежую версию Mercurial вместе с TortoiseHg и установим её на TeamCity сервер.

2. Добавим новый VCS типа Mercurial в TeamCity
В поле Pull Changes from вставим BitBucket Hg-SSH-адрес репозитория ssh://hg@bitbucket.org/username/projectname
и нажмем кнопку [Test connection]
TeamCity должна выдать ошибку, что Mercurial не нашёл ssh

3. Вместо ssh будем использовать plink.exe от PuTTY. Значит необходимо указать Mercurial где лежит плинк и где лежит ключ. Обычно это прописывается в файле mercurial.ini в папке в профиле пользователя. Но тут возникает сложность: пользователь TeamCity - аккаунт SYSTEM. У него нет обычной папки профиля в C:\Users\.

3.а Убедимся, что TeamCity действительно запущен от SYSTEM.
В командной строке Windows вызовем команду sc qc TeamCity, чтобы посмотреть подробности сервиса TeamCity

C:\inetpub\wwwroot\php\a>sc qc TeamCity
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: TeamCity
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : "c:\TeamCity\bin\TeamCityService.exe" jetservice "
settings=c:\TeamCity\conf\teamcity-server-service.xml" "/LogFile=c:\TeamCity\lo
s\teamcity-winservice.log"
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : TeamCity Server
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem

Тут нас интересует последняя строка SERVICE_START_NAME : LocalSystem.

3.б Вместо папки профиля для аккаунта SYSTEM OS Windows использует папку C:\Windows\System32\config\systemprofile.
На х64 системах для 32-битных программ это также может быть папка C:\Windows\SysWOW64\config\systemprofile
Предположим, что у нас x64 сервер и установлен х64-битная версия Mercurial. Это значит, что наш аккаунт SYSTEM будет искать конфигурации для x64-битной версии Mercurial в файле C:\Windows\System32\config\systemprofile\mercurial.ini
Туда надо поместить следующее:

[ui]
ssh = "C:\Program Files (x86)\PuTTY\plink.exe" -ssh -2 -batch -C -v -i c:\[path-to-key]\my_teamcity_private_key.ppk

3.в Теперь Mercurial знает что такое ssh. Можно протестировать, нажав кнопку [Test connection]. Однако работать это пока не будет и система выдаст ошибку что-то вроде "The server's host key is not cached in the registry."

4. На самом деле сообщение вида "The server's host key is not cached in the registry." не ошибка, а запрос пользователю от плинк на кеширование ключа. Но поскольку плинк запущен через TeamCity он не может задать этот вопрос пользователю интерактивно в консоли. Нам необходимо запустить плинк в консоли от акканту SYSTEM и подтвердить кеширование ключа.
Для этого нам понадобится замечательная утилита psExec от Марка Руссиновича. Скачиваем psExec и запускаем командную строку от аккаунта SYSTEM:
psexec.exe -s cmd.exe
Теперь в этой командной строке вызываем плинк до BitBucket
plink -agent -i c:\[path-to-key]\my_teamcity_private_key.ppk bitbucket.org
Подтверждаем кеширование "y"

Тут же можно проверить, что теперь Mercurial работает через ssh с помощью плинк:
C:\hg --config ui.interactive=False identify ssh://hg@bitbucket.org/user/project
xxxxxxxx

5. Снова тестируем соединение VCS в TeamCity и теперь все должно работать.

программирование, интеграция

Previous post Next post
Up