@int128

int128.hatenablog.com

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と表示されれば成功です。

f:id:int128:20180412185758p:plain

もし失敗した場合はエラーメッセージを確認してください。GitBucketにアクセスできない場合はConnection Refusedもしくはタイムアウトになります。認証に失敗した場合はその旨が表示されます。

GitBucketがセキュリティグループで保護されている場合

GitBucket用のInternet-facing ALBがセキュリティグループで保護されている場合、CodeBuildがGitBucketにアクセスできないためビルドが失敗します。CodeBuildがVPC経由でGitBucketにアクセスできるように、プライベートサブネットとNATゲートウェイを設定する必要があります。

具体的な構成は下記が参考になります。

ここではGitBucketが存在するVPCで以下を構成したとします。

  • パブリックサブネット
  • パブリックサブネットにNATゲートウェイを配置
  • プライベートサブネット
  • プライベートサブネットのデフォルトルートをNATゲートウェイに設定
  • GitBucket用のInternal ALBを作成
  • GitBucket用のInternal ALBにアクセスできるセキュリティグループを作成

CodeBuildからGitBucketへの経路を描くと下図のようになります。

f:id:int128:20180412194442p:plain

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