Skip to content
This repository has been archived by the owner on Nov 24, 2023. It is now read-only.

Latest commit

 

History

History
312 lines (266 loc) · 10.2 KB

README.ja.md

File metadata and controls

312 lines (266 loc) · 10.2 KB

Get Diff Action

CI Status codecov CodeFactor License: MIT

Read this in other languages: English, 日本語.

これは git diff を取得するための GitHub Actions です。
env または actionsの出力 から差分を得ることができます。

Table of Contents

Details

generated with TOC Generator

スクリーンショット

  1. Workflow の例

    Example workflow

  2. スキップ

    Skip

使用方法

基本的な使い方

on: pull_request
name: CI
jobs:
  eslint:
    name: ESLint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v6
        with:
          PATTERNS: |
            +(src|__tests__)/**/*.ts
            !src/exclude.ts
          FILES: |
            yarn.lock
            .eslintrc
      - name: Install Package dependencies
        run: yarn install
        if: env.GIT_DIFF
      - name: Check code style
        # 差分がある場合だけチェック
        run: yarn eslint ${{ env.GIT_DIFF }}
        if: env.GIT_DIFF

指定可能なパターンの詳細

マッチするファイルの例

  • src/main.ts
  • src/utils/abc.ts
  • __tests__/test.ts
  • yarn.lock
  • .eslintrc
  • anywhere/yarn.lock

マッチしないファイルの例

  • main.ts
  • src/xyz.txt
  • src/exclude.ts

envの例

name value
GIT_DIFF 'src/main.ts' 'src/utils/abc.ts' '__tests__/test.ts' 'yarn.lock' '.eslintrc' 'anywhere/yarn.lock'
GIT_DIFF_FILTERED 'src/main.ts' 'src/utils/abc.ts' '__tests__/test.ts'
MATCHED_FILES 'yarn.lock' '.eslintrc' 'anywhere/yarn.lock'

もう少し細かく動作を指定

on: pull_request
name: CI
jobs:
  eslint:
    name: ESLint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v6
        with:
          PATTERNS: |
            +(src|__tests__)/**/*.ts
          FILES: |
            yarn.lock
            .eslintrc
      - name: Install Package dependencies
        run: yarn install
        if: env.GIT_DIFF
      - name: Check code style
        # 差分があるソースファイルだけチェック
        run: yarn eslint ${{ env.GIT_DIFF_FILTERED }}  # e.g. yarn eslint 'src/main.ts' '__tests__/test.ts'
        if: env.GIT_DIFF && !env.MATCHED_FILES
      - name: Check code style
        # 差分がある場合だけチェック (yarn.lock か .eslintrc に変更があった場合はすべてでlintを実行)
        run: yarn lint
        if: env.GIT_DIFF && env.MATCHED_FILES

以下のソースコードに差分がない場合、この Workflow はコードのスタイルチェックをスキップします。

  • src/**/*.ts
  • __tests__/**/*.ts

動作

  1. git diff を取得

    git diff ${FROM}${DOT}${TO} '--diff-filter=${DIFF_FILTER}' --name-only

    例:(default)

    DOT: '...'
    DIFF_FILTER: 'AMRC'

    =>

    git diff ${FROM}...${TO} '--diff-filter=AMRC' --name-only

    =>

    .github/workflows/ci.yml
    __tests__/utils/command.test.ts
    package.json
    src/main.ts
    src/utils/command.ts
    src/docs.md
    yarn.lock
    

    ${FROM}, ${TO}

  2. PATTERNS オプションによるフィルタ

    例:

    PATTERNS: |
      src/**/*.+(ts|md)
      !src/utils/*

    =>

    src/main.ts
    src/docs.md
    
  3. FILES オプションによるフィルタ

    e.g.

    FILES: package.json

    =>

    package.json
    anywhere/package.json
    
  4. ABSOLUTE オプションがtrue場合に絶対パスに変換 (default: false)

    例:

    /home/runner/work/my-repo-name/my-repo-name/src/main.ts
    /home/runner/work/my-repo-name/my-repo-name/src/docs.md
    
  5. SEPARATOR オプションの値で結合

    例:(default: false)

    SEPARATOR: ' '

    =>

    /home/runner/work/my-repo-name/my-repo-name/src/main.ts /home/runner/work/my-repo-name/my-repo-name/src/docs.md
    

出力

name description e.g.
diff 差分のあるファイルの結果
SET_ENV_NAME(default: GIT_DIFF) が設定されている場合、その名前で環境変数が設定されます
src/main.ts src/docs.md
count 差分のあるファイル数
SET_ENV_NAME_COUNT(default: '') が設定されている場合、その名前で環境変数が設定されます
100
insertions 追加された行数 (GET_FILE_DIFFtrue の場合のみ利用可能)
SET_ENV_NAME_INSERTIONS(default: '') が設定されている場合、その名前で環境変数が設定されます
100
deletions 削除された行数 (GET_FILE_DIFFtrue の場合のみ利用可能)
SET_ENV_NAME_DELETIONS(default: '') が設定されている場合、その名前で環境変数が設定されます
100
lines 追加された行数と削除された行数の和 (GET_FILE_DIFFtrue の場合のみ利用可能)
SET_ENV_NAME_LINES(default: '') が設定されている場合、その名前で環境変数が設定されます
200

Action イベント詳細

対象イベント

eventName action
pull_request opened, reopened, synchronize, closed, ready_for_review
push *

もしこれ以外のイベントで呼ばれた場合、結果は空になります。

補足

FROM, TO

condition FROM TO
tag push --- ---
pull request pull.base.ref (e.g. main) context.ref (e.g. refs/pull/123/merge)
push (has related pull request) pull.base.ref (e.g. main) refs/pull/${pull.number}/merge (e.g. refs/pull/123/merge)
context.payload.before = '000...000' default branch (e.g. main) context.payload.after
else context.payload.before context.payload.after

下書きのプルリクエストで最新コミット差分のみをチェックする場合

on:
  pull_request:
    types: [opened, reopened, synchronize, closed, ready_for_review]

jobs:
  eslint:
    name: ESLint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v6
        with:
          CHECK_ONLY_COMMIT_WHEN_DRAFT: true
      # ...

Json形式で結果を取得する場合

on: pull_request
name: CI
jobs:
  dump:
    name: Dump
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v6
        with:
          PATTERNS: |
            +(src|__tests__)/**/*.ts
            !src/exclude.ts
          FORMAT: json
      - run: echo '${{ env.GIT_DIFF }}' | jq .

Result:

> Run echo '["yarn.lock"]' | jq .
[
  "yarn.lock"
]

相対パスを指定

GitHub Actions は usesworking-directory を指定できないため、モノレポ構成などで個別に実行したい場合に対応できませんが、RELATIVE オプションを指定すると git diff--relative=<RELATIVE> として使用されます。

https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---relativeltpathgt

on: pull_request
name: CI
jobs:
  dump:
    name: Dump
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v6
        with:
          PATTERNS: '*.ts'
          RELATIVE: 'src/abc'
      - run: echo ${{ env.GIT_DIFF }}

src/abc/test1.ts, src/abc/test2.ts, src/abc/test3.txt, src/test4.ts のファイルがある場合、結果は以下のようになります。

> Run echo 'test1.ts' 'test2.ts'
test1.ts test2.ts

Author

GitHub (Technote)

Blog