KDDI Web Communications

Git とスマートリリースで始める、一歩上の CMS サイト運用
コンクリートファイブジャパン株式会社 菱川 拓郎

第 2 回 Git リポジトリからテスト環境への自動デプロイ

第 1 回で、開発サイトのデータを Git のリモートリポジトリに push できるところまで設定をおこないました。ここからは CPI のサーバー上の作業になります。
第 2 回では、リモートリポジトリからソースを取得し、テストサイトに反映する設定をおこなっていきます。

テストサイトに SSH で接続する

まず、CPI のテストサイトに SSH で接続します。

$ ssh -p 10398 ab123cd456@ab123.secure.ne.jp

Welcome to FreeBSD! と表示されたら成功です。SSH を使うのが初めての方は、過去記事『いつもの作業が 10 分の 1 に「はじめてのSSH」』を参考にしてください。

https://www.cpi.ad.jp/wds/knowledge/20120829.html

CMS を動作させるための下準備

SSH でログインできたら、ドキュメントルート(html ディレクトリ)の 1 つ上の階層にいる状態だと思います。pwd コマンドで現在位置を確認したり、ls コマンドで現在のディレクトリ内のファイルを確認することができます。

% pwd
/usr/home/ab123cd456
% ls -la
total 18
drwx---r-x    5 ab123cd456  cst   512 Jul 20  2012 .
drwxr-xr-x  455 root        0    9728 Jul 17 14:33 ..
drwxr-xr-x    2 ab123cd456  cst   512 Jul 20  2012 _smartrelease_except
drwxr-xr-x    4 ab123cd456  cst   512 Oct 21  2011 html
drwxr-xr-x    2 www         www   512 Jul 20 00:00 log

最初に、ドキュメントルート(html ディレクトリ)内のデフォルトの index.html は不要なので、削除してしまいましょう。

% cd html
% rm index.html

次に、PHP の設定をおこないます。CPI の初期設定では concrete5 が動作しませんので、いくつかの設定を変更する必要があります。

まず、CPI コントロールパネルの[お客様情報 > プログラムのパスとサーバの情報 > PHP ini の設定情報]にアクセスし、php.ini を取得しましょう。本稿の執筆時点(2015 年 12 月 16 日現在)では、デフォルトの PHP バージョンは PHP 5.5.16 ですので、PHP 5.5.16 をクリックします。

表示される画面から php.ini をテキストエディタにコピーし、下記の記述を変更しましょう。

変更前 変更後
mbstring.http_input = auto mbstring.http_input = pass
mbstring.language = Japanese mbstring.language = neutral
mbstring.encoding_translation = On mbstring.encoding_translation = Off

変更したら内容を全てコピーし、html ディレクトリ内に php.ini ファイルを作成し、ペーストしましょう。

% vi php.ini

ここでは vi エディタを使用していますが、もちろん FTP アカウントを作成し、FTP でアップロードしても構いません。

php.ini の作成が終わったら、再度ドキュメントルートのひとつ上のディレクトリに戻りましょう。

% cd ../
% pwd
/usr/home/ab123cd456

リモートリポジトリからテスト環境へデータを取得

このディレクトリに .netrc という名前のファイルを作成しましょう。パーミッションは 600 である必要があります。

% vi .netrc

.netrc ファイルの内容は、以下のように Backlog のログイン情報を保存しておきます。

machine (Backlogユーザ名).backlog.jp
login (Backlogユーザ名)
password (Backlogパスワード)

.netrc ファイルを作成すると、テストサイトから Backlog のリポジトリにアクセスできるようになります。

それでは、いよいよリモートリポジトリからソースを取得してみましょう。この作業を Git の用語で「クローン」と呼びます。ここで重要なポイントが 2 つあります。

1 つめは、ドキュメントルート(インターネットからアクセスできる公開領域)の外でクローンすること。クローンをおこなうと Git リポジトリが丸ごとコピーされますが、その中には外部に公開するとよくないソースコードが含まれているかもしれません。ドキュメントルートの外にクローンすれば問題ありません。

