GithubとSlackとCircleCIとCodeClimateとci-bundle-updateでぼっち開発環境を作ってみた

先日公開した日本語解析API(+α)を使用して日本語の文書校正を効率化してみるにて、

と色々なツールを試してみたので、そのまとめを残したいと思います。

完成図

完成図

雑ですがアイキャッチ画像に書き足してみました。
Slackに通知を飛ばすのは書くまでもなく、矢印が煩雑になるだけなので割愛しました。

やりたいことは目次に分割しているので、1つずつお話したいと思います。

リポジトリを作る

大前提です。ちゃちゃっと作ってしまいます。
リポジトリの作成にはhubコマンドを使用しています。

cd /path/to/work
mkdir repo-name && cd repo-name
echo '# Repo name' > README.md
git init
git add README.md
git commit -m 'initial commit'
hub create
git push origin master
hub browse

ついでに連携する各サービスのアカウントも作成しておきます。

Githubの通知をSlackに送る

https://{slackのチーム名}.slack.com/services/new
を開くと、各種サービスとの連携ができます。

スクリーンショッ

Githubの設定を行います。
特に詰まることはなく、画面に従えば問題なく設定できるかと思います。

Pull Requestが来たらCircle CIのテストを走らせる

Circle CIは、テストを走らせたりデプロイしたりするCI系サービスです。 似たサービスとしてTravis CIWerckerがありますが、
それらは使ったことがあったので、今回は使ったこと無いCircle CIを使ってみました。

Circle CIにログインし、Githubに登録したリポジトリをCI対象として登録します。

そしてリポジトリにCircle CIの設定を行います。
ドキュメントはこちらです。

YAMLファイルでもRubyのバージョンを指定できるそうなのですが、.ruby-versionの方が汎用的かと思いそちらを使用しています。

git checkout -b feat/circle-ci
rbenv local 2.2.2
git add .ruby-version
git commit -m 'Add .ruby-version'
echo 'gem "rspec"' >> Gemfile
bundle install --path=vendor/bundle
git add Gemfile*
git commit -m 'Add rspec gem'
git push origin feat/circle-ci

連携が完了していると、pullリクエストを作成した時に以下のようになると思います。

スクリーンショッ

少し待って

スクリーンショッ

となればビルドに成功した、ということになります。

今後Circle CIとの連携を増やしていきますが、基本はこれです。
ビルドに通らない場合はだいたいが設定ミスです。

ついでにSlackとの連携も済ませておきます。

スクリーンショッ

masterにマージされたらCode climateのチェックを走らせる

Code climateはコードの静的解析ツールです。
連携しているGithubのリポジトリ内のコードに静的解析をかけ、問題が有れば指摘してくれます。
対応している言語はRuby, PHP, Python, jsです。

Code climateにログインし、対象のリポジトリを有効にしておきます。
初回起動までが結構長いので、先にやっておくと良いです。

スクリーンショッ

初回の分析が終わるとこのような画面になります。
1ファイルD評価取って急いで直した履歴は見なかったことにして下さい。

全ファイルがA、GPAが4.0なら指摘事項なし、という意味になります。

次に、GithubのPull requestと連携させます。
まずGithubのPersonal access tokensを開き、Code climate用のアクセストークンを生成します。
名前は自分で分かる適当な名前、スコープはrepo:statusが選ばれていれば問題ないです。

生成されたトークンをコピーしておきます。
トークンが表示されている画面から 別画面に行くと2度とコピーできなくなる ので注意が必要です。

settingsの中にある「Integrations」タブを開き、「GitHub Pull Requests」を選択します。

スクリーンショッ

コピーしておいたアクセストークンを貼り付けて貼り付けて設定完了。
これでCircle CIのようにPull request時にコードのチェックがかかります。

と思ったのですが 、オープンソースのリポジトリは常にポーリングしているのでPR連携は提供してませんよ、とのこと。

