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

Latest commit

 

History

History
251 lines (214 loc) · 8.3 KB

README.ja.md

File metadata and controls

251 lines (214 loc) · 8.3 KB

Get Diff Action

CI Status codecov CodeFactor License: MIT

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

これは git diff を取得するための GitHub Actions です。

Table of Contents

Details

スクリーンショット

  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@v3
        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@v4
        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 追加された行数
SET_ENV_NAME_INSERTIONS(default: '') が設定されている場合、その名前で環境変数が設定されます
100
deletions 削除された行数
SET_ENV_NAME_DELETIONS(default: '') が設定されている場合、その名前で環境変数が設定されます
100
lines 追加された行数と削除された行数の和
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. master) context.ref (e.g. refs/pull/123/merge)
push (has related pull request) pull.base.ref (e.g. master) refs/pull/${pull.number}/merge (e.g. refs/pull/123/merge)
context.payload.before = '000...000' default branch (e.g. master) 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@v4
        with:
          CHECK_ONLY_COMMIT_WHEN_DRAFT: true
      # ...

Author

GitHub (Technote)

Blog