Apex
CircleCI
APIGateway

AWS API Gateway経由でCircleCIを叩く

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を作成する

image.png
- Amazon API Gatewayから「Create New API」を選択。Settingsの API nameに適当な名前を入れて「Create API」押下

APIにメソッドを追加する

image.png

  • APIs -> 「作成したAPIを選択」 -> Actionsから「Create Methods」を選択し、POSTメソッドを追加する

image.png

  • Integration TypeにLambda Functionを選択
  • Lambda RegionにLambda Functionをデプロイしたリージョンを指定(日本なら大抵ap-northeast-1)
  • Lambda Functionにデプロイ済みのfunctionを指定してSave

APIをDeployする

image.png

  • ActionsからDeploy APIを選択

image.png

  • 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でビルドが走るようになっているはずです。

image.png