LoginSignup
1

Github ActionsでPRの差分ファイルだけをZIP化してDLする

Posted at

これは

案件の納品時、修正したファイルだけ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

作業イメージ

上記ワークフローを使用する際は

  • releasemasterにPRをmergeすることで実行
  • 差分があれば実行完了後にArtifactsからZIPをダウンロードできる

という感じになります。

※ブランチ名とかパス名は任意です

ハマったこと

Github Actions素人なので構文の調査に結構時間がかりました。

特に当初はbaseブランチとheadブランチを比較して差分を取る方針で考えていたのですが、冷静に考えればmergeをトリガーにしている都合上、merge後は両者で差分が取れない(存在しない)ことに結構後になって気づきました。

ブランチの取得方法については下記記事を参考にさせていただきました。
GitHub Actions の Workflow 実行内で Ref(ブランチ名)を取得する方法

以上です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1