Git-LFS + Provisioning Tool (Ansible/Itamae etc...)
概要
Git-LFSを使って、Provisioningで使う *.tar.gz
ファイルの管理を楽にする。という対応をしたので
今回はそれのご紹介。
私がItamaeのコードを書いて、実行していて、ファイルのDownloadでよく落ちるレシピがありました。 最近は完全に動かなくなってしまったので対策を考えたのが今回の対応です。
結論
やりたかった事
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をリポジトリにしたとして、
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です。