{"meta":{"title":"Доставка развертываний","intro":"С помощью REST API развертывания можно создавать пользовательские средства для взаимодействия с сервером и сторонним приложением.","product":"REST API","breadcrumbs":[{"href":"/ru/enterprise-server@3.21/rest","title":"REST API"},{"href":"/ru/enterprise-server@3.21/rest/guides","title":"Guides"},{"href":"/ru/enterprise-server@3.21/rest/guides/delivering-deployments","title":"Доставка развертываний"}],"documentType":"article"},"body":"# Доставка развертываний\n\nС помощью REST API развертывания можно создавать пользовательские средства для взаимодействия с сервером и сторонним приложением.\n\nRest API можно использовать для развертывания проектов, размещенных на GitHub сервере, на котором вы владеете. Дополнительные сведения о конечных точках для управления развертываниями и состояниями см. в разделе [Конечные точки REST API для развертываний](/ru/enterprise-server@3.21/rest/deployments). Вы также можете использовать REST API для координации развертываний в момент, когда код приземляется на ветвь по умолчанию. Дополнительные сведения см. в разделе [Создание сервера непрерывной интеграции](/ru/enterprise-server@3.21/rest/guides/building-a-ci-server).\n\nВ этом руководстве будет использоваться REST API для демонстрации настройки, которую можно использовать.\nВ описываемом сценарии мы выполним указанные ниже действия.\n\n* Выполним слияние запроса на вытягивание.\n* По завершении непрерывной интеграции мы зададим соответствующее состояние запроса на вытягивание.\n* После слияния запроса на вытягивание мы запустим развертывание на нашем сервере.\n\nСистема непрерывной интеграции и сервер размещения будут вымышленными. Это может быть Heroku, Amazon или что-то совершенно иное. Основная цель этого руководства — настроить сервер, управляющий взаимодействием.\n\nЕсли вы еще не сделали этого, обязательно `ngrok`[](https://ngrok.com/) и узнайте, как [его](https://ngrok.com/docs/getting-started/) использовать. Мы считаем, что это очень полезное средство для предоставления локальных приложений в Интернете.\n\nПримечание. Полный исходный код для этого проекта можно скачать из [репозитория platform-samples](https://github.com/github/platform-samples/tree/master/api/ruby/delivering-deployments).\n\n## Создание сервера\n\nМы создадим небольшое приложение Sinatra, чтобы подтвердить работоспособность локальных подключений.\nНачнем с этого:\n\n```ruby\nrequire 'sinatra'\nrequire 'json'\n\npost '/event_handler' do\n  payload = JSON.parse(params[:payload])\n  \"Well, it worked!\"\nend\n```\n\n(Если вы не знакомы с тем, как работает Sinatra, рекомендуем [ознакомиться с руководством по Sinatra](http://www.sinatrarb.com/).)\n\nЗапустите этот сервер. По умолчанию Sinatra начинается с порта `4567`, поэтому вы также хотите настроить `ngrok` для этого прослушивание.\n\nЧтобы этот сервер работал, необходимо настроить репозиторий с веб-перехватчиком. Веб-перехватчик должен быть настроен так, чтобы он активировался каждый раз при создании или слиянии запроса на вытягивание.\n\nДавайте создадим репозиторий, с которым можно спокойно экспериментировать. Мы предлагаем [репозиторий @octocat Spoon/Knife](https://github.com/octocat/Spoon-Knife).\n\nПосле этого вы создадите в репозитории новый веб-перехватчик, задав URL-адрес, `ngrok` который дал вам, и выберите `application/x-www-form-urlencoded` тип контента.\n\nЩелкните **Обновить веб-перехватчик**. Вы должны увидеть текст ответа `Well, it worked!`.\nОтлично! Установите переключатель в положение **Разрешить мне выбрать отдельные события** и выберите следующее:\n\n* Развертывание\n* Состояния развертывания\n* Запрос на вытягивание\n\nЭто события GitHub , которые будут отправляться на наш сервер всякий раз, когда происходит соответствующее действие. Пока мы настроим сервер так, чтобы он обрабатывал *только* слияния запросов на вытягивание:\n\n```ruby\npost '/event_handler' do\n  @payload = JSON.parse(params[:payload])\n\n  case request.env['HTTP_X_GITHUB_EVENT']\n  when \"pull_request\"\n    if @payload[\"action\"] == \"closed\" && @payload[\"pull_request\"][\"merged\"]\n      puts \"A pull request was merged! A deployment should start now...\"\n    end\n  end\nend\n```\n\nПочему? Каждое событие, GitHub которое отправляет присоединенный `X-GitHub-Event` заголовок HTTP. Пока нас интересуют только события, связанные с запросами на вытягивание. При слиянии запроса на вытягивание (состояние `closed`, `merged` имеет значение `true`) запускается развертывание.\n\nЧтобы проверить этот эксперимент, внесите какие-нибудь изменения в ветвь тестового репозитория, откройте запрос на вытягивание и выполните его слияние. Ваш сервер должен вернуть соответствующий ответ.\n\n## Работа с развертываниями\n\nРеализовав сервер, проверив код и выполнив слияние запроса на вытягивание, теперь мы хотим развернуть проект.\n\nСначала мы изменим прослушиватель событий для обработки запросов на вытягивание при их слиянии и приступим к развертыванию:\n\n```ruby\nwhen \"pull_request\"\n  if @payload[\"action\"] == \"closed\" && @payload[\"pull_request\"][\"merged\"]\n    start_deployment(@payload[\"pull_request\"])\n  end\nwhen \"deployment\"\n  process_deployment(@payload)\nwhen \"deployment_status\"\n  update_deployment_status\nend\n```\n\nНа основе сведений из запроса на вытягивание мы начнем заполнять метод `start_deployment`:\n\n```ruby\ndef start_deployment(pull_request)\n  user = pull_request['user']['login']\n  payload = JSON.generate(:environment => 'production', :deploy_user => user)\n  @client.create_deployment(pull_request['head']['repo']['full_name'], pull_request['head']['sha'], {:payload => payload, :description => \"Deploying my sweet branch\"})\nend\n```\n\nРазвертывания могут сопровождаться метаданными в виде `payload` и `description`. Хотя эти значения являются необязательными, они полезны для ведения журнала и представления сведений.\n\nПри создании нового развертывания активируется отдельное событие. Вот почему нужен новый случай `switch` в обработчике событий `deployment`. Эти сведения можно использовать для получения уведомления об активации развертывания.\n\nРазвертывания могут занимать довольно много времени, поэтому необходимо прослушивать различные события, например создание развертывания и изменение его состояния.\n\nДавайте сымитируем развертывание, которое выполняет некоторые действия, и посмотрим, какое влияние оно оказывает на выходные данные. Сначала завершим метод `process_deployment`:\n\n```ruby\ndef process_deployment\n  payload = JSON.parse(@payload['payload'])\n  # you can send this information to your chat room, monitor, pager, etc.\n  puts \"Processing '#{@payload['description']}' for #{payload['deploy_user']} to #{payload['environment']}\"\n  sleep 2 # simulate work\n  @client.create_deployment_status(\"repos/#{@payload['repository']['full_name']}/deployments/#{@payload['id']}\", 'pending')\n  sleep 2 # simulate work\n  @client.create_deployment_status(\"repos/#{@payload['repository']['full_name']}/deployments/#{@payload['id']}\", 'success')\nend\n```\n\nНаконец, сымитируем сохранение сведений о состоянии путем вывода их в консоли:\n\n```ruby\ndef update_deployment_status\n  puts \"Deployment status for #{@payload['id']} is #{@payload['state']}\"\nend\n```\n\nДавайте разберемся, что происходит. Развертывание создается методом `start_deployment`, который активирует событие `deployment`. Далее мы вызываем метод `process_deployment`, который имитирует выполнение некоторых задач. Во время этой обработки мы также вызываем `create_deployment_status`, чтобы получатель мог узнать, что происходит, когда состояние переведено в `pending`.\n\nПосле завершения развертывания задается состояние `success`.\n\n## Заключение\n\nВ GitHub мы уже много лет используем версию `Heaven` для управления нашими развертываниями. Процесс в целом такой же, как и в случае с созданным выше сервером.\n\n* Ожидается ответ о состоянии проверок непрерывной интеграции (успешно или сбой).\n* Если необходимые проверки пройдены успешно, выполняется слияние запроса на вытягивание.\n* `Heaven` берёт объединённый код и развёртает его на серверы staging и production\n* Тем временем `Heaven` мы также уведомляем всех о сборке через [Hubot](https://github.com/github/hubot) , который находится в наших чатах\n\nВот и все! Чтобы использовать этот пример, не нужно создавать собственную конфигурацию развертывания.\nВсегда можно положиться на интеграции [GitHub ](https://github.com/integrations)."}