イフブロ

イフブロ

インフラエンジニアのブログ

Git-LFS + Provisioning Tool (Ansible/Itamae etc...)

概要

Git-LFSを使って、Provisioningで使う *.tar.gz ファイルの管理を楽にする。という対応をしたので 今回はそれのご紹介。

私がItamaeのコードを書いて、実行していて、ファイルのDownloadでよく落ちるレシピがありました。 最近は完全に動かなくなってしまったので対策を考えたのが今回の対応です。

結論

  • Git-LFS + S3 を使うと、コミットする時にはGitのインタフェースだけで不要な作業がなく
  • モジュールも自社リポジトリで管理できる という結果を得ることができます。

やりたかった事

Itamaeの中で、 JDKのInstallをする際に JDK.tar.gzのDLがOracleサイトからできなくなりました。

以前はAcceptは クッキーに書かれていたので、それを wget のヘッダーに書くことでAcceptedな状態でDownloadができていたのですが

最近、Oracle-IDを使ってログイン状態にしないとDownloadができなくなったのです。

Java10からはOpenJDKを主体にするので http://jdk.java.net/10/ から取得可能ですが、それ以前のバージョンはOracleからDownloadしなければいけません。

なので、Oracleから手動で取得した jdk.tar.gz を自社のリポジトリサーバーにアップして、Itamaeではそこから取得しようと考えました。

考えたこと

同じリポジトリアーカイブをコミットすると以下のデメリットがあるので不可能でした

  • Githubにアップロードできるサイズの上限をオーバーする
  • git clone が重くなる
  • itamaeのソースをサーバーにばらまくのが遅くなる
  • Private Repoなら取得の際に認証を通さないといけなくて手間

自前のリポジトリサーバーを立てる事にしたけど、モジュールを取得してきた後にわざわざアップしたりするのめんどくさそうで・・・ 複数人の開発を考えた時にも、S3をリポジトリにしたとして、

  • IAMを複数名分発行する?
  • aws configureaws cliのセットアップが必要

Google Driveにしたとして

  • アップしたファイルを公開設定にする。毎回やる?
  • 社内のセキュリティ対策と合わないので公開設定あんまりやりたくない

他にもクラウドストレージ系はありましたが、開発のフローとは別の作業が発生するのが手間でした。

開発者にとって、どんな風にモジュールを扱えれば楽かな?と考えた時に

git lfs がマッチしました。

  • レシピを書いたコミットする一連の流れに沿って、特別な作業をしなくても *.tar.gzを置いてあげるだけであとは普通に git add git commit git push するだけでいい。
  • アーカイブファイルは自動でGithubではなくてS3に配置できる
  • アップロードする前でもDL用のURLは推測から取得できる。( push しなくても レシピが書ける)

開発の流れです

cd app_workspace/
vi hogehoge.rb
mkdir lfs
cp <downloaded file path> lfs


git add *
git commit .
git push origin master

普段の開発と作業しているフローが変わらないのがいいですね。

git-lfsの準備

git lfsは普通はGithubに向くのですがコストと、IP制限のPublicRepoとして使いたかったのでバックエンドをS3にしたいと思いました。

lfsサーバーの準備

Amazon S3 に Git LFS サーバを超簡単に立てる こちらを参考にして 日本リージョンバージョンでlfsサーバーを立てました。

その後、S3の設定で

  • Static Web Hostingを有効化
  • S3 ポリシーファイルで、オフィスやサーバーのIPからだけアクセスを許可するルールを追記

しました。

クライアント側の準備

クライアント側はgit-lfsをinstallしてgitにinstallしてあげるだけです。

brew install git-lfs
git lfs install --skip-smudge

アップロード後のURLを参照する為のコマンドを自作しました。

gitconfigに以下を追加

[alias]
        lfsurl = "!f(){ git lfs pointer --file=$1 | grep sha256 | awk -F: '{print \"https://<s3 url>/\"$2}'; };f"

こんな感じで参照できます。参照結果をレシピに記載すればOKです。 f:id:umisora2:20180621133510p:plain

総評

vimIDE で開発しているフローに、ストレスなく組み込むことができて満足です。