Подводный камень при работе с BitBucket

В проектах над которыми я работаю, для обеспечения непрерывной интеграции используется TeamCity. Вчера вечером от TeamCity начали приходить отчеты о том, что ему не удается вытянуть изменения из репозитория проекта (там используется Mercurial, который предоставляется сервисом BitBucket).

Ошибки выглядели следующим образом:

Failed to collect changes, error: 'hg --config ui.interactive=False pull https://{username}@bitbucket.org/{username}/{project}' command failed.
stderr: abort: HTTP Error 400: Bad request

Обратите внимание, что для получения изменений с сервера используется протокол https://, при использовании которого как оказалось сталкиваешься с ограничением на большое количество данных, отправляемых в заголовке запросов (из-за большого числа heads в системе контроля версий). Как объясняют ребята из BitBucket - они могут увеличить эти лимиты, но с ростом проекта ты снова и снова будешь в них упираться.

Для решения данной проблемы необходимо использовать ssh:// протокол со всеми вытекающими отсюда последствиями. Полный URL для использования ssh://hg@bitbucket.org/{username}/{project}

Напомню, что генерация ключей в *nix подобных системах происходит через ssh-keygen, а в Windows с использованием PuTTYgen

Для тех, кто не понимает как это делается напишу немного подробнее:

  • Генерируем файлы с ключами
  • Загружаем приватный ключ на сервер, с которого будет использоваться hg
  • Загружаем публичную версию ключа на BitBucket (это тот, который имеет расширение .pub)
  • Пробуем соединиться с сервером
  • У нас ничего не получается, т.к. на ключ установлен пароль (что вообще нормально, но TeamCity 8.1.2 не поддерживает SSH ключи для Mercurial из коробки), поэтому убираем пароль с приватного ключа через ssh-keygen -p
  • Радуемся жизни и непрерывной интеграции