ZEALOTエンジニアブログ

外部に接続できないサーバにgitを使ってリリースを行う

Pocket

あるプロジェクトで使用する本番サーバが外部に接続できないという制約があるなか、アプリケーションをリリースする必要があったのですが、外部に接続できないため、githubなどからアプリケーションをpullしてくることが出来ないのでどうしたものかなと困っておりました。tarで固めてscpで持って行って展開してリリース、というのも面倒です。そもそも、git pullするくらいでリリース出来るものをそんな手間をかけてやりたくないです。

そこで、git –bareを使ってローカルリポジトリぽいものを作ると色々うまく行ったのでまとめてみます。

最終的なイメージは以下の様な感じです。

git_ssh_overview

また、このサーバは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にサーバ情報を記述することにしました。

このように設定をしておくと、以下のsshコマンドでサーバに接続出来るようになります。

2. gitのプロジェクトにリモートサーバの情報を追加

git remote コマンドでリモートリポジトリを追加します。ここではまだ作成していないですが、リモートサーバの「/home/zealot/git/example.git」ディレクトリを指定しています。

3. リモートサーバ側の設定

2で指定したリモートサーバのディレクトリを作成します。git –bareして空っぽのリポジトリを作成します。

4. ローカルからリモートサーバにpushする

以下の様な感じで、3でつくったリポジトリにpushします。

タグも作成しているのなら、以下のようにしてpushします。

(タグが出てきたのは、このあとのリリースのところでタグを使いたかったからです・・。)

4. リモートサーバでのリリース作業

さて、/home/zealot/git/example.gitにリポジトリが出来たので、リリースする際もここからソースを取得してくる感じになります。今回は、指定したバージョン(タグ)のブランチを作成してリリースする方法を取りたいと思います。

それでは、アプリケーションを/home/zealot/app/exampleにリリースする前提で話を進めます。

まず、appディレクトリを作成し、/home/zealot/git/example.gitをcloneします。

次に、v1.0.0と付けられたタグと同じ名前でブランチを作成してcheckoutします。

基本はこれでリリース完了です。こうしてバージョンごとのブランチを切っておくことで、リリースがうまく行かなくて元に戻したいときにはcheckoutするだけでロールバックすることができますね。

5. 日々の作業

開発者はいつものようにコードを書いてコミットしてGithub等にpushします。
リリース担当者は特定のコミットでタグをきり、Github等にpushします。(これもいつもの通り)
次にリリース担当者は、Githubにpushしたように本番サーバにpushします。

次にリモートサーバでリリース作業を行います。今回はcloneではなくfetchを使います。

これで完了です。

というわけで、外部に接続できなくてもssh越しにリポジトリにpushして、リリースを行うことが出来るようになりました。リリース作業自体もほとんどいつものgitの操作でできるので簡単でいいですね。

Pocket