Bitriseを使い、最小限の労力でDanger + ktlintをGithubと連携させる(on Danger step, ktlint-gradle)

# はじめに
Bitriseはモバイルアプリに特化したCIサービスです。
存在自体は知っていたのですが、歳のせいか新しいサービスを導入するのに億劫になってきていました。
ですが、先日勉強会で使い方を見てあまりの便利さに衝撃を受けたので早速Androidアプリで使うことにしました！

今回はGithub Pull RequestsでDanger + ktlintできる環境を作ってみます。

サンプルはこちらに置いときました。
https://github.com/tarumzu/OCRSampleAndroid

# Dangerの設定
まずはDanger導入用にGemfileをプロジェクトルートに配置します。この設定は後述するBitriseのon Dangerステップで必要です。

```ruby:Gemfile
source "https://rubygems.org"

gem "danger"
gem "danger-checkstyle_format"
```

次に、同じくプロジェクトルートにDangerfileを配置します。

```
github.dismiss_out_of_range_messages

# Ignore inline messages which lay outside a diff's range of PR
github.dismiss_out_of_range_messages

# Make it more obvious that a PR is a work in progress and shouldn't be merged yet
warn("PR is classed as Work in Progress") if github.pr_title.include? "[WIP]"

# ktlint
checkstyle_format.base_path = Dir.pwd
checkstyle_format.report 'app/build/reports/ktlint/ktlintMainSourceSetCheck.xml'
```

# ktlintの設定
次にktlintです。今回はktlint-gradleプラグインを利用します。

```gradle:build.gradle.kts
buildscript {

    repositories {
        // 略
        maven(url = "https://plugins.gradle.org/m2/")
    }
    dependencies {
        // 略
        classpath("org.jlleitschuh.gradle:ktlint-gradle:8.0.0")

    }
}

```

```gradle:app/build.gradle.kts
plugins {
    id("org.jlleitschuh.gradle.ktlint")
}
// 略
ktlint {
    version.set("0.31.0")
    android.set(true)
    reporters.set(setOf(ReporterType.CHECKSTYLE))
    ignoreFailures.set(true) // NOTE: エラーで中断させないための設定
}
```

# Bitriseの設定
Bitrise側の設定はとても簡単です。
まずはサインアップ、サインイン後、CI/CDしたいプロジェクトを`Add New App`からCI/CDしたいアプリを追加します。
リポジトリはGitHub、Bitbucket、GitLab等から選択できます。今回はGitHubを前提に説明します。
<img width="50%" alt="スクリーンショット 2019-06-04 14.40.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106116/592ef89d-0ca1-2e1b-8e92-054f89289a11.png">


追加したら、そのアプリのワークフローを開きます。今回つかうステップは下記の４つです。Activate SSH key、Git Clone Repositoryは最初から追加されているのでそのまま使い、それ以外を削除して新たに`Gradle Runner`、`Run Danger`ステップを追加します。
<img width="70%" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106116/b613c541-6ec1-5cf1-4a90-616614a9ad9a.png">



続いてGradle Runnerをクリックし、`Config`を開いて各項目に下記を入力します。ktlintCheckさせるのに必要です。
<img width="70%" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106116/7ba76071-8be7-eecd-614e-f8c812e39a59.png">

|Gradle task to run |gradlew file path |
|---|---|
|assembleDebug ktlintCheck|./gradlew|


続いてRun DangerをクリックしてGithubを開きます。`Access token for your project`にGithubのアクセストークンを設定してあげます。
Githubのアクセストークン作成用リンクは[こちら](https://github.com/settings/tokens/new)。
アクセストークンの権限は、プライベートリポジトリに対してCI/CDを実行したい場合は`repo`、パブリックリポジトリに対して実行したい場合は`public_repo`にチェックを入れて作成します。
<img width="50%" alt="スクリーンショット 2019-06-04 14.57.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106116/bf7a847c-1f6b-5f0a-5524-e5dd8b2e9c62.png">

アクセストークンをBitriseに設定してあげる際、`Expose for Pull Requests`にチェックを入れてあげてください。入れてあげないとプルリクエストでSecretの値が読み込めません。
<img width="50%" alt="スクリーンショット 2019-06-04 15.07.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106116/2044e567-2fec-769a-d817-31318249affb.png">

最後にトリガーの設定です。PULL REQUESTでTARGET BRANCHがmasterの場合に発火するように設定してあげます。
<img width="70%" alt="スクリーンショット 2019-06-04 15.07.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106116/17db3a88-62e1-c059-ba5f-42fcfa665f80.png">

以上ですべて設定できました。画面右上のsaveボタンを押して保存し、早速プルリクエスト送ってると…

<img width="70%" alt="スクリーンショット 2019-06-04 15.13.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106116/66c7c351-6da0-da12-edb4-edbb999aec8f.png">

無事、プルリクにDangerのコメントが追記されました！

# 最後に
他のCIサービスに比べると非常に簡単にDangerを導入することができます。Danger以外にもtestなどのステップも充実していますし、もちろん、他のサービスと同様に設定ファイル（bitrise.yml）で構築する事もできます。
ぜひ皆さんもBitrise使ってみてください！


# 参考
大変参考になりました。@kafumiさんありがとうございます！
https://qiita.com/kafumi/items/1a9f59d6f845808604df