要約
Git 2.18以降が利用できない環境で- uses: actions/checkout@v4
を行うと、REST APIからファイルをダウンロードするため、.gitディレクトリが作成されない。
経緯
GitHub Actionsのself-hosted runner上でコードの自動フォーマットをして開発環境を整えようと思いつく。適当な小さいdocker imageを利用して、- uses: actions/checkout@v4
をする。コードの自動フォーマット、修正箇所を自動コミットしようとした所でエラー。
git: command not found
どうやらdocker imageが小さすぎてgitが入っていないらしい。ちなみにこの時点でのworkflowを抜粋するとこんな感じ。
name: auto format code
on: [pull_request]
env:
TARGET_BRANCH: ${{ github.base_ref }}
jobs:
build:
runs-on: self-hosted
container: python:3.8-slim
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0
.
.
.# format code
.
.
- name: commit
run: git commit hogefuga
動作検証のためにとりあえず動いてほしい。取り急ぎworkflowにRUN apt update -y
とRUN apt install git -y
を追加して再度実行。
fatal: not a git repository (or any of the parent directories): .git
なぜ?????とりあえずls -la
で確認したら確かに.gitディレクトリが存在しない。
原因
.gitが無いのであればおそらくcheckoutに問題があるだろう。ということでドキュメントを確認する。
When Git 2.18 or higher is not in your PATH, falls back to the REST API to download the files.
これじゃーん。原因はgitをインストールする前にcheckoutしていたことだった。
name: auto format code
on: [pull_request]
env:
TARGET_BRANCH: ${{ github.base_ref }}
jobs:
build:
runs-on: self-hosted
container: python:3.8-slim
permissions:
contents: write
steps:
- name: Checkout code # gitがないので、REST APIからファイルをダウンロード
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Install Git
run: apt-get update && apt-get install -y git
.
.
.# format code
.
.
- name: commit # .gitファイルがないため失敗する
run: git commit hogefuga
解決策としては先にgitをインストールするか、gitの入ったimageを利用するかになる。そもそもgitが入っていないのにcheckoutに成功している時点で疑問を感じるべきだったけど、self-hosted runner上でGitHub Actionsを利用するが初めてだったので、別のところに問題があるんじゃないかと疑いすぎてしまった。 まぁまた一つ賢くなったのでよしとしましょう。