SiG Staff Blog

福井と金沢にある株式会社SIG 総合研究所で働きたい方、ご連絡ください。

BacklogでPR(Spring F/W)があったらJenkins(AWS)がコードレビューの一部をしてくれて、結果をSlackに通知してくれるようにする。~その7~

jenkinsの設定をする

jenkinsで各チェックが動くように設定をしていきます。

jenkinsにジョブを追加する。

1.jenkinsのダッシュボードを開く f:id:Bee_Flim:20180217164213p:plain

2.新しいジョブをクリックして、適当な名前を付けて”Mavenプロジェクトのビルド”を選択する。 f:id:Bee_Flim:20180217164218p:plain

Git、Mavenの設定をする。

1.[jenkinsの管理]->[Global Tool Configuration]を選択する。

2.Gitの所にエラーがないか確認する。

3.Mavenの所に、適当に名前を付けて自動インストールにチェックをする。*1

Slack連携の為に設定をする。

1.[jenkinsの管理]->[システムの設定]を選択する。 f:id:Bee_Flim:20180217164227p:plain

2.webhook設定の所に、slackのtokenキーを設定して、

3.endpointにslackのURLを指定する。”https://[チーム名].slack.com” f:id:Bee_Flim:20180217164223p:plain

ジョブの設定をする。

基本設定

  1. ダッシュボードに先ほど作ったジョブがあるので、選択する。
  2. 左のメニューにある[設定]を開く。
  3. プロジェクト名、説明を適当に設定する。
  4. Backlogにチェックを入れて、Backlog URLに"https://<スペースID>.backlog.jp/projects/<プロジェクトキー>"を設定する。
  5. ユーザー、パスワードはそのプロジェクトが見れるユーザーを指定する。(ブランクでも良い)
  6. APIキーには、前回Backlogの設定で取得したキーを設定する。 f:id:Bee_Flim:20180217164253p:plain

ソースコード管理の設定

  1. Gitを選択する。
  2. リポジトリURLにはbacklogのgitリポジトリを設定する。
  3. 認証情報の追加ボタンを押下して、種類に”ユーザー名とパスワード”を選択して、ユーザー名とパスワードにbacklogのアカウント情報を登録する。
  4. 認証情報に追加したアカウントが表示されるので、それを選択する。
  5. nulabさんのblog( Jenkins Backlog Pluginで、ビルド結果をプルリクエストに通知! | ヌーラボ )では、

    高度な設定 > Refspec : “+refs/pull/:refs/remotes/origin/pr/

を指定すると、プルリクエストが取れると書かれていたのですがプルリク時にうまく動かないので、その設定はブランクにしてビルドするブランチに**を指定することでプルリクエストがマージされたときに発動するようにしました。*2

pipelineの方には、プルリクエストを処理できるようになっているみたいで、今度試してみようと思います。

f:id:Bee_Flim:20180217164303p:plain

ビルドトリガの設定

  1. SCMをポーリングにチェックを入れます。 f:id:Bee_Flim:20180217164306p:plain

ビルド設定

  1. checkstyleやPMDなどのチェックを入れていく。
  2. 高度な設定を開いて、常に実行にチェックを入れる。
  3. 未解決タスクはテストコードを対象外にしたいので、パスを指定する。

f:id:Bee_Flim:20180217164309p:plain f:id:Bee_Flim:20180217164314p:plain f:id:Bee_Flim:20180217164317p:plain f:id:Bee_Flim:20180217164321p:plain f:id:Bee_Flim:20180217164324p:plain

ビルド後の処理

  1. JaCoCo、Slack Notification、Step Counterにチェックを入れる。
  2. Slack Notificationの高度な設定を開いて、"Team Subdomain"にチーム名を入れる。(”https://[チーム名].slack.com”のチーム名の部分)
  3. "Integration Token"にSlackのJenkinsCIで取得したトークンを設定する。
  4. "Project Channel"に通知をしたいchannelを指定する。
  5. 通知したいタイミングにチェックを入れる。
  6. Step Counterにはカウント対象のファイルを指定する。テストコードを除きたい場合は、除外するファイルパターンにテストコードのパスを指定する。 f:id:Bee_Flim:20180217164331p:plain f:id:Bee_Flim:20180217164341p:plain f:id:Bee_Flim:20180217164334p:plain

試してみる。

eclipseにテストコードを追加する。 f:id:Bee_Flim:20180217172130p:plain

こんな感じの適当な物を作成。

/*
 * ソースコード
 */
@SpringBootApplication
public class DemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

    public int addCalc(int x, int y) {
        return x + y;
    }

    public int minusCalc() {
      //FIXME テストを修正する事
      String bug = null;
      bug.toCharArray();
      return 1;
    }
  public void sample() {
    //Some thing
  }
}
/*
 * テストコード
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class DemoApplicationTests {

  @Autowired
  DemoApplication demo;

  @Test
  public void 加算の成功テスト() {
    assertEquals("成功", 3, demo.addCalc(1, 2));
  }

  @Test
  public void 加算の失敗テスト() {
    assertNotEquals("値が違う", 4, demo.addCalc(1, 2));
  }

  @Test
  public void 加算の失敗テスト2() {
    assertEquals("値が違う2", 4, demo.addCalc(1, 20));
  }

  @Test
  public void 加算の失敗テスト3() {
    assertEquals("値が違う3", 4, demo.addCalc(1, 20));
  }

}

Backlogにブランチをプッシュして、masterにプルリクエストを送信します。 そのあと、そのブランチをもう一度pushすると処理が走りました。

こんな感じで、実行結果が表示されました。 f:id:Bee_Flim:20180217164237p:plain

Slackにも通知が来るようになりました。 f:id:Bee_Flim:20180217172548p:plain

おわりに

一応、通知が来るようになったんですが、プルリクエストがあった時にチェックをしたいので、マージ時に実行されるのはいまいちですね。 デプロイする時にはこれでもよさそうな気がします。 pipelineを使うと、出来るようになるらしいので試してみます。

気になった事

ブランチをプッシュした後プルリクエストを送った後にそのブランチを更新しないと実行されないので、 実際の運用時に

”ブランチ作ったらとりあえずプッシュ、その後プルリクエストを送る前にプッシュしてもらう”

って運用が必要になるかと思いました。

*1:自分でmavenyumでインストー ルしてもOK。sudo yun install maven

*2:BacklogのWebHookの履歴を見ていると、プルリクエスト後のGitプッシュの通知でJenkinsのビルドが走っているようで、プルリクエスト前のGitプッシュでは実行されないので、なぜなのかWebHookの内容を見ていると送信している内容が少し違っていました。 ブランチをプッシュした後プルリクエストを送った後に、そのブランチを更新するとJenkinsが動き出したのでJenkins plug-inとWebHookの仕様が微妙にイケてないのかもしれない。