Read this in other languages: English, 日本語.
これは git diff
を取得するための GitHub Actions です。
env または actionsの出力 から差分を得ることができます。
基本的な使い方
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
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
-
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
-
PATTERNS
オプションによるフィルタ例:
PATTERNS: | src/**/*.+(ts|md) !src/utils/*
=>
src/main.ts src/docs.md
-
FILES
オプションによるフィルタe.g.
FILES: package.json
=>
package.json anywhere/package.json
-
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
-
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_DIFF が true の場合のみ利用可能)SET_ENV_NAME_INSERTIONS (default: '' ) が設定されている場合、その名前で環境変数が設定されます |
100 |
deletions | 削除された行数 (GET_FILE_DIFF が true の場合のみ利用可能)SET_ENV_NAME_DELETIONS (default: '' ) が設定されている場合、その名前で環境変数が設定されます |
100 |
lines | 追加された行数と削除された行数の和 (GET_FILE_DIFF が true の場合のみ利用可能)SET_ENV_NAME_LINES (default: '' ) が設定されている場合、その名前で環境変数が設定されます |
200 |
eventName | action |
---|---|
pull_request | opened, reopened, synchronize, closed, ready_for_review |
push | * |
もしこれ以外のイベントで呼ばれた場合、結果は空になります。
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
# ...
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 は uses
に working-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