GitHubを中心とした開発プロセスの自動化編です
[github webhooks] GitHub上で特定のイベントがあった時にAPIを呼び出す
特定のイベントを見逃さない様にしよう
どんな風に使う?
- Hubotと連携してチャットに通知する
- PullRequestが出来た時
- Issueがマージされた時
- コメントをした時
- etc...
- デプロイAPIを実行して自動デプロイをする
- releaseブランチがマージされたタイミングでリリース通知を出す
[githooks] Gitの特定のコマンド発行の前後でスクリプトを実行する
意図しないコミットを防いだり、必ず行う作業を自動化しよう
githooksとは?
- gitに用意された任意のタイミングでスクリプトを実行することが出来る
- タイミングは色々ある
- commit前後
- rebase前後
- push時
- etc...
.git/hooks
を見てみよう
$ 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させない debug文が入ってないか検査する |
pre-push | テストを実行する |
post-update | 何らかの通知を出す |
例 masterにcommitさせない
pre-commitを編集してmasterにはcommitできない様にしてみた
終了コードが1だと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
$ git commit -m 'fixes #13'
You can't commit on master branch
実行出来れば例えばPythonでも良いみたい
#!/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 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とコンフリクトしたり、テストが通らなかった場合はマージボタンが押せない!
問題なかった場合はマージボタンが押せるので、安心してマージ出来る
設定
設定について書くとそれだけで大きな1記事になっちゃうので、参考資料の紹介にとどめさせていただきます
- Pull Request Builder PluginをJenkinsに導入する - Qiita
- jenkins で GitHub のプルリクエストをマージしてテストする - Please Sleep