AWS CodeBuildでGitHubと連携してPythonアプリをビルドする

久しぶりにAWSについての投稿です。AWS CodeBuildでGitHubと連携してPythonアプリケーションをビルドする方法を整理しました。

CodeBuild

CodeBuildはその名の通り、アプリケーションをビルドするためのAWSマネージドサービスです。

  • CodeCommit - CodeBuild - CodeDeployのCode三銃士の一角です
    • 他製品で言えばCircle CIやJenkinsのビルド部分のみを担当するようなイメージです
  • 最大の特徴はオートスケールによる従量課金で、他の開発者とのリソース競合を気にしなくて良い点です

aws.amazon.com

サンプルアプリケーション

お試し用にサンプルアプリケーション (codebuild) を作りました。

  • アプリケーションコードはmain.pyのみ
  • pipenvで環境を保持
  • pytestでテストコード (test_main.py) を実行

buildspec.yml

CodeBuildでキモとなるのがbuildspec.ymlです。依存ライブラリのインストール、ビルドスクリプトの実行、資材のアップロードなどの処理を記述します。

作成したbuildspec.ymlは以下となります。大まかな流れは4ステップです。

  1. install: ビルドする環境を構築
    • Python 3.7を指定しています (利用可能なバージョンについては公式ドキュメントを見てください)
    • commands以下に実行するコマンドを記述できます
  2. pre_build: ビルド前の依存ライブラリのインストール、コードチェック、テストを実行
    • virtualenvへの切り替え -> flake8 -> pytest を順に行ってます
  3. build: ビルド処理
    • カレントディレクトリをまるっとzip圧縮してます
  4. post_build: ビルド後のアップロードなどを実行
    • ここではs3にアップロードしてます
version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.7
    commands:
      - pip install pipenv
  pre_build:
    commands:
      - pipenv install --dev
      - export VENV_HOME_DIR=$(pipenv --venv)
      - . $VENV_HOME_DIR/bin/activate
      - flake8
      - pytest
  build:
    commands:
      - zip -r resources.zip .
  post_build:
    commands:
      - aws s3 cp resources.zip s3://codebuild-test/release --acl private

pre_buildの実装では2ヶ所ハマりました。

ここまで作成してGitHubのプライベートレポジトリにプッシュしておきます。

  • GitHubだけではなく、AWS CodeCommitやBitBucketでもOKです

ビルドプロジェクトの作成

AWSコンソールに移って、ビルドプロジェクトを新規作成します。

送信元

コードのレポジトリを指定します ("送信元"というとわかりにくいのですが...) 。上でプッシュしたレポジトリを設定しておきます。

  • GitHubの接続では OAuth orトークン が選択できます
  • 下のウェブフックイベントでは、ビルドを走らせるタイミングを好きに選択でき、プルリクのマージなどをトリガーとして設定することもできます

f:id:ohke:20190706180237p:plain

環境

ビルドする環境を調整します。runtime-versionでpython 3.7を指定してますので、マネージド型イメージを使います。

  • 事前に準備されたマネージド型イメージと、Dockerのカスタムイメージを選択できます
    • カスタムイメージではECRも指定できます
  • 作成されたサービスロールにはS3へのアップロード権限も付与しておきます

f:id:ohke:20190706180938p:plain

Buildspec

デフォルトでカレントディレクトリのbuildspec.ymlが使われますので、特に指定はいらないです。

  • ステージング / 本番といった環境ごとにbuildspec.ymlを切り替える場合は、こちらで指定することになります

f:id:ohke:20190706181542p:plain

ビルドプロジェクトの実行

"ビルドの開始"をクリックすると、作成したプロジェクトが実行され、ビルド履歴に結果が出力されます。

f:id:ohke:20190706181959p:plain

各ビルドの詳細に入っていくと、実行時のログなども確認できます。

f:id:ohke:20190706182107p:plain

補足

プッシュでビルドをキックする

送信元の設定で、Webフックイベントを有効にして、イベントタイプに"プッシュ"を選択すると、プッシュを契機にして自動的にビルドが実行されるようになります。

f:id:ohke:20190706224147p:plain

GitHubでステータスを表示する

ビルドの結果をGitHubで表示させたい場合、同じく送信元の設定でソースプロバイダへの通知を有効化するだけでOKです。

こんな感じでPRページ内でステータスを確認できます。

f:id:ohke:20190706225212p:plain

まとめ

今回はAWS CodeBuildでGitHubと連携してPythonアプリケーションをビルドする方法についてまとめました。