Closed9

AWS CodeBuildでGithubのReleasesを自動作成する

高田 晴彦高田 晴彦

要件

GithubのReleasesを自動作成する(自作アプリでの例)

トリガー

releaseブランチをプッシュした時に実行する

Releasesの中身

  • タグ名はrelease_バージョン名
    • バージョン名はAndroidプロジェクトのbuild.gradleから取得する
  • タイトルはバージョン名
  • 本文
    • 最新のrelease_で始まるタグが付いたコミットから最新コミットまでの間でマージされたプルリクのタイトル
    • 上記の♯付き番号

パラメータについて

GithubのAPIアクセストークン、リポジトリ名、Organization名は環境変数で入力する。

高田 晴彦高田 晴彦

現行実装

BitriseのScriptステップで下記スクリプトを動かしている。

sudo apt install -y python3-pip
pip3 install pygithub --user
python3 release_note.py

release_note.pyの中身。

問題点

sudo apt install -y python3-pip

が失敗する。
他にも

  • 毎回必要なライブラリをインストールするのは非効率。
  • Pythonやライブラリのバージョンが毎回変わるので突然動かなくなる可能性がある。
高田 晴彦高田 晴彦

今回やりたいこと

  • poetryで環境を固定する
  • DockerイメージにしてAWS ECRに置く
  • ソースコードを公開できるように固有の情報は環境変数にする
  • Releasesの作成だけを行うAWS CodeBuildのビルドプロジェクトを作る
    • Google Playへの自動申請はBitriseのGoogle Play Deployステップで行っているが、そこは問題が無いのでそのままにする。
高田 晴彦高田 晴彦

今回のコード

https://github.com/tfandkusu/release_note

アプリ開発者が提供する環境変数

  • GITHUB_API_ACCESS_TOKEN
  • GITHUB_REPOSITORY (リポジトリ名)
  • GITHUB_ORGANIZATION (Organizationを使っている場合は設定する)

AWS CodeBuildによって提供される環境変数

  • CODEBUILD_SRC_DIR GitHubからチェックアウトされてソースコードが保存されたディレクトリ
高田 晴彦高田 晴彦

Dockerfileを作成

FROM python:3.8-slim
WORKDIR /app
COPY . /app
RUN pip install poetry
RUN poetry install

docker-compose.ymlを作成

release_note:
  build: .
  environment:
    - GITHUB_API_ACCESS_TOKEN
    - GITHUB_REPOSITORY
    - GITHUB_ORGANIZATION

ここで指定した環境変数はホストOSの物が使われる。

docker-composeを実行する

CODEBUILD_SRC_DIR環境変数を使用する部分はコメントアウトする。

docker-compose build
docker-compose run release_note poetry run main
- 不要なappcompatライブラリ取り込みを削除 #79
- Create Dependabot config file #80
高田 晴彦高田 晴彦

DockerのAWS ECR向け認証を行う

公式文献

AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY環境変数は設定済みという前提。
aws_account_idは人によって違う。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com

Registoryを作る

aws ecr create-repository --repository-name release_note --image-scanning-configuration scanOnPush=true --region ap-northeast-1

AWS ECRにPUSHするためにローカルのDockerイメージにタグを付ける

docker images
REPOSITORY                                                         TAG               IMAGE ID       CREATED          SIZE
release_note_release_note                                          latest            a542cc66d3a1   8 minutes ago    205MB
docker tag release_note_release_note:latest aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com/release_note:latest

AWS ECRにPUSHする

docker push  aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com/release_note
高田 晴彦高田 晴彦

AWS CodeBuildの設定を行う

プロジェクトの設定

  • ビルドプロジェクトを作成する
  • プロジェクト名を設定する

ソース

  • ソースプロバイダをGitHubにする
  • GitHub アカウントのリポジトリを選択する
  • リリースノートを作りたいリポジトリを選択する
  • サービスロールのアクセス許可にチェックを入れる

プライマリソースのウェブフックイベント

  • コードの変更がこのレポジトリにプッシュされるたびに再構築する
  • イベントタイプをPUSHにする
  • HEAD_REF - オプショナルを ^refs/heads/release$ にする

環境

  • カスタムイメージ
  • 環境タイプはLinux
  • 自分のECRアカウント
  • Amazon ECR レポジトリを選択する
  • Amazon ECR イメージをlatestにする
  • プロジェクトサービスロールを選択する
  • AWS CodeBuild にこのサービスロールの編集を許可し、このビルドプロジェクトでの使用を可能にする、にチェックを入れる
  • 環境変数を設定する

Buildspec

今回はビルドコマンドの挿入にした。

version: 0.2

phases:
  build:
    commands:
       - cd /app
       - poetry run main

ログ

  • グループ名とストリーム名を設定する
高田 晴彦高田 晴彦

Dockerイメージをアップデートする場合

docker-compose build
docker tag release_note_release_note:latest aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com/release_note
docker push  aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com/release_note
高田 晴彦高田 晴彦

テスト実行

  • GithubのReleasesの投稿はコメントアウトしている
  • ビルドを開始ボタン を押す
  • ビルドログから動作を確認
[Container] 2021/02/10 18:53:50 Entering phase BUILD
[Container] 2021/02/10 18:53:50 Running command cd /app

[Container] 2021/02/10 18:53:50 Running command poetry run main
1.4.6 release_1_4_6

- 不要なappcompatライブラリ取り込みを削除 #79
- Create Dependabot config file #80


[Container] 2021/02/10 18:53:55 Phase complete: BUILD State: SUCCEEDED

本番実行

自作アプリはアップデート予定が無いので、毎週アップデータをリリースしている会社のアプリで試す。

このスクラップは2021/03/01にクローズされました