正確には3.5.3で追加されたらしい。
目次
sparse-checkoutとは?
そもそもはgitの機能で、
./
├ .git/
├ hoge/
├ fuga/
├ piyo/
└ README.md
このようなモノレポがある場合に
# CI環境の場合は`--filter=blob:none`より`--depth=1`の方がおすすめ
git clone --filter=blob:none --no-checkout https://github.com/you/your-repo
cd your-repo
git sparse-checkout set hoge
git checkout
とすると
./
└ your-repo/
├ .git/
├ hoge/
└ README.md
こんな感じで一部分だけcheckoutできますよというもの。
本筋ではないので詳しくは公式ドキュメントに譲ります。
actions/checkout@v4での使い方
参考: 公式README
上と同じモノレポで考えてみます。
1つのディレクトリだけ欲しい
- uses: actions/checkout@v4
with:
sparse-checkout: hoge
↓
./
└ your-repo/
├ .git/
├ hoge/
└ README.md
複数ディレクトリ欲しい
- uses: actions/checkout@v4
with:
sparse-checkout: |
hoge
fuga
↓
./
└ your-repo/
├ .git/
├ hoge/
├ fuga/
└ README.md
ディレクトリはいらない(トップレベルにあるファイルだけ欲しい)
- uses: actions/checkout@v4
with:
sparse-checkout: .
↓
./
└ your-repo/
├ .git/
└ README.md
指定したファイルだけ欲しい(非コーンモード)
- uses: actions/checkout@v4
with:
sparse-checkout: |
README.md
sparse-checkout-cone-mode: false # デフォルトはtrue
↓
./
└ your-repo/
├ .git/
└ README.md
今回の例では上と変わりません。コーンモードの挙動について詳しくはこちら。
モノレポではないプロジェクトにおける利点
このようにsparse-checkoutとは元来モノレポで開発を行っているプロジェクトに向けた機能ではあるものの、実は我々GitHub Actions芸人にとっても嬉しいことがあります。
それはワークフロー内で実行するスクリプトを別ファイルに切り出せることです。
- スクリプトが長くなってしまってymlの見通しが悪い
- 他のワークフローと共有したい
- 1stepだけ丁寧にデバッグしたい
- スクリプトを他の言語で書きたい
のようなニーズからスクリプトファイルを作成したり(場合によってはreusing-workflowsを作ったり)しますが、従来はこのファイルを読み込むためにリポジトリの全てをfetchする必要がありました。
- uses: actions/checkout@v4 # ←これがないと動かないのにこれが一番遅い
- uses: actions/setup-python@v4
with:
python-version: "3.11"
- run: python .github/scripts/awesome_script.py
それが今ではこう。
- uses: actions/checkout@v4
with:
sparse-checkout: .github # 速い!
- uses: actions/setup-python@v4
with:
python-version: "3.11"
- run: python .github/scripts/awesome_script.py
他にもgh
コマンドやGitHub APIを叩くために.gitだけ欲しい場合もあります。
name: PR Number
on:
workflow_dispatch:
inputs:
branch_name:
required: true
type: string
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
jobs:
search:
name: Search PR
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4 # ←これがないと動かない
with:
sparse-checkout: . # .gitディレクトリ(とトップレベルのファイル)だけ取得
- run: gh pr view ${{ inputs.branch_name }} --json number | jq -r .number
便利ですね。
おわりに
というわけで3.5.3から追加されたsparse-checkoutについてご紹介しました。特にgithub-hosted runnerを使っている場合は秒単位での課金になりますので、こういった細かいテクニックを使ってガンガン節約していきましょう。
それでは。