GithubにはWebHookっていう便利な奴があって、pushされたタイミングでPOSTのリクエストを送れる。
Githubから直接Jenkinsを叩くJenkins(Github plugin)とか(Git plugin)とかもあったけど、ブランチを指定してゴニョゴニョができなそうだったのでWebHookを使ったよ。
JKじゃなくてJQ
WebHookからJenkinsのAPI叩くとPayloadsってパラメータにJSONが入ってくるので、そいつを解析してブランチ名を取得します。
ここで問題になるのが、どうやってJSONをパースするか。node.js使うとかPython使うとかいろいろあると思いますが、Shellで完結したかったので今回はJQを使いました。
そして今回対象のJenkinsは複数台のサーバでクラスタ化されてるため、インストールするのも面倒なのでこのjqコマンドを対象のプロジェクトに保存しちゃいました☆
jqはじまってる!!
Jenkins側の準備
まずはJenkins側でWebHookを受ける設定をします。
ビルドのパラメータ化
前述しましたが、WebHookはpayloadというパラメータでJSONを送ってくるので、そのパラメータをうける口を用意します。
ビルドのパラメータ化から文字列を選び、名前:payload、デフォルト値:none等と設定しておきます。
gitの設定
Jenkinsのgitプラグインは入ってるものとして、gitのレポジトリの設定をします。
このときのポイントはブランチは適当な存在するものにするということです。後ほど、Jsonを解析してブランチを切り替えますが、この時点では適当に設定しておきます。masterでもなんでもいいです。
ビルドトリガー
ビルドトリガーの設定でリモートからビルドにチェックを入れます。これで外部からAPI経由でビルドできるようになります。認証トークンは適当な文字列を入れましょう。
すると入力欄のしたにサンプルURLが出てくると思います。そのbuildWithParametersのほうを使います。
JENKINS_URL/job/vcard_static_code_analysis/buildWithParameters?token=TOKEN_NAME
TOKEN_NAMEのところに先ほど設定した認証トークンを入れます。これを後ほどgithub側に登録するのです。
前処理
じっさいにゴニョゴニョする前にshellで前処理を行います。
具体的にはJSONをパースして、ブランチを切り替えるという処理です。
#!/bin/bash
echo "the build start! The payload is $payload"
chmod 755 jq
git fetch origin
BRANCH=`echo $payload| ./jq -r '.ref'|sed "s/refs\/heads\///"`
echo "branch is $BRANCH"
git reset --hard origin/${BRANCH}
こんな感じです。
これで、前処理が終わったらテストなり静的コード解析なりなんなりとやっちゃってください。
特定のブランチだけ実行するとかもこの時点でif文でも書いてあげれば可能ですね!!
github側の設定
あとはgithub側の設定だけです。
githubのレポジトリ設定からWebhooks & Servicesを選択。
Add webhookで先ほどのJenkinsで出力されたURLを設定します。Payload versionはjsonを選択します。
これで完成!!!
さーだれかPushしてこいや!!!!
参考サイト
こっちのがわかりやすいかもorz