
本項のまとめ
- Azure Pipelines は、明示的に設定しないと Git LFS が有効にならない
- ファイルは存在するけどファイルサイズがおかしい(異常に小さくなる)場合は、リポジトリで Git LFS が使われていないか確認
- Azure Pipelines で Git LFS を使うには、チェックアウト処理のカスタム設定が必要
Git LFS を使った Azure Pipelines の挙動
Git リポジトリでバイナリファイルを取り扱う場合には、 Git LFS を活用することが多いと思います。 Git LFS が有効になったリポジトリには、 .gitattribute ファイルに以下のような設定が追加されています。
*.png filter=lfs diff=lfs merge=lfs -text
Azure Pipelines で Git LFS が有効になったリポジトリを利用したときの挙動を確認してみます。 上掲の .gitattribute ファイルの入った以下のようなリポジトリを準備します。 Git LFS に放り込まれる *.png のファイルが2つ確認できると思います。

チェックアウト時の挙動を確認したいので、取得したファイルをアップロードするだけの以下のような処理を Azure Pipelines で実行してみます。
trigger: none pool: vmImage: ubuntu-latest steps: - task: PublishPipelineArtifact@1 inputs: targetPath: '$(Build.Repository.LocalPath)' artifact: 'assets' publishLocation: 'pipeline'
発行されたファイルをダウンロードして展開してみると、以下のようになります。

パイプライン内でファイルの取得はできているようですが、 *.png ファイルのサイズがだいぶおかしいです。 もともとのファイルは以下のように 100KB くらいあるはずなのに、パイプラインで取得したファイルは 1KB しかありません。

これは、 Azure Pipelines の既定のチェックアウト処理で Git LFS が正常に処理されていないことを表しています。 実際に取得した *.png ファイルの中身を確認してみましょう(一部マスクしています)。
$ cat tool-screen.png version https://git-lfs.github.com/spec/v1 oid sha256:b0964xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx size 200998
Git LFS のポインターとなっていることが確認できます。 当然画像ファイルとして開こうとしても、エラーになって開けません。

Azure Pipelines で Git LFS を使う
Azure Pipelines で Git LFS を使うのであれば、明示的に Git LFS を有効にしてあげます。
Azure Pipelines の yaml ファイルを編集し、 Git LFS のファイルを取得するように checkout タスクを使って明示します。
trigger: none pool: vmImage: ubuntu-latest steps: - checkout: self lfs: true - task: PublishPipelineArtifact@1 inputs: targetPath: '$(Build.Repository.LocalPath)' artifact: 'assets' publishLocation: 'pipeline'
Azure Pipelines は、何も設定しないと checkout: self を既定値のまま実行します。
Git LFS は既定で無効となっているため、既定値のままでは正常にファイルを取得できなかったんですね。
上記の例のように checkout タスクを明示的に記述すると、既定の設定を上書きできます。
cehckout タスクには、ほかにも様々な設定があります。
詳細は以下を参照してください。
さて、このパイプラインを実行し、発行されたファイルをダウンロードしてみると以下のようになりました。

Git LFS に登録したファイルも、正しく取得できていることを確認できます。
まとめ
Azure Pipelines で Git LFS に登録したファイルを使用する場合は、 checkout タスクを yaml 内に記述し、 lfs オプションを有効にしなければなりません。
Git LFS が無効の場合も、ポインターのファイルは存在しますし、パット見た感じ動いているように見えてしまいまうのが厄介な点だと思います。
多くの場合 Git LFS に登録するファイルは、 CI などでファイルの中身まで確認されないものですし、気づきにくいのが厄介なところですね。