Note: If you added your repository by clicking Add Open Source Repo, Code Climate will always check for new commits based a poll or when you manually trigger a refresh. We don't yet support service hooks for these types of repositories.
GitHub Pull Request Integration
How do I install Code Climate's Github service hook?

ついでにCode climateもSlackと連携させます。

スクリーンショッ

Circle CIで走らせらせたテストのカバレッジをCode climateに送る

ここまでの設定で、

  • pushした内容がテストに通ること
  • 静的解析で判別可能な良くないコード

は判定可能になりました。ついでなのでテストのカバレッジも出力してみたいと思います。

スクリーンショッ

Code climateのsettingsを開き、「Test Coverage」を選択します。
ドキュメントが出てくるので手順通りに進めます。

マニュアル内のCODECLIMATE_REPO_TOKEN=....となっている箇所をCircle CI側にも指定する必要があるのでコピーして貼り付けます。
Circle CIのプロジェクト設定の、「Environment variables」に設定します。

スクリーンショッ

Githubにプルリクエストを作ってマージし、Code climateにカバレッジが出れば成功です。

スクリーンショッ

さりげなく2重の丸に変わっているのがおしゃれでよいですね。

ci-bundle-updateで毎日bundle updateを実行してPull Requestを送る

YAPC::Asia Tokyo 2015にてesa.ioの中の人の素敵なプレゼンをお聞きし、
プレゼン中に出てきたci-bundle-updateがとても良いと思いました。

これから毎日bundle updateしようぜ?

ということで早速導入。
解説記事の内容でハマったところがあったので、あらためて記事として手順を残します。

このように circle.yml の deployment section を変更します。
https://github.com/masutaka/masutaka-29hours/commit/0ba9ef03348568baaa5cf271d4f6e41305f8fdfe

とありますが、ここでハマりました。
./script/deploy-circleci.shなんて無いぞ…? Circle CIでのお決まりなのかな…?
と思いながらそのまま書いたら、案の定ビルドにコケました。なので以下のように修正

+      - |
+        if [ -n "${BUNDLE_UPDATE}" ] ; then
+          gem update bundler --no-document
+          gem install circleci-bundle-update-pr
+          circleci-bundle-update-pr CircleCI circleci@example.com
+        fi

これでビルドが通るようになりました。 もう1個ハマりました。

環境変数 BUNDLE_UPDATE が指定されていたら、circleci-bundle-update-pr gem をインストールして、同コマンドを実行しています。この環境変数は後述するトリガーが設定してきます。

とあったので、Circle CI側にも環境変数の設定が必要なのか…?
と思って指定したらビルド通らなくなりました。

日本語読めよ という話なのですが、Circle CI側にはこの環境変数の指定は不要です。

他は特に詰まることは無かったので、解説記事さまを呼んでいけば設定完了すると思います。 これで毎日bundle updateして何かアップデートがあればPRが飛ぶようになりました。

ちなみに、Rubyのプロジェクトだけでなくnpm(Nodejs)やcomposer(PHP)など幅広く対応しているtachikoma.ioというサービスもあるようです。
しかし今回はRubyのプロジェクトなので、tachikoma.ioよりRubyに関して高機能なci-bundle-updateを使用しました。

tachikomaについては別途Nodeのプロジェクトで試している最中なので、また記事を書きます。

そういえば、npmのci updateはDavidではなくshrinkwrap使わないんですかね…、bowerにもshrinkwrapの機能が検討されているようなので、そちらも対応されたら対応するのかなー、なんて思っています。

まとめ

全部設定するとSlackがだいぶ賑わってきます。

スクリーンショッ

一人じゃんけん感はんぱねぇ…!

自分でPull request作ってマージしてブランチ消した途端Slackの通知が
スポポポポッ ってなって 「うん、知ってる」 ってなる! !

意識高そうな感じでやってる感はすごく出るので、一人でも比較的モチベは保ちやすいかなと思います。
ぼっち開発環境の第一弾、ひとまず完成です。

スクリーンショッ