AWS CodeBuildでGitHubと連携してPythonアプリをビルドする
久しぶりにAWSについての投稿です。AWS CodeBuildでGitHubと連携してPythonアプリケーションをビルドする方法を整理しました。
CodeBuild
CodeBuildはその名の通り、アプリケーションをビルドするためのAWSマネージドサービスです。
- CodeCommit - CodeBuild - CodeDeployのCode三銃士の一角です
- 他製品で言えばCircle CIやJenkinsのビルド部分のみを担当するようなイメージです
- 最大の特徴はオートスケールによる従量課金で、他の開発者とのリソース競合を気にしなくて良い点です
サンプルアプリケーション
お試し用にサンプルアプリケーション (codebuild) を作りました。
- アプリケーションコードはmain.pyのみ
- pipenvで環境を保持
- pytestでテストコード (test_main.py) を実行
buildspec.yml
CodeBuildでキモとなるのがbuildspec.ymlです。依存ライブラリのインストール、ビルドスクリプトの実行、資材のアップロードなどの処理を記述します。
- buildspec.ymlの詳細な構文等については公式ドキュメントを参照ください
作成したbuildspec.ymlは以下となります。大まかな流れは4ステップです。
- install: ビルドする環境を構築
- Python 3.7を指定しています (利用可能なバージョンについては公式ドキュメントを見てください)
commands
以下に実行するコマンドを記述できます
- pre_build: ビルド前の依存ライブラリのインストール、コードチェック、テストを実行
- virtualenvへの切り替え -> flake8 -> pytest を順に行ってます
- build: ビルド処理
- カレントディレクトリをまるっとzip圧縮してます
- 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ヶ所ハマりました。
pipenv shell
で切り替えたかったのですが、termios.error: (25, 'Inappropriate ioctl for device')
でうまく切り替えられず...- そのため直接activateスクリプトを実行しています
- c.f. Trouble running pipenv in CI · Issue #290 · pypa/pipenv · GitHub
- 最初
source $VENV_HOME_DIR/bin/activate
で実行しようとしましたがsource: not found
で失敗しました- Ubuntuのデフォルトシェルがdashのため、
source
の代わりに.
を使う必要がありました - c.f. CodeBuild上でシェルスクリプトがうまく動かないときの対処法 | DevelopersIO
- Ubuntuのデフォルトシェルがdashのため、
ここまで作成してGitHubのプライベートレポジトリにプッシュしておきます。
- GitHubだけではなく、AWS CodeCommitやBitBucketでもOKです
ビルドプロジェクトの作成
AWSコンソールに移って、ビルドプロジェクトを新規作成します。
送信元
コードのレポジトリを指定します ("送信元"というとわかりにくいのですが...) 。上でプッシュしたレポジトリを設定しておきます。
- GitHubの接続では OAuth orトークン が選択できます
- 下のウェブフックイベントでは、ビルドを走らせるタイミングを好きに選択でき、プルリクのマージなどをトリガーとして設定することもできます
環境
ビルドする環境を調整します。runtime-version
でpython 3.7を指定してますので、マネージド型イメージを使います。
- 事前に準備されたマネージド型イメージと、Dockerのカスタムイメージを選択できます
- カスタムイメージではECRも指定できます
- 作成されたサービスロールにはS3へのアップロード権限も付与しておきます
Buildspec
デフォルトでカレントディレクトリのbuildspec.ymlが使われますので、特に指定はいらないです。
- ステージング / 本番といった環境ごとにbuildspec.ymlを切り替える場合は、こちらで指定することになります
ビルドプロジェクトの実行
"ビルドの開始"をクリックすると、作成したプロジェクトが実行され、ビルド履歴に結果が出力されます。
各ビルドの詳細に入っていくと、実行時のログなども確認できます。
補足
プッシュでビルドをキックする
送信元の設定で、Webフックイベントを有効にして、イベントタイプに"プッシュ"を選択すると、プッシュを契機にして自動的にビルドが実行されるようになります。
GitHubでステータスを表示する
ビルドの結果をGitHubで表示させたい場合、同じく送信元の設定でソースプロバイダへの通知を有効化するだけでOKです。
こんな感じでPRページ内でステータスを確認できます。
まとめ
今回はAWS CodeBuildでGitHubと連携してPythonアプリケーションをビルドする方法についてまとめました。