- ホーム
- ブログ
- GithubActions
- GithubActionsでDockerのbuildをキャッシュで時短!
こんにちは!Mukaigaです。
以前は可茂IT塾でインターンしておりましたが、今年度からは東京の会社でWebエンジニアをしております!
Docker(Compose)で作成したアプリを、GithubActionsでBuildしていたのですが、ぼちぼち遅い。
name: ci
on:
push:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v3
# buildxを使用
- name: set up docker buildx
id: buildx
uses: docker/setup-buildx-action@v2
- name: cache docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ github.ref }}-${{ github.sha }}
restore-keys: |
${{ github.ref }}
refs/head/master
# node_modulesをキャッシュ
- name: cache node_modules
uses: actions/cache@v3
id: cache-node-modules
with:
path: /tmp/.node_modules
# hashFilesでpackage-lock.jsonの変更を検知
key: ${{ runner.os }}-node_modules-${{ hashFiles('*/package-lock.json') }}
restore-keys: |
${{ runner.os }}-
# Dockerfileからイメージをビルド
- name: build docker image
uses: docker/build-push-action@v3
with:
builder: ${{ steps.buildx.outputs.name }}
tags: dev_next:latest
push: false
load: true
file: Dockerfile
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
# Docker Composeでコンテナを起動
- name: docker compose up
run: |
mkdir -p /tmp/.node_modules
docker compose up -d
# yarn installなどのコマンドを実行
- name: yarn install
run: |
docker compose exec dev_next sh -c "yarn install --frozen-lockfile"
- name: yarn build
run: |
docker compose exec dev_next sh -c "yarn build"
- name: yarn lint
run: |
docker compose exec dev_next sh -c "yarn lint"
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
# node_modulesをキャッシュ
- name: cache node_modules
uses: actions/cache@v3
id: cache-node-modules
with:
path: /tmp/.node_modules
# hashFilesでpackage-lock.jsonの変更を検知
key: ${{ runner.os }}-node_modules-${{ hashFiles('*/package-lock.json') }}
restore-keys: |
${{ runner.os }}-
このように、キャッシュしたい箇所でactions/cache@v3
を使用しています。
リポジトリ:https://github.com/actions/cache
参考:https://docs.github.com/ja/actions/using-workflows/caching-dependencies-to-speed-up-workflows
このアクションは、一意のキーによって識別されるキャッシュを作成し、復元します。
とあるように、keyに紐づくキャッシュを作ってくれます。
キャッシュがある場合にはそれを使用し、ない場合には作ってくれます!
上記の例だと、keyは以下のようになっています。
key: ${{ runner.os }}-node_modules-${{ hashFiles('*/package-lock.json') }}
*/package-lock.json
は、プロジェクトのpackage-lock.jsonを探します。
hashFilesでハッシュ化した値をキーとしています。
なので、packageが更新された場合に、新しいキャッシュを作ることができます。 また変更がない場合、keyが同じになるので、既存のキャッシュを使用することができます。
同じように、dockerのlayerもcacheしています。
可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More