LoginSignup
10
8

リポジトリの一部分だけcheckoutできるsparse-checkoutがactions/checkout@v4に来てた

Last updated at Posted at 2023-10-19

正確には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を使っている場合は秒単位での課金になりますので、こういった細かいテクニックを使ってガンガン節約していきましょう。

それでは。

10
8
0

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
  3. You can use dark theme
What you can do with signing up
10
8