ToC
GitHub Actionsでデプロイモジュールを作成
GitHub Actionsを使いはじめました。
CI/CDを効率的にすすめるためのツールとして非常に便利です。
自分の処理したい内容を yaml
形式のworkflow
ファイルとして記述することにより
PythonプログラムのUnitテストやLinterなどをGitHubへのPush
のタイミングや
master
へのマージのタイミングなどで処理を実行できます。
そこで、GitHub
上で管理しているAWS Lambda
のプログラムのデプロイパッケージ作成を
GitHub Actions
で生成し、その後、別のデプロイのトリガー(AWS側から実行を想定)で
GitHub Actions
で生成したデプロイパッケージを取得するユースケースを試してみました。
パッケージを作成するworkflow
今回のプログラムは、Pythonで作成したためLambdaファンクションのデプロイパッケージを 作成するworkflowでは、下記の処理を順番行いました。
- ソースのチェックアウト
- ミドルウエア(zip, vim-common)のインストール
- pipでライブラリをインストール(requirements.txt)
- Pythonのビルド
- Lambdaプログラムのデプロイパッケージ(Zip)作成
- デプロイパッケージのSha256Sum取得
- ファイルのArtifactsへのアップロード
workflowの作成については、ネット上に色々と詳しいサイトがあると思います。 今回の処理で重要な箇所を下記には記載しておきます。
# 〜 途中の処理記載を省略しています 〜
name: lambda-package
on:
push:
branches:
- master
jobs:
lambda-package:
runs-on: ${{ matrix.platform }}
strategy:
matrix:
platform: [ubuntu-latest]
python-version: [3.7]
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python-version }}
architecture: 'x64'
- name: Install Package Tools
shell: bash -xe {0}
run: |
sudo apt-get install -y vim-common
sudo apt-get install -y zip
# 〜 途中省略 〜
- name: Upload package file to artifact
if: success()
uses: actions/upload-artifact@v1
with:
name: package
path: artifacts
GitHub Actionsが正常終了すると、下記のような形で Artifacts
にファイルが作成されます。
GitHubのアクセストークン
GitHubに対してAPIアクセスするためには、GitHubのアクセストークン
の発行が必要です。
はじめはどこから発行するのかがよくわからず、GitHibのページをウロウロしていましたが、
Settings
> Developer settings
> Personal access tokens
のところから発行ができました。
今回は、private repository
の artifacts
を取得する必要があるため、スコープは repo
全体としました。
APIでファイルを取得する
私の場合は、CodeBuild
を利用してデプロイをしているため、上記で取得した必要なGitHubのアクセストークン
を
セキュアに保管するために SMS Parameter Store
を利用しました。
そして、CodeBuild
から GitHub
に対してAPI処理でデプロイパッケージファイルをダウンロードするような構成としています。
細かいことをいろいろいうよりも、ソースコードの方がわかりやすいかと思いますので記載します。
#!/bin/bash -e
owner="owner"
repo="repo-name"
token="your-access-token"
file_name="package"
actions_artifacts_list="https://api.github.com/repos/${owner}/${repo}/actions/artifacts?per_page=100"
asset_url=$(curl -H "Authorization: token ${token}" ${actions_artifacts_list} | jq ".artifacts | sort_by(.created_at) | reverse" | jq "map(select(.name == \"${file_name}\"))" | jq -r ".[0] | .url")
curl -L -H "Authorization: token ${token}" -o ${file_name}.zip ${asset_url}/zip
細かいことになりますが、まずGitHubのAPIは取得対象のリストのオブジェクトが多くなるとページングされます。 そのため、対象が多くなる場合にはページング処理の検討が必要です。参考までにレスポンスイメージを記載します。
{
"total_count": 1,
"artifacts": [
{
"id": 1234567,
"node_id": "ABCD1234EFGH5678XXXX0000",
"name": "package",
"size_in_bytes": 9335709,
"url": "https://api.github.com/repos/username/repo/actions/artifacts/1122345",
"archive_download_url": "https://api.github.com/repos/username/repo/actions/artifacts/1122345/zip",
"expired": false,
"created_at": "2020-03-16T23:11:16Z",
"updated_at": "2020-03-16T23:11:17Z"
}
]
}
上記のコードでは、file_name
に一致するartifact
の最新のファイルをダウンロードする処理として記載しています。
この処理を入れることで、AWS側からファイルを取得してデプロイをすすめることが可能になりそうです。
お掃除の処理は…
ちなみにですが、artifact
が大量になることを防ぐためにMarketPlace
にpurge-artifactsというものが
準備されているようです。でも、よく考えると、ファイルをアップロードするときにTTL
を指定する方がより良いのでは
ないかな、とも思いました。
いずれにしても、GitHub Actions
を有効に活用するためには、お掃除も重要ですね。