外部に接続できないサーバにgitを使ってリリースを行う
あるプロジェクトで使用する本番サーバが外部に接続できないという制約があるなか、アプリケーションをリリースする必要があったのですが、外部に接続できないため、githubなどからアプリケーションをpullしてくることが出来ないのでどうしたものかなと困っておりました。tarで固めてscpで持って行って展開してリリース、というのも面倒です。そもそも、git pullするくらいでリリース出来るものをそんな手間をかけてやりたくないです。
そこで、git –bareを使ってローカルリポジトリぽいものを作ると色々うまく行ったのでまとめてみます。
最終的なイメージは以下の様な感じです。
また、このサーバはsshのポートが22ではなく、パスワード認証もサポートしていないというものでしたので、まず、ローカルのSSHの設定から行うことにしました。
ちなみに、SSH接続するための情報は以下のものを前提に行います。
- IP: xxx.xxx.xxx.xxx
- SSHポート: xxxx
- 鍵ファイル: ~/.ssh/id_dsa_zealot_example_server
- ログインユーザ名: zealot
1. ローカルのSSHの設定
ポート名が違うくらいなら、git remote add でポート指定して設定すればよかったのですが、鍵ファイルを指定することはできなかったので、~/.ssh/configにサーバ情報を記述することにしました。
$ vim ~/.ssh/config
Host zealot_example_server
HostName xxx.xxx.xxx.xxx
Port xxxx
IdentityFile ~/.ssh/id_dsa_zealot_example_server
User zealot
このように設定をしておくと、以下のsshコマンドでサーバに接続出来るようになります。
$ ssh zealot_example_server
2. gitのプロジェクトにリモートサーバの情報を追加
git remote コマンドでリモートリポジトリを追加します。ここではまだ作成していないですが、リモートサーバの「/home/zealot/git/example.git」ディレクトリを指定しています。
$ git remote add production ssh://zealot_example_server/home/zealot/git/example.git
3. リモートサーバ側の設定
2で指定したリモートサーバのディレクトリを作成します。git –bareして空っぽのリポジトリを作成します。
$ ssh zealot_example_server
$ mkdir ~/git/example.git
$ cd ~/git/example.git
$ git --bare init
4. ローカルからリモートサーバにpushする
以下の様な感じで、3でつくったリポジトリにpushします。
$ git push production master
タグも作成しているのなら、以下のようにしてpushします。
$ git push production master v1.0.0
(タグが出てきたのは、このあとのリリースのところでタグを使いたかったからです・・。)
4. リモートサーバでのリリース作業
さて、/home/zealot/git/example.gitにリポジトリが出来たので、リリースする際もここからソースを取得してくる感じになります。今回は、指定したバージョン(タグ)のブランチを作成してリリースする方法を取りたいと思います。
それでは、アプリケーションを/home/zealot/app/exampleにリリースする前提で話を進めます。
まず、appディレクトリを作成し、/home/zealot/git/example.gitをcloneします。
$ mkdir ~/app
$ cd app
$ git clone /home/zealot/git/example.git
$ ls
example
次に、v1.0.0と付けられたタグと同じ名前でブランチを作成してcheckoutします。
$ cd example
$ git checkout -b v1.0.0 refs/tags/v1.0.0
基本はこれでリリース完了です。こうしてバージョンごとのブランチを切っておくことで、リリースがうまく行かなくて元に戻したいときにはcheckoutするだけでロールバックすることができますね。
5. 日々の作業
開発者はいつものようにコードを書いてコミットしてGithub等にpushします。
リリース担当者は特定のコミットでタグをきり、Github等にpushします。(これもいつもの通り)
次にリリース担当者は、Githubにpushしたように本番サーバにpushします。
$ git push production master v1.0.1
次にリモートサーバでリリース作業を行います。今回はcloneではなくfetchを使います。
$ cd app/example
$ git fetch
$ git checkout -b v1.0.1 refs/tags/v1.0.1
これで完了です。
というわけで、外部に接続できなくてもssh越しにリポジトリにpushして、リリースを行うことが出来るようになりました。リリース作業自体もほとんどいつものgitの操作でできるので簡単でいいですね。