これは
案件の納品時、修正したファイルだけzip化して欲しいと要求されたため、ワークフロー化する方法を探ってみました。
ワークフローで差分を抽出する方法は色々記事が上がってるものの、微妙にユースケースが違ったので参考にしつつカスタマイズしました。
tl;dr
ざっくりこんな感じで出来ました。
もっとスマートに書けそうですが一旦動いたので。。。
name: create-zipped-diff-files
on:
pull_request:
branches: [master] # zip化対象のブランチを指定
types: [closed]
env:
diff_path: 'src/*' # 差分比較対象のディレクトリを指定
jobs:
run-actions:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true && github.head_ref == 'release' # headがブランチ名がreleaseの時に実行
steps:
- name: switch to pull request branch
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: create delivery zip
run: |
diff_files=$(git diff --name-only HEAD^ -- "${diff_path}" --diff-filter=ACMR) # baseのHEADとその一つ前を比較
git archive HEAD ${diff_files} -o delivery.zip
- name: upload zip
uses: actions/upload-artifact@v3
with:
name: delivery
path: ./delivery.zip
作業イメージ
上記ワークフローを使用する際は
-
release
→master
にPRをmergeすることで実行 - 差分があれば実行完了後にArtifactsからZIPをダウンロードできる
という感じになります。
※ブランチ名とかパス名は任意です
ハマったこと
Github Actions素人なので構文の調査に結構時間がかりました。
特に当初はbaseブランチとheadブランチを比較して差分を取る方針で考えていたのですが、冷静に考えればmergeをトリガーにしている都合上、merge後は両者で差分が取れない(存在しない)ことに結構後になって気づきました。
ブランチの取得方法については下記記事を参考にさせていただきました。
GitHub Actions の Workflow 実行内で Ref(ブランチ名)を取得する方法
以上です。