Chef で Bitbucket のプライベートリポジトリから Java コードを clone してきて deploy

掲題の通り、Chef で環境を構築してそのままアプリをデプロイしたい時の設定です。

Tomcat 前提ですが、Tomcat のインストール部分は省略してます。また、ここでは root ユーザでやってますが、適切なユーザを作成してファイル・ディレクトリの権限を付与した方がいいです。

Chef の git resource を使って bitbucket から clone

git "/tmp/app" do
  repository "git@bitbucket.org:my-repository/my-app.git"
  ssh_wrapper "/root/.ssh/ssh4bitbucket.sh"
end

git — Chef Docs

プライベートリポジトリだと Permission denied とか言われるはずなので、公開鍵認証を使用します。 鍵の作り方等は以下を参照してください。

git で ssh 使うために秘密鍵を配置

files/default に秘密鍵を置き、 Bitbucket には公開鍵を登録しておきます。

directory "/root/.ssh" do
  action :create
  mode   "700"
end
cookbook_file "/root/.ssh/id_rsa" do
  source "id_rsa"
  mode   "600"
end

directory — Chef Docs cookbook_file — Chef Docs

git resource で使用する ssh_wrapper を配置

ssh_wrapper では以下の2点を指定してます。

  • 秘密鍵の指定
  • ssh 接続時に Host Key のチェックで引っかかるので OFF にする
file "/root/.ssh/ssh4bitbucket.sh" do
  mode "700"
  content <<-EOL
    #!/bin/bash
    ssh -i /root/.ssh/id_rsa -o "StrictHostKeyChecking=no" "$@"
  EOL
end

file — Chef Docs

war ファイルを作成して配置

Maven プロジェクトを前提としています。

適切な resource や Cookbook が見つからなかったので、Shell でやります。

script "complie source code and set war file" do
  interpreter "bash"
  user        "root"
  code <<-EOL
    cd /tmp/app
    mvn install
    mvn package
    chown root:tomcat target/app.war
    mv -f target/app.war /usr/share/tomcat/webapp/app.war
  EOL
end

script — Chef Docs

まとめ

以上です。

ちなみに deploy という resource もChef には有るのですが、migrate のフェーズはあるものの、ビルドするタイミングがなかったので使用してません。ビルドの必要のない言語とかだとこの deploy を使ったほうがスッキリかけるかもしれません。