[03] docker-composeを活用して即座にGitLabを立てて使ってみる ... Git LFS を使う

# はじめに

GitLab を試したくてローカルPC 上に立てることにしたときの記録である.
また、別PC でも素早く環境構築ができるように docker-compose を使うことにした.
なお、試行錯誤の中での記録なので誤りもあると思う.

[前回](https://qiita.com/robozushi10/items/1b820fb0b7f30799462f)は リポジトリを作成して、git clone 〜 push までを実施した.
**今回は Git LFS を使ってみる. [^1]**

## 参考サイトおよび書籍

|URL|
|:--|
|https://www.nemotos.net/?p=3425|
|https://docs.gitlab.com/ee/topics/git/lfs/|
|https://qiita.com/takish/items/4b397caa5549a39a8194|
|https://askubuntu.com/questions/1032565/how-to-upgrade-git-lfs-on-ubuntu-16-lts|
|https://cimadai.hateblo.jp/entry/gitlab_gitlfs|
|https://stackoverflow.com/questions/60349972/git-lfs-give-x509-certificate-signed-by-unknown-authority|
|https://github.com/git-lfs/git-lfs/issues/1047|
|[GitLab実践ガイド (impress top gear) 北山 晋吾](https://www.amazon.co.jp/dp/B079DL362C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)|


## 環境

```
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
```

## 手順

Git LFS は次の条件で使われるようである.
・「`リポジトリ単位`」&&「`指定したファイル名パターン`」&&「`100MB 以上のデータ`」

今回は、**拡張子「zip」、サイズ「123MB」**のデータで検証する.


### 1. git-lfs をインストールする

バージョン 2.3.4 がインストールされた

```bash
$ sudo apt install git-lfs
$ git lfs version
git-lfs/2.3.4 (GitHub; linux amd64; go 1.8.3)
```

個人的な理由[^2]により 2.13.3 へと upgrade する

```bash
$ curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
$ sudo apt install git-lfs
$ git lfs version
git-lfs/2.13.3 (GitHub; linux amd64; go 1.16.2)
```

### 2. リポジトリ「mysoft」を clone する

`mysoft` は [前回](https://qiita.com/robozushi10/items/1b820fb0b7f30799462f) 作成したリポジトリ (Project) である.

```bash
$ git clone ssh://git@server_01/02_software/mysoft
$ cd mysoft
```

### 3. リポジトリ「mysoft」で Git LFS が使えるようにする

リポジトリ単位である

```bash
$ git lfs install
```

### 4. 拡張子「zip」が LFS 対象となるように「.gitattributes」をリポジトリに設定する

```bash
#! *.zip を LFS 対象として登録する
$ git lfs track "*.zip"
Tracking "*.zip"
 
#! 登録できたか確認する
$ git lfs track
Listing tracked patterns
    *.zip (.gitattributes)

#! *.zip が LFS 対象になったことは、ファイル「.gitattributes」に書き出されている
$ cat .gitattributes 
*.zip filter=lfs diff=lfs merge=lfs -text

#! ファイル「`./.gitattributes`」をリポジトリに push する.
$ git add .gitattributes
$ git commit -m '.gitattributes を追加'
$ git push origin master
```

### 5. 投稿前の "おまじない" をする

次の 2つを実施する[^3]

#### 5-1.

ここでは「`https://server_01:59443/02_software/ok.git/info/lfs`」の前後を、
それぞれ「`lfs.`」「`.locksverify`」で囲んでいる.

```bash
$ git config lfs.https://server_01:59443/02_software/ok.git/info/lfs.locksverify false
```

#### 5-2.

```bash
$ git config http.sslverify false
```

恒久対応したければ次をする

```
$ git config --global http.sslVerify false
```


#### 補足1.

上記 2コマンドを実行したことで、 **./.git/config** に対して次の 4行が追加されている.

```
[lfs "https://server_01:59443/02_software/ok.git/info/lfs"]
	locksverify = false
[http]
	sslverify = false
```

#### 補足2. エラー「x509: certificate is not valid for any names, but wanted to match lfs push」

上記「[5-2](#5-2)」を実施することで解消した

#### 補足3. 「5-1」のパスはブラウザでアクセスしてみれば良い

上記の場合だと 

「`https://server_01:59443/02_software/ok.git/info/lfs`」+「`/objects/batch`」より、
↓
`https://server_01:59443/02_software/ok.git/info/lfs/objects/batch`
にアクセスして、次のような表示がされていれば良い.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/12481032-0deb-7427-c6c7-c019ddb7edbf.png)





### 6. LFS の検証のために 100MB 超の zip データを作り、push する.

下記🛑より、123MB が push されている.

```bash
#! とりあえず 123MB の拡張子 zip データを作る
$ dd if=/dev/zero of=123MB.zip bs=1M count=123

#! git add 〜 commit をする
$ git add 123MB.zip 
#! このとき「git lfs ls-files」というコマンドで確認できる.
$ git lfs ls-files
8cb7b1825a * 123MB.zip
$ git commit -m '123MB.zip を追加する'

#! push をする.
#! このとき GitLab への認証が求められる (本記事では「root」「rootroot」を入力する)
$ git push origin master
Locking support detected on remote "origin". Consider enabling it with:
  $ git config lfs.https://server_01/02_software/ok.git/info/lfs.locksverify true
Uploading LFS objects: 100% (1/1), 129 MB | 62 MB/s, done. 🛑                                                                                                                        
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 391 bytes | 391.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://server_01/02_software/ok
   8639b5a..c90c782  master -> master
```

[本 docker-compose.yml の場合](https://qiita.com/robozushi10/items/6ea798fd8f9863ef5439#1-docker-composeyml-%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)、LFS 用のデータ置き場は GitLab コンテナの中である↓

```
$ docker-compose exec gitlab bash -c 'ls -ltr /var/opt/gitlab/gitlab-rails/shared/lfs-objects/'
```

### 7. LFS を使っているリポジトリを clone する場合

```bash
$ git lfs clone ssh://git@server_01/02_software/mysoft
```

　

以上.


[^1]: git-media から Git LFS への置き換え案件があるかも知れないため
[^2]: 職場での要望で git-lfs のバージョンアップ方法を手順書に記してと言われたため
[^3]: "おまじない" という単語は本意では無いが、そう言いたくなるほどハマった.