Потеря связи во время непрерывной интеграции

Я использую капли DigitalOcean для непрерывной интеграции.

Каждый раз, когда кто-то что-то помещает в наш репозиторий Github, создается капля. Затем Дженкинс (на отдельной капле) подключается через ssh к вновь созданной капле и запускает сценарий оболочки, который построит и протестирует проект.

Изменения Github -> Jenkins (на капле A) -> Сборка / тесты (на новой капле X)

Изменения Github -> Jenkins (на капле A) -> Сборка / тесты (на новой капле Y)

Изменения Github -> Jenkins (на капле A) -> Сборка / тесты (на новой капле Z)

Проблема в том, что случайно созданная капля теряет связь с тем, к чему она пыталась подключиться во время сборки. Например, 2 из 10 капель с одинаковым содержимым завершатся ошибкой во время выполнения команды "git pull" с таким сообщением:

"ssh: connect to host github.com port 22: Connection timed out"

or

"[ComposerDownloaderTransportException] The "https://api.github.com/repos/symfony/symfony/zipball/d3646cc6875c214d211001e0673ec9e91b5f2da7" file could not be downloaded: failed to open stream: Connection timed out "

Нет правил iptables, и UFW не включен для этих капель. Что могло случайно заблокировать подключение к этим сервисам?

Какие-либо предложения ?

[РЕДАКТИРОВАТЬ]

Чтобы уточнить

  • Это произошло случайным образом во время сборки, первая команда «git clone» могла быть успешной, но другая «git clone» могла потерпеть неудачу через 2 минуты после этого.

person Cédric Merouani    schedule 27.01.2016    source источник


Ответы (1)


Я столкнулся с такими же проблемами с моими репозиториями git. Я создал сценарий, чтобы попытаться выполнить максимум 5 раз, если какая-либо команда git не удалась.

Ниже мой скрипт git_retry.
Пример:

git_retry clone <clone_url>

Сценарий:

#!/bin/bash

MAX_RETRY_COUNTER=5
RETRY_SLEEP=10

try_number=0

while ! git $@
do
  if try_number=`expr $try_number + 1` && [ "$try_number" -lt $MAX_RETRY_COUNTER ];
  then
    echo "Warning: Issue during git operation. Try $try_number. Retrying in $RETRY_SLEEP seconds..."
    sleep $RETRY_SLEEP
    echo
  else
    echo "Error: Issue during git operation. Try $try_number..."
    echo
    exit 1
  fi
done
person Nikhil Gupta    schedule 28.01.2016
comment
Спасибо за ваше предложение. Но я уже делал нечто подобное, и это хорошо работает для команды, которую я вызываю вручную. К сожалению, проблема остается, потому что я не вызываю github ни сам, ни в shell-скрипте. Например, иногда это происходит во время установки композитора в проекте Symfony2, но я не могу инкапсулировать эту команду в процесс цикла повтора. - person Cédric Merouani; 28.01.2016