この記事はOSS紹介 Advent Calendar 2017の8日目の記事です。OSS紹介 Advent Calendar 2017では、使っている便利なOSSを紹介したい方や、自分のOSSを広めたいという方の投稿をお待ちしております。
今回はGitHub Webhookを簡単に使えるghooks-cmd-runnerを紹介します。
特徴
- ワンバイナリで動作
- GitHubからのHTTPリクエストを受け付けるWebサーバとして動作
- TOML形式の設定ファイルにwebhookが来たときに起動するコマンドを記述する
- 標準入力にWebhookで来たリクエストのJSONが流し込まれる
- 特にWebサーバを記述しなくてもコマンドを書くだけでWebhookを作ることが出来る
使いみち
- JenkinsなどのCIをpluginを用いずにジョブを起動する
- masterブランチだけジョブを起動するなどの柔軟な設定が可能
- pushなどのタイミングで特定のコマンドを走らせる
- githubのissueなどを更新するコマンドのトリガーに使える
使い方
インストール
これもkatsubushiと同様、releaseバイナリがあります。
こちらからプラットフォームにあったバイナリを落とすか、やはりghgを使うと簡単にインストールできます。
$ ghg tkuchiki/ghooks-cmd-runner
設定
# port = 18889 (default: 18889)
# host = "0.0.0.0 (default: 127.0.0.1)"
# secret = "your webhook secret"
# logfile = "path to logfile (default: stdout)"
# pidfile = "path to pidfile"
[[hook]]
event = "push"
command = "/path/to/script"
[[hook]]
event = "pull_request"
command = "/path/to/script"
以上のような形でコマンドを記述し、
$ ghooks-cmd-runner -config=config.toml
でサーバが立ち上がります。
GitHubからのHTTPリクエストを受け付ける必要があるため、ドメインなどを割り当てる必要があります。
GitHub側のWebhookの設定は公式ドキュメントなどをご覧ください。具体的にはリポジトリのsettings
-> webhooks
で設定します。
シェルスクリプトでWebhookを受ける
jqなどを使うとshell scriptでもwebhookで何かアクションを起こすことが出来ます。以下はブランチを指定しつつJenkinsの特定のジョブをbuildWithParameterで起動するシェルスクリプトです。
#!/bin/bash
set -ex
JOB_NAME=${1:-default_job}
GIT_BRANCH=$(cat - | jq -r '.ref' | sed 's/^refs\/heads\///g')
curl -X POST -s "http://internal.jenkins/job/$JOB_NAME/buildWithParameters?GIT_BRANCH=$GIT_BRANCH"
release-requestでdevelopブランチにpushがあったらmasterブランチへのPull Requestを更新する
拙作のrelease-requestを用いて、masterに更新があったら、デプロイPull Requestを更新することが出来ます。
[[hook]]
event = "push"
command = "release-request"
branch = "^develop$"
他のアイディア
- reviewdogを起動してlintのログなどをPull Requestに書き込む
- 特定のブランチが更新されたら開発サーバのコンテナを入れ替える
以上ユースケースなどを紹介させていただきました。GitHubを中心にワークフローを組んでいる方にはとても有用なプロダクトだと思います。あなたの街のGitHub活用術を教えてくれたら幸いです。