「俺はactions/cacheをやめるぞ!〇〇〇〇ーッ!!」
はじめに
S3にキャッシュするアクションを作成しました。
GitHub Actions公式のキャッシュ機能であるactions/cache
は、
- Pull Requestでコケた時にRe-run jobsするとactions/cacheアクションが正常に動作しない
- actions/cacheアクションは時折キャッシュの取得に失敗することがある
などの問題を抱えているようです。
詳しくは、こちらのブログ記事を参照ください。
加えて、キャッシュの容量はリポジトリごとに5GBとのことなのですが、明らかに容量オーバーしていないはずなのに、キャッシュミスが発生していることがあるような気がします。
そこで、今回S3に独自にキャッシュさせるアクションを作成しました。
今のところ、快適に動いているので、今回その内容を紹介させていただきます。
使い方
例として、以下のように記述するとnpm ci
によって作成されたnode_modules
をS3にキャッシュし、次回以降はS3からリストアします。
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: shonansurvivors/actions-s3-cache@v1.0.1
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ap-northeast-1
with:
s3-bucket: your-s3-bucket-name # 必須
cache-key: npm-v1-${{ hashFiles('laravel/package-lock.json') }} # 必須 ('.zip' は記述不要)
paths: node_modules # 必須(キャッシュするディレクトリやファイル。複数ある場合はスペース区切りで記述)
command: npm ci # 必須(インストールやビルドのコマンドを記述)
zip-option: -ryq # 任意 (デフォルト: -ryq)
unzip-option: -n # 任意 (デフォルト: -n)
working-directory: laravel # 任意 (デフォルト: ./)
事前準備としては、
- S3バケットを作成する
- S3バケットを読み書き可能なポリシーを持ったIAMユーザーを作成する
- GitHubリポジトリのsettings画面で上記IAMユーザーのアクセスキーIDとシークレットアクセスキーをsecretsに設定する
が必要となります。キャッシュですので、S3バケットにはライフサイクルポリシーを付けて一定日数でオブジェクトが削除されるようにすると良いかと思います。
以下はIAMのポリシーの例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
],
"Resource": [
"arn:aws:s3:::your-s3-bucket-name",
"arn:aws:s3:::your-s3-bucket-name/*"
]
}
]
}
なお、アクションの種類には、DockerアクションとJavaScriptアクションが存在しますが、actions-s3-cacheは後者のJavaScriptアクションです。
ですので、GitHubが提供するVM環境で直接実行されます。
その他公式のactions/cacheとの違い
- Re-run jobsした時も正常に動く
- 後続のステップがエラーになってジョブが失敗したとしても、キャッシュする(公式はキャッシュしない)
- 複数のディレクトリとファイルの組み合わせをまとめてキャッシュ可能(公式でキャッシュできるのは1つのディレクトリのみ。ファイル名指定は不可)
実際に使ってみて
正確に測っていませんが、速度的には公式のactions/cache
と遜色無い気がします。
何より、キャッシュがそこにあるはずなのにヒットしない、という状況にもやもやすることが無いのは快適でした。
良かったら、ぜひ使ってみてください。
「S3ィィィィィッ!!」