GitHubを中心とした開発プロセス 自動化


[GitHubを中心とした開発プロセス](http://qiita.com/suzuki-hoge/items/a6e3bdc2cc1cf4e98ea1)の自動化編です

## [github webhooks] GitHub上で特定のイベントがあった時にAPIを呼び出す
特定のイベントを見逃さない様にしよう

### どんな風に使う？
+ Hubotと連携してチャットに通知する
 + PullRequestが出来た時
 + Issueがマージされた時
 + コメントをした時
 + etc...
+ デプロイAPIを実行して自動デプロイをする
+ releaseブランチがマージされたタイミングでリリース通知を出す

設定画面
![webhooks-p1.png](https://qiita-image-store.s3.amazonaws.com/0/113398/4a01fcca-15d0-121a-0733-02980b78ada4.png "webhooks-p1.png")

結構細かくイベントが用意されている
![webhooks-p2.png](https://qiita-image-store.s3.amazonaws.com/0/113398/dcdaf888-4faf-c202-e062-e11e917cc770.png "webhooks-p2.png")

## [githooks] Gitの特定のコマンド発行の前後でスクリプトを実行する
意図しないコミットを防いだり、必ず行う作業を自動化しよう

### githooksとは？
+ gitに用意された任意のタイミングでスクリプトを実行することが出来る
+ タイミングは色々ある
 + commit前後
 + rebase前後
 + push時
 + etc...

`.git/hooks`を見てみよう

```Sh
$ ls .git/hooks

applypatch-msg.sample     post-update.sample        pre-commit.sample         pre-rebase.sample         update.sample
commit-msg.sample         pre-applypatch.sample     pre-push.sample           prepare-commit-msg.sample
```

### どんな風に使う？
例えば

スクリプト  | 使い方例                                               
:--         | :--                                                    
pre-commit  | masterにcommitさせない<br>debug文が入ってないか検査する
pre-push    | テストを実行する
post-update | 何らかの通知を出す                                             

### 例 masterにcommitさせない
pre-commitを編集してmasterにはcommitできない様にしてみた
終了コードが1だとcommitすることが出来ない

```Sh:pre-commit
#!/bin/sh

branch=`git rev-parse --abbrev-ref HEAD`

if [ $branch = "master" ]; then
  echo "You can't commit on master branch"
  exit 1
fi
```

```Sh
$ git commit -m 'fixes #13'
You can't commit on master branch
```

実行出来れば例えばPythonでも良いみたい

```Python:pre-commit
#!/usr/bin/env python

import sys
import commands

branch = commands.getoutput('git rev-parse --abbrev-ref HEAD')

if branch == 'master':
  print "You can't commit on master branch"
  sys.exit(1)
```

### 参考
+ [Git - Git フック](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)
+ [Git hooks まとめ - Qiita](http://qiita.com/khlizard/items/dfe1ec9d82c0ed5da7c6)

## git webhooksとgithooksの違い
webhooksはGitHub上での操作のフックなので、IssueやPullRequestの作成やコメントなどのフックが主な用途だと思う
対してgithooksはgitコマンドに対するフックなのでcommitやrebase操作などをフックするためのものだと思う

また、githooksは`.git/hooks`（git管理外のディレクトリ）で管理するので、自分用のスクリプトを作ったり、GitLabやBitbucketでも使えると思う

## [jenkins github pull request builder] PullRequestがマージされる際にJenkinsでビルドする
PullRequestがマージされる際にコンフリクトやテスト失敗があってはならない

Jenkinsを使っている場合は`github pull request builder`というJenkinsプラグインを入れてみよう
ちょっと設定が面倒だけど、PullRequestをマージする時の安心感がとても向上するぞ

### PullRequestのマージ前にdevelopとマージしてユニットテストを実行する様に設定した例
developとコンフリクトしたり、テストが通らなかった場合はマージボタンが押せない！
![jenkins-fail.png](https://qiita-image-store.s3.amazonaws.com/0/113398/fd3ce23d-fce6-9de3-6061-ffd84a1b8988.png "jenkins-fail.png")

問題なかった場合はマージボタンが押せるので、安心してマージ出来る
![jenkins-success.png](https://qiita-image-store.s3.amazonaws.com/0/113398/e1251841-10d8-4d71-f7e0-5c086b543879.png "jenkins-success.png")

### 設定
設定について書くとそれだけで大きな1記事になっちゃうので、参考資料の紹介にとどめさせていただきます

+ [Pull Request Builder PluginをJenkinsに導入する - Qiita](http://qiita.com/kompiro/items/a097b3b36aa30bc751c6)
+ [jenkins で GitHub のプルリクエストをマージしてテストする - Please Sleep](http://please-sleep.cou929.nu/jenkins-github-pull-request-builder-plugin.html)

## よろしければ他記事もどうぞ
+ [もくじ](http://qiita.com/suzuki-hoge/items/a6e3bdc2cc1cf4e98ea1)
+ [ドキュメント管理](http://qiita.com/suzuki-hoge/items/1d6022cca177e2d96bb5)
+ [公開](http://qiita.com/suzuki-hoge/items/cd5170e7090407eb3e66)
+ [課題管理](http://qiita.com/suzuki-hoge/items/3a568dff36fd981082ba)
+ [ZenHub](http://qiita.com/suzuki-hoge/items/f02b6752d8876ba6e114)
+ [満足していないこと](http://qiita.com/suzuki-hoge/items/1c0fa6a285aec080cd81)