ツナ缶雑記

ぐうたらSEのブログです。主にマイクロソフト系技術を中心に扱います。たまに技術と関係ないことも書きます。

Azure Pipelines で Git LFS を有効にする方法

本項のまとめ

  • 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 タスクには、ほかにも様々な設定があります。 詳細は以下を参照してください。

learn.microsoft.com

さて、このパイプラインを実行し、発行されたファイルをダウンロードしてみると以下のようになりました。

Git LFSを有効にした場合

Git LFS に登録したファイルも、正しく取得できていることを確認できます。

まとめ

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