読者です 読者をやめる 読者になる 読者になる

@Konboi memo

主に技術に関してつらつらと。

pull request builder plugin を使わずgithub上にテストの結果を表示する

はじめに

現在のプロジェクトではJenkinsを使ってCIを行っています。 当初ビルドのタイミングはポーリングで行っていました。 しかしポーリングだと再度ビルドを走らせる必要がある時に空コミットする必要があったり、jenkinsのrebuild pluginを追加しポチポチしてビルドする必要がありました。

段々と億劫になり今は、Githubweb hookGithub::Hooks::Reciverというhook server経由でjenkinsのjobを実行するようにしました。

jenkins側の設定でbranchをパラメータとして渡せるようにして置くことで任意のbranchを指定してjobを実行できるようにしてあります。

と説明が長くなりましたが、今回はそのjobの実行結果をtarvis ciを連携したときのようにbuildの結果をgithubにも表示するようにしましたのでその方法をメモしておきます。

結果こんな感じに表示されるようになりました。

img

どうやったのか

説明したような仕組みでjenkinsのjobを回しているので結果を表示するためだけにpull request builder plugin を入れて設定するのは大分面倒だなと思って、何かないか色々調べていました。

調べていると以下の記事が見つかった

Githubのpull requestページに、テスト結果を表示するJenkinsの設定

この記事によると GithubCommit Status API を使えば実現出来そうということがわかったのでやってみました。

以下の様なscriptを用意しjenkinsのPost build task で実行してあげればpull request の最後のcommitのステータスを設定してくれます。

 use 5.018;
 use warnings;
 use strict;
 use FindBin::libs;

 use Furl;
 use Git::Repository;
 use JSON::XS;
 use Pithub;
 use Sub::Retry qw/retry/;

 {
     my $repo_user = ‘sample-user-name’;
     my $repo_name = ‘sample-repo-name’;
     my $git       = Git::Repository->new(work_tree => ‘project/dir/path’);
     my $sha       = $git->run('log', '-n', '1', '--pretty=format:%H');

     my $state = {
         'SUCCESS' => {
             state       => 'success',
             description => 'ぐっ!! (๑•̀ᄇ•́)و✧',
         },
         'UNSTABLE' => {
             state       => 'error',
             description => 'アタフタ ヘ( ̄□ ̄;)ノ ヽ(; ̄□ ̄)ヘ アタフタ',
         },
     };

     my $url  = $ENV{BUILD_URL};
     my $furl = Furl->new;
     my $json = retry 3, 5 => sub {
         my $res = $furl->get( "$url/api/json?tree=result" );
         decode_json $res->content;
     };
     my $result = $json->{result};

     exit(0) unless $state->{$result};

     my $ph = Pithub->new(
         token => ‘GITHUB_API_TOKEN’
     );
     $result = $ph->repos->statuses->create(
         user => $repo_user,
         repo => $repo_name,
         sha  => $sha,
         data => {
             state       => $state->{$result}{state},
             description => $state->{$result}{description},
             target_url  => $url,
         }
     );
 }

ぐっ!! (๑•̀ᄇ•́)و✧

まとめ

ステータスが出るようになってめでたしめでたし。