CircleCIはプランごとにビルドに使える時間が制限されているので、プランを小さいもので契約しているとあっという間にビルド時間を使い果たしてしまうことがあります。JenkinsのGithubPullRequestBuilderみたいな感じで特定のコメントをした時だけビルドが走るようにできると便利なのですが、Github側のwebhookのトリガーには、任意のタイミングでビルドを走らせられる都合のいいトリガーが見つからず、今回は似たようなものを自前で作ってみることにしました。
要件
- CircleCIを使ってビルドする
- 任意のタイミングでのみビルドを実行できる
方策
- AWS Lambdaで特定のコメントのみフィルタしてCircleCIにAPI経由でビルドを投げるFunctionを作成する
- AWS API Gateway経由で↑のFunctionを叩く
- Githubで↑のAPIをwebhookとして設定し、Issue Commentをトリガーとしておく
手順
AWS Lambdaで特定のコメントのみフィルタしてCircleCIにAPI経由でビルドを投げるFunctionを作成する
こちらにgithubのwebhookのイベント受け取ってCircleCIにビルドを投げるためのサンプルコードがあるので今回はこれを使います。
https://github.com/hiroyukimizukami/github_build_runner
apex経由でデプロイします。中でGithubとCircleCIのAPIを叩くのでそれぞれのトークンが必要です。
* Github ... repos Scopesが付いているもの
* CirclCI ... All Scopesがついているもの
apex deploy --set GITHUB_TOKEN=hoge --set CIRCLECI_TOKEN=huga
コード内でやっている事としては以下のとおりです。
- GithubのIssueCommentイベントを受け取りイベント内容をフィルターする
- actionがcreated(作成)の時、かつ
- comment.bodyが「test this please」である
- Githubの「Get a single pull request」APIを使って最新のshaを取得する。
- 取得したshaを指定してCircleCI APIを使って新規ビルドをリクエストする。
各APIのフォーマットは以下の通りです。
* Github: IsssueCommentEvent
* Github: Get a single pull request
* CircleCI: Trigger a new build
AWS API Gateway経由で↑のFunctionを叩く
APIを作成する
- Amazon API Gatewayから「Create New API」を選択。Settingsの API nameに適当な名前を入れて「Create API」押下
APIにメソッドを追加する
- APIs -> 「作成したAPIを選択」 -> Actionsから「Create Methods」を選択し、POSTメソッドを追加する
- Integration TypeにLambda Functionを選択
- Lambda RegionにLambda Functionをデプロイしたリージョンを指定(日本なら大抵ap-northeast-1)
- Lambda Functionにデプロイ済みのfunctionを指定してSave
APIをDeployする
- ActionsからDeploy APIを選択
- Deployment StateでNew Stageを選択
- Stage Nameは適当に入力(productionとか)
- Deployを押下
Deployができると、InvokeURLが出てくるのでそれを控えておきましょう。(以下の形式になっているはずです)
https://{api_id}.execute-api.{region}.amazonaws.com/{stage}
Githubで↑のAPIをwebhookとして設定し、Issue Commentをトリガーとしておく
- Githubのリポジトリ -> [Settings] -> [Webhooks] -> [Add Webhooks]
- Payload URL ... 先程控えたInvokeURLを指定
- Content Type ... application/json
- Secret ... 未指定
- Let me select individual events.から「Issue Comment」を指定
以上の作業にて、特定のコメントをした時だけCircleCIでビルドが走るようになっているはずです。