AWS CodeBuildとGitBucketの連携
TL;DR
- GitBucketはGitHub API互換なので、GitHub Enterpriseとして振る舞うことができる。
- AWS CodeBuildはGitHub Enterpriseに対応している。
- CodeBuildからGitBucketにgit cloneしてビルドを実行できる。
- 今のところWebhookは使えない。
Getting Started
GitBucket
GitBucketには https://git.example.com
でアクセスできるものとします。IPアドレス制限がある場合は後述するVPC設定が必要になります。
GitBucketに適当なリポジトリを作成します。ここでは https://git.example.com/hello/sandbox
とします。リポジトリを作成したら、以下の内容で buildspec.yml
を作成します。
version: 0.2 phases: build: commands: # Dockerを利用してイメージをビルドできることを確認するためのサンプル - docker version
CodeBuildがGitBucketにアクセスするためのユーザを作成します。
- ユーザ名:
codebuild
- パスワード:
x-oauth-basic
- メールアドレスは適当でOK
CodeBuild
AWSのマネジメントコンソールでCodeBuildを開き、新しいプロジェクトを作成します。
- ソースプロバイダ: GitHub Enterprise
- 個人用アクセストークン:
codebuild
(前項で作成したユーザ) - リポジトリの URL:
https://git.example.com/hello/sandbox
- 環境イメージ: AWS CodeBuild によって管理されたイメージの使用
- ランタイム: Docker
- ランタイムバージョン:
aws/codebuild/docker:17.09.0
- ビルド仕様: ソースコードのルートディレクトリの buildspec.yml を使用
- アーティストなし
- キャッシュなし
- アカウントでサービスロールを作成
プロジェクトを作成したら「ビルドの開始」をクリックします。下図のようにビルドの詳細画面でSucceededと表示されれば成功です。
もし失敗した場合はエラーメッセージを確認してください。GitBucketにアクセスできない場合はConnection Refusedもしくはタイムアウトになります。認証に失敗した場合はその旨が表示されます。
GitBucketがセキュリティグループで保護されている場合
GitBucket用のInternet-facing ALBがセキュリティグループで保護されている場合、CodeBuildがGitBucketにアクセスできないためビルドが失敗します。CodeBuildがVPC経由でGitBucketにアクセスできるように、プライベートサブネットとNATゲートウェイを設定する必要があります。
具体的な構成は下記が参考になります。
- Amazon Virtual Private Cloud で AWS CodeBuild を使用する - AWS CodeBuild
- シナリオ 2: パブリックサブネットとプライベートサブネットを持つ VPC (NAT) - Amazon Virtual Private Cloud
ここではGitBucketが存在するVPCで以下を構成したとします。
- パブリックサブネット
- パブリックサブネットにNATゲートウェイを配置
- プライベートサブネット
- プライベートサブネットのデフォルトルートをNATゲートウェイに設定
- GitBucket用のInternal ALBを作成
- GitBucket用のInternal ALBにアクセスできるセキュリティグループを作成
CodeBuildからGitBucketへの経路を描くと下図のようになります。
CodeBuildのビルド設定で以下を指定します。
- リポジトリの URL: Internal ALBのURL(※1)
- VPC: GitBucketが存在するVPCを選択
- サブネット: プライベートサブネットを選択
- セキュリティグループ: GitBucket用のInternal ALBにアクセスするためのセキュリティグループを選択
ビルドが成功するか確認します。CodeBuildがGitBucketにアクセスできない場合はタイムアウトになります。
(※1)Route53 Private Hosted Zoneを使うことでInternet-facing ALBとInternal ALBを同じURLで参照できるようになります。詳しくは VPC内部からALBにアクセスする場合の設計 - @int128 を参照してください。
現状の課題
現状では、CodeBuildからGitBucketへのWebhookを契機にビルドを実行できない問題があります。CodeBuildが発行するWebhook URLが長すぎるため、GitBucketのWebhook設定画面でURLを入力できないためです。GitBucketのDBスキーマを修正すれば対応できそうです。
追記: Issueを上げました! AWS CodeBuild requires a very long webhook URL and token · Issue #1951 · gitbucket/gitbucket · GitHub