В первой части нашей серии мы говорили об API Github и создавали демонстрацию в процессе. В этой части мы собираемся исследовать API Webhooks и создадим демонстрацию, чтобы продемонстрировать использование API. Давайте начнем.
Что мы строим
В этой статье мы собираемся настроить демо, которое получает каждый пуш от Github и сохраняет его в базе данных. Мы также собираемся создать страницу для отображения списка наших коммиттеров репозитория, упорядоченных по количеству коммитов. Вы можете проверить окончательный результат на Github .
Настройка среды
Мы будем использовать Laravel 5 в качестве нашей среды, и поскольку наше приложение должно быть доступно из Интернета для работы с Github Webhooks, мы можем использовать Heroku для размещения нашего кода. Вы можете проверить этот пост, чтобы начать работу с Heroku.
конфигурация
Добавление Mysql
После создания нашего приложения на Heroku нам нужно добавить MySQL для хранения полученных данных.
heroku addons:add cleardb
Вы можете перейти на панель инструментов, чтобы получить учетные данные для подключения к базе данных. Установите необходимые переменные внутри вашей конфигурации, как вы можете видеть в примере ниже.
 MYSQL_HOST=‘HOST’
MYSQL_DATABASE=‘DB’
MYSQL_USERNAME=‘USERNAME’
MYSQL_PASSWORD=‘PASSWORD’
Зарегистрироваться Github Hooks
  Чтобы зарегистрировать новый хук, перейдите в репозиторий внутри своей учетной записи, затем перейдите на вкладку настроек и выберите Webhooks & Services 
После настройки конечной точки URL-адреса приложения для получения полезной нагрузки вы можете установить секретный ключ для отправки вместе с полезной нагрузкой для проверки источника запроса. По умолчанию Github будет отправлять вам только push-события, но вы можете выбрать отдельные события из списка. Для нашей демонстрации достаточно push-события.
Создание демо
Создание таблиц базы данных
 php artisan make:migration create_hooks_table
 // database/migrations/XXX_create_hooks_table.php
class CreateHooksTable extends Migration
{
  public function up()
  {
    Schema::create('hooks', function (Blueprint $table) {
      $table->increments('id');
      $table->string('event_name', 100);
      //you can separate the sender, repo...etc. but let's just keep it simple
      $table->text('payload');
      $table->timestamps();
    });
  }
  public function down()
  {
    Schema::drop('hooks');
  }
}
  Нам нужна только таблица hooks  Регистрация event_name 
  Поле полезной нагрузки содержит тело запроса.  Вы можете разбить это поле на несколько частей и создать отправителя, репозиторий, список коммитов и т. Д. 
  После запуска миграции с использованием php artisan migrateHook 
 // app/Hook.php
class Hook extends Model
{
  protected $table = ‘hooks’;
}
Создание маршрутов
Наше демо-приложение будет иметь только два маршрута.
-   маршрут 
events -   
/report/contributions 
 // app/Http/routes.php
Route::post(‘/events’, [‘uses’ => ‘GithubController@storeEvents’]);
 // app/Http/Controllers/GithubController.php
public function storeEvents(Request $request) {
  $event_name = $request->header(‘X-Github-Event’);
  $body = json_encode(Input::all());
  $hook = new Hook;
  $hook->event_name = $event_name;
  $hook->payload = $body;
  $hook->save();
  return ‘’;// 200 OK
}
  Значение заголовка X-Github-Event  В этом случае он будет равен push  Если вы хотите проверить источник запроса, используя секретный ключ, который вы предоставили ранее на Github, вы можете использовать значение заголовка X-Hub-Signature  Вы можете прочитать больше в документации . 
  Github отправит вам запрос почти в реальном времени.  Если вы используете Heroku для развертывания, вы можете использовать регистратор для мониторинга запросов во время тестирования.  Вы можете прочитать больше об этом в документации .  Вы также можете перейти к своей конфигурации Webhook на Github и прокрутить до вкладки « Recent Deliveries 
 heroku logs —tail -n 0 —ps router
Для отображения списка участников я собираюсь использовать JavaScript-библиотеку ChartJs . Вы можете проверить это руководство по началу работы для хорошего вступления.
 // app/Http/routes.php
Route::get(‘/reports/contributions.json’, [‘uses’ => ‘GithubController@contributionsJson’]);
 // app/Http/Controllers/GithubController.php
public function contributionsJson()
{
  $hooks = Hook::where('event_name', '=', 'push')->get(['payload']);
  $users = [];
  $hooks->each(function ($item) use (&$users) {
    $item = json_decode($item['payload']);
    $pusherName = $item->pusher->name;
    $commitsCount = count($item->commits);
    $users[$pusherName] = array_pull($users, $pusherName, 0) + $commitsCount;
  });
  return [
      'users'   => array_keys($users),
      'commits' => array_values($users)
  ];
}
  Маршрут /reports/contributions.json  Затем мы возвращаем список пользователей и фиксируем их отдельно, чтобы удовлетворить потребности библиотеки.  Тем не менее, вы также можете сделать это во внешнем интерфейсе, используя некоторый Javascript. 
 // app/Http/routes.php
Route::get(‘/reports/contributions’, [‘uses’ => ‘GithubController@contributions’]);
 // app//Http/Contrllers/GithubController.php
public function contributions()
{
  
  return View::make('reports.contributions');
}
 // resources/views/reports/contributions.blade.php
<canvas id=“contributions” width=“400” height=“400”></canvas>
<script>
    var ctx = document.getElementById(“contributions”).getContext(“2d”);
    $.ajax({
        url: “/reports/contributions.json”,
        dataType: “json”,
        type: “GET”,
        success: function(response){
            var data = {
                labels: response.users,
                datasets: [
                {
                    data: response.commits
                }]
            };
            new Chart(ctx).Bar(data, {});
        }
    });
</script>
  После получения данных от нашей конечной точки JSON мы создаем новый объект Chart  Вы можете прочитать больше о доступных опциях в документации . 
Вывод
Вот пример из реальной жизни — если вы когда-либо участвовали в проекте Symfony на Github, вы заметили, что когда вы отправляете запрос на извлечение, ваш код проверяется внешней службой с именем fabbot.io . Этот сервис следит за хранилищем для каждого нового запроса и проверяет ваш код. Вы можете посетить веб-сайт для получения дополнительной информации, а также вы можете зарегистрировать свой собственный репозиторий для проверки.
Github API может многое предложить, а документация позволяет легко начать работу. Я рекомендую вам проверить это. Кроме того, вы можете проверить окончательный результат на Github . И как всегда, если у вас есть какие-либо вопросы, не стесняйтесь размещать их ниже.



