当リポジトリは以下を実現するためのGitHub Actionsのワークフロー設定(yamlファイル)の実装例です
実現したいこと
リポジトリに複数あるDockerfileをGitHub Actionsでbuildする
変更のあったファイルだけをbuildする
tree
.
├── .github
│ └── workflows
│ └── main.yaml
├── hello
│ ├── Dockerfile
│ └── hello.sh
├── world
│ ├── Dockerfile
│ └── world.sh
└── README.md
/.github/workflows/main.yaml
name: ci
on:
push:
branches:
- 'main'
paths-ignore:
# 他のファイルも含めて変更があった場合はactionが動作してしまうので、
# 以下がdocker buildの対象にならないようにstepsでチェックする
- '.github/**'
- 'README.md'
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v2
- id: file_changes
# changed filesをリスト化してくれるモジュール
uses: trilom/file-changes-action@v1.2.4
with:
# パイプ処理したいため、changed filesリストを改行区切りにする
output: '\n'
- name: docker_build
run: |
#
# ${{ steps.file_changes.outputs.files }}
# ↓
# hello/Dockerfile
# hello/hello.sh
# world/world.sh
# .github/workflows/main.yaml
# ↓
# hello
# world
# .github
#
echo -e "${{ steps.file_changes.outputs.files }}" | \
awk '{sub("/.*", "");print $0;}' | \
sort | \
uniq | \
while read line
do
echo "##### docker build -> ${line} #####"
if [ ! -e ./${line}/Dockerfile ]; then
# .githubとREADME.mdはこのロジックに入る
echo "./${line}/Dockerfile not exists"
continue
fi
docker build -t ${line} ./${line}
# 確認のため
docker run --rm ${line}
done
動作確認
ケース1
以下のファイルを操作
- /hello/hello.sh(modified)
⇒GitHub Actionsが以下ディレクトリをdocker build
- /hello
(changed files)
(GitHub Actionsのログ)
ケース2
以下のファイルを操作
- /hello/Dockerfile(new file)
- /hello/hello.sh(new file)
- /world/world.sh(modified)
- /.github/workflows/main.yaml(modified)
⇒GitHub Actionsが以下ディレクトリをdocker build
- /hello
- /world
(changed files)
(GitHub Actionsのログ)
ケース3
以下のファイルを操作
- /README.md(deleted)
- /.github/workflows/main.yaml(modified)
⇒GitHub Actionsは動作しない