Как я могу заставить capistrano дождаться запуска службы на всех серверах, прежде чем продолжить? - PullRequest
4 голосов
/ 03 ноября 2011

Мы делаем наши развертывания с Capistrano.Наш веб-сайт состоит из интерфейса rails и бэкэнда java API.

У меня есть ситуация, когда запуск приложения java API занимает около 15 минут, а приложение rails не может работать без него.Сначала я попытался выполнить цикл внутри Capistrano, используя команду захвата, чтобы дождаться, пока приложение не начнет прослушивать порт (в нашем случае 8080):

desc "Start api"
task :api, :roles => :api do
  run("cd #{home_api} && ./api.sh start > /dev/null 2>&1 &")
  sleep 1
  api_status = nil
  until api_status
    api_status = capture("echo `netstat -tln | grep 8080`")
    sleep 60
  end
  puts "API Started successfully."
end

Однако захват выполняется только на одном сервере (у нас есть несколько машин API), и если тот завершает запуск до того, как другие начнут развертывание, прежде чем все машины API будут готовы.

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

1 Ответ

4 голосов
/ 03 ноября 2011

Вот как я сейчас это делаю:

Использование 'run' для выполнения некоторых команд оболочки, которые не будут возвращаться до тех пор, пока порт не будет открыт (или в этом случае пройдет 30 минут). Это будет выполняться на всех соответствующих серверах и продолжаться до тех пор, пока все их завершили.

desc "Start api"
task :api, :roles => :api do
  run("cd #{home_api} && ./api.sh start > /dev/null 2>&1 &")
  sleep 1
  run("for i in {0..60}; do echo \"Waiting for API to start\"; if [[ \"\" != \"$\(netstat -an |grep 8080\)\" ]]; then break; fi; sleep 30; done")
end

Мне любопытно посмотреть, как другие люди делают это, наверняка есть лучший способ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...