2 つめは、--mirror オプションをつけること。ただクローンすると、テスト環境にある Git リポジトリでもコミット等の作業をおこなうことができてしまい、リモートリポジトリとコンフリクト(衝突)が起きてしまう場合があります。--mirror オプションは、その名の通りオリジナルのリポジトリそのままの複製を作り、コンフリクトを防ぐことができます。

% git clone --mirror https://spacename.backlog.jp/git/PROJECT_KEY/concrete5.git

.netrc ファイルの設定がうまくいっていれば、git clone の際にユーザー名とパスワードを聞かれずに実行することができるはずです。

それでは、Backlog 上のリモートリポジトリからソースコードを取得してみましょう。

% git --git-dir=concrete5.git fetch
% git --git-dir=concrete5.git --work-tree=html checkout -f

git fetch でリモートリポジトリの最新の状態を取得します。
--git-dir オプションでサーバー上の Git リポジトリを指定しています。

git checkout でファイルを指定したディレクトリにコピーします。
--work-tree オプションでファイルを展開するディレクトリを指定しています。
-f オプションは、強制的に実行させるオプションです。

それでは、テストサイトにアクセスして、リモートリポジトリからのデータの取得がうまくいったか確認してみましょう!
うまくできていれば、concrete5 がインストール画面を表示します。しかし、インストールは開発サイトで完了しているはずですね。
つまり、MySQL データベースに接続できていないことが分かります。

開発サイトからテストサイトへ MySQL データを移行

それでは、MySQL のデータを開発サイトからテストサイトに移行していきましょう。
本連載で実現する構成では、開発サイトとテストサイト、本番サイトはそれぞれ別のデータベースを使用します。データベース間でデータを移すには、phpMyAdmin のエクスポート・インポート機能を使うのがかんたんでしょう。

まず、開発サイトがある MAMP 上の phpMyAdmin から、データベースを選択し、「エクスポート」タブを開きます。「出力をファイルに保存する」オプションを選択してから「実行」ボタンをクリックすると、エクスポートファイルがダウンロードされます。

次に、CPI のコントロールパネルから[データベース→MySQL5.5 管理画面]にアクセスします。すると、phpMyAdmin のログイン画面が表示されますので、ログインし、初期データベースを選択し、「インポート」タブを開きましょう。こちらの画面から、先ほどエクスポートしたデータベースを取り込むことができます。

以上で開発サイトからテストサイトにデータベースの移行ができましたので、最後に concrete5 のデータベース接続情報を設定しましょう。開発サイトから /application/config/database.php をテストサイトにアップロードし、下記のように変更します。データベース名、ユーザー名、パスワードは CPI の契約時に送られてくるメールを確認しましょう。

return array(
    'default-connection' => 'concrete',
    'connections' => array(
        'concrete' => array(
            'driver' => 'c5_pdo_mysql',
            'server' => '127.0.0.1',
            'database' => 'ab123cd456',
            'username' => 'ab123cd456',
            'password' => 'your password',
            'charset' => 'utf8'
        )
    )
);

データベース接続情報が正しければ、concrete5 サイトが表示されるようになります。

以上で、開発サイトからテストサイトへの移設が完了しました!
.gitignore で除外しているため、開発サイトにアップロードしたファイルは転送されていません。必要な場合は、別途 FTP などでアップロードしてください。

リモートリポジトリからの取得を自動化

ここまでの手順で、リモートリポジトリとテストサイトが Git で接続されましたが、リモートリポジトリの変更をテストサイトに反映させるたびに、テストサイトに SSH でアクセスして、git clone を実行するのは手間がかかりますよね。

実は、リモートリポジトリにコミットをプッシュした際に、自動的にテストサイトにも反映させることが可能です。それが「Web フック」という機能です。GitHub や Backlog など多くの Git ホスティングサービスで使用することができます。

