【macOS Catalina】Catalinaでstderr: git-lfs filter-process: git-lfs: command not foundに対応する【Jenkins】

## はじめに

:::note warn
23/06/21追記
Big Sur以降ではこの記事の方法でもエラーが出るようです。

自分の環境では、こちらの記事のJenkinsの環境変数でPATHを作る方法を試したらうまくいきました。

>【M1 BigSur】JenkinsからGit(LFS)のチェックアウトからUnityへのビルドまで(Github) - Qiita
https://qiita.com/im0039kp/items/d8913215047f508c7e74#%E3%83%93%E3%83%AB%E3%83%89%E6%99%82%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC

Jenkins管理→システム設定→グローバルプロパティの項目の環境変数にチェックを入れて
```
キー
PATH
値
$PATH:/usr/local/bin
```
と入力して設定を保存すればOKでした。

引き続き、シンボリックリンクを使う方法もあるみたいですが、Monterey環境だとmountフォルダを作ってエラーを回避する方法でもエラーになってしまったので、オススメしません。

参考
>「macOS Big Sur 」でgit-lfs filter-process: git-lfs: command not foundに対応する
https://builtfunc.com/news/2220/

:::

以下の記事を参考にgit lfsのコマンドが通らない問題を対処していたらCatalina特有の問題にぶつかりました。

> 【Jenkins】stderr: git-lfs filter-process: git-lfs: command not found - コガネブログ
> http://baba-s.hatenablog.com/entry/2019/05/19/214600

2019年のMacBookなので、Mojaveにダウングレードすることも出来ず、一瞬Macを買い直そうかと思いましたが、なんとかする方法があったのでJenkinsで「git lfs」コマンドを通すまでの一連の設定方法を記事にしました（大体上記の記事とおんなじです）

## 環境
MacBook Pro(16-inch,2019)
macOS Catalina 10.15.2
Jenkins 2.204.1
git 2.25.0
Git LFS 2.9.2
(git、GitLFSはインストール済み)
(gitリポジトリにはGitLFSが入っています)

## 概要
上記のMacBookでgit cloneするだけのテストジョブを作っていたところ以下のようなエラーが出ました。

```
stderr: git-lfs filter-process: git-lfs: command not found
```

上記の環境の通り、GitLFSはインストール済みです。が、Jenkinsからの実行だとコマンドが通らないようなので、通るように設定します。

## 対応
原因はGitLFSの実行ファイルが「/usr/local/bin/」にあり、Jenkinsからだとパスが通らない為になります。
なので、シンボリックリンクを作ってパスが通るようにします。

### SIPを無効化する
ということで、「/usr/bin/」にシンボリックリンクを作るのですが、システム保護（SIP）があるので無効化します。

* まず、Macをリカバリーモードで起動します。
一度電源を切り、Cmd+Rを押しながらMacを起動します（リンゴマークが出れば離してOK）
* 管理者アカウントのアイコンが表示されたウィンドウが出てくるので「次へ」をクリックし、パスワードを入力、ログインします。
* 画面上部のメニューバーから「ユーティリティ→ターミナル」をクリック
* ターミナルで``csrutil disable``を実行し、再起動します
* これでSIPが無効化されます。

> 初心者向け　MacでOperation not permittedの解決方法 - Qiita
> https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d

こちらの記事に写真付きで解説されていますのでよく分からなかったら併せて見ると良いかも。

この設定をしないと``Operation not permitted``と怒られます。

### (Catalina)「/usr/bin/」の読み取り専用を一時的に無効化する

Catalinaでは「usr」などのディレクトリが標準で読み取り専用になります。

> macOS 10.15 CatalinaでファイルシステムがRead-Onlyになる仕様はオプトアウトなしで、完全に無効にすることは不可能。 | AAPL Ch.
> https://applech2.com/archives/20190610-read-only-system-volume-apfs-refresh.html

したがって、記事の通りに「usr/bin」にシンボリックリンクを作ろうとすると``ln: cannot create /usr/bin//git-lfs : Read-only file system``と怒られます。

なので下記のコマンドを実行します。

```
sudo mount -uw /
```

この設定は再起動すると元に戻るので注意してください。

### シンボリックリンクを作る

以下のコマンドを実行します

```
sudo ln -s /usr/local/bin/git-lfs /usr/bin/
```

これまでの設定がうまくいっていれば、コマンドが通るはずです。

以上で、git lfsコマンドが通るようになり、GitLFSを使っているリポジトリでもクローンできるようになったはずです。

### Jenkinsのジョブで「Git LFS pull after checkout」を追加
「ソースコード管理→追加処理」から「Git LFS pull after checkout」を選択して、処理を追加します。
これを忘れるとUnityから開けないファイルが発生するようです。

## おわりに
記事を書きながら調べてみるとPATHを設定するシェルを書く解決方法もあるみたいです。

> [JENKINS-52857] Cannot find git-lfs when it is not installed in /usr/bin/ - Jenkins JIRA
> https://issues.jenkins-ci.org/browse/JENKINS-52857?focusedCommentId=380803&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-380803

今回はやりませんでしたが、ご参考までに。

Catalinaでは、今回の問題以外にも、UnityがHub経由から出ないとインストールできない問題があったり色々悩まされることが多いです。つらい。

## 参考文献
・初心者向け　MacでOperation not permittedの解決方法 - Qiita
https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d

・SIP is disabled, but /usr/bin is write protected anyway (macOS Catalina beta 10.5) - Stack Overflow
https://stackoverflow.com/questions/57440334/sip-is-disabled-but-usr-bin-is-write-protected-anyway-macos-catalina-beta-10