なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

GitHub Actions で自前の LFS サーバーに向いているアセットもチェックアウトしたい

年末に何してるんっていう話なんですが、わたしは過去の記事にもあるように、 Git LFS サーバーを自前運用しています。
そこで困るのが、 GitHub Actions で with.lfs: true とした場合の挙動です。

通常の GitHub にすべてを任せているときと同じ感じでやると、 .lfsconfig が読み込まれず、リポジトリ本体経由でアクセスされます。

# ダメな例
name: "Release VPMPackage by Pushing Tag"

on:
  push:
  workflow_dispatch:

jobs:
  packaging:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          lfs: true

ではどうするのか?という話ですが、まずは lfs: true を使うのではなく、自力で LFS データを引っぱってくる必要があります。
例えば、わたしの場合は以下のようにローカルの .gitconfig.git/config にあるものから、以下のように設定しました。

# 場合によっては動く例
name: "Release VPMPackage by Pushing Tag"

on:
  push:
  workflow_dispatch:

jobs:
  packaging:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          lfs: false

      - run: |
          git config --global credential.https://git-lfs.natsuneko.moe.username $GITHUB_ACTOR
          git config --global credential.https://git-lfs.natsuneko.moe.helper '!f() { test "$1" = get && echo "password=$GITHUB_TOKEN"; }; f'
          git config --global lfs.repositoryformatversion 0
          git config --global lfs.https://git-lfs.natsuneko.moe/$GITHUB_REPOSITORY/.access basic
          git config --global lfs.https://git-lfs.natsuneko.moe/$GITHUB_REPOSITORY/.locksverify false

          git lfs install
          git lfs pull
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

これは、自前の LFS サーバーで認証する際に使用すべきユーザーとアクセストークン、認証方法を設定しています。
LFS サーバーが正しく実装されている場合は、これで動作します。

正しく実装されていない場合、具体的には上記わたしの記事のように、リポジトリの permission を見ている場合は、正しくないので動きません。
GitHub の仕様で Installation Token といった種類のアクセストークンには、上記フィールドは設定されませんが、 git pull などの通常の Git 操作は可能な状態で渡されています。
そのため、リポジトリメタデータへとアクセスできれば pull 可能、 push については基本拒否といった形でレスポンスを返す実装に変更する必要がありました。

コミット履歴: fix: support installation tokens (such as GitHub Actions)

ということで、情報が少ない Git LFS サーバーはつらいよ、といった話でした (でも安いんですよね......)