Web フックは単純な仕組みになっており、リポジトリにコミットがプッシュされた際に、あらかじめ指定された URL にコミットの情報を送信するようになっています。送信先の URL は、Backlog の場合は「プロジェクト設定>Git」からおこないます。

それでは、テストサイト上に、コミットの情報を受け取ってリモートリポジトリの最新の状態をテストサイト上に自動的に展開するプログラムを設置しましょう。こちらがそのサンプルコードになります。

<?php
// CPIユーザーID(契約情報で確認してください)
$user_id     = 'abc123defg';
// リポジトリ名(Backlogで確認してください)
$repo_name   = 'repo';
// Gitレポジトリの位置の指定
$git_dir     = '/usr/home/' . $user_id . '/' . $repo_name . '.git';
// 展開先ディレクトリの指定
$work_tree   = '/usr/home/' . $user_id . '/html';
// logファイルの指定
$log_file    = '/usr/home/' . $user_id . '/deploy.log';
// Gitコマンドパス
$git_command = '/usr/local/bin/git';
// リリースするブランチの指定
$deploy_ref  = 'refs/heads/master';

/**
 * Git Webフックを受信する
 * BacklogのWebフックの仕様の解説はこちら
 * http://www.backlog.jp/help/usersguide/git/userguide1710.html
 */
$payload = json_decode($_POST['payload']);

// 指定されたブランチかどうかの確認
$checkout = false;
if ($payload){
    $ref = $payload->ref;
    if ($ref == $deploy_ref) {
        $checkout = true;
    }
}

// 指定されたブランチの場合、fetch+checkoutを実行して、最終コミットをlogファイルに保存する
if ($checkout) {
    exec($git_command . ' --git-dir=' . $git_dir . ' fetch');
    exec($git_command . ' --git-dir=' . $git_dir . ' --work-tree=' . $work_tree . ' checkout -f');
    $commit_hash = shell_exec($git_command . ' --git-dir=' . $git_dir . ' rev-parse --verify HEAD');
    file_put_contents($log_file, date('r') . " Ref: " .  $ref . " Commit: " . $commit_hash . "\n", FILE_APPEND);
}

冒頭の CPI ユーザー ID とリポジトリ名を変更すれば使えるようになっています。こちらの PHP コードを拡張子が .php のファイルとして作成し、テストサイトにアップロードします。ファイル名は予測のつかないものにするため、ランダムな文字列を含めた方が良いでしょう(例:deploy-wV2XXxRteegGnc8t.php)

アップロードした PHP ファイルの URL を、Backlog の Git の設定ページから Web フック URL に指定します。これで準備は完了です!新しい変更をコミットして、テストサイトに自動で反映されているかどうかを確認してみましょう。

いかがでしょうか。反映できましたか?このように、Git を使えば、チームメンバーそれぞれが FTP でサーバーにアップロードする必要なく、作業結果をサーバーに安全かつ確実に反映させることができます。サーバーへのアクセス情報を与える範囲はなるべく減らした方が安全です。さらに、リモートリポジトリ自体がサーバー上のソースコードのバックアップの役目も果たします。
ぜひ、チャレンジしてみてくださいね!

第 3 回は、いよいよテストサイトから公開サイトにリリースしてみましょう!

菱川 拓郎(ひしかわ たくろう)

菱川 拓郎(ひしかわ たくろう)
コンクリートファイブジャパン株式会社

ウェブ制作会社でマークアップエンジニア、企画・開発ディレクターとして勤務したのち、フリーランスとして独立。
独立後はオープンソース CMS「concrete5(コンクリートファイブ)」のコミュニティに参加、日本語版の翻訳や、開発・普及活動をおこなう。2012 年より concrete5 のサポート・普及活動をおこなうコンクリートファイブジャパン株式会社を設立。
CMS がウェブ制作者とクライアントの良好な関係をいかに手助けできるかを常に考えている。

トップに戻る