CodeIgniter 3.0をコマンド一発でデプロイするCodeIgniter Deployer

CodeIgniter Composer Installerでコマンド一発でCodeIgniter 3.0をインストールできるようになりました。

デプロイもコマンド一発でできるようにしましょう。

CodeIgniter Deployer

CodeIgniterをデプロイするためのツールです。

中身はDeployerです。別にCodeIgniterでなくてもちょっと設定を変えれば使えます(w

も参考にしてください。

インストール方法

Composerでインストールします。

$ cd /path/to/codeigniter/
$ composer require 'phpseclib/phpseclib:dev-master#2c96af214bf1b5e29b707249108504b4e0041a21' # この行、Deployer v3.0.6以降では不要
$ composer require kenjis/codeigniter-deployer:1.0.x@dev --dev
$ php vendor/kenjis/codeigniter-deployer/install.php

これでインストール完了です。

(2015-06-15 更新)

phpseclibの行は、今現在Deployerがリリース前のphpseclibに依存しているため、プロジェクトルートのcomposer.jsonにそのコミットを追加しないと、stabilityの関係でうまくインストールできないために必要です。phpseclibの新しいバージョンがリリースされ、Deployerが更新されれば不要になります。 Deployer v3.0.6から不要になりました。

フォルダ構成

以下のようになります。

codeigniter/
└── deploy/
     ├── deploy.php ... Deployerの設定ファイル
     ├── deploy.sh  ... デプロイ用のスクリプト
     └── logs/

Deployerの設定方法

deploy/deploy.phpを変更します。

デプロイ先のサーバの指定

以下を自分のサーバに合わせて変更します。

// Your production server
server('prod', 'your.server.example.com', 22)
    ->user('username')
    ->forwardAgent()
    ->stage('production')
    ->env('branch', 'master')
    ->env('deploy_path', '/var/www/your-codeigniter-app');

上記はSSH Agentで認証する設定ですが、パスワードや鍵ファイルを使う場合の設定は、以下のドキュメントを参照してください。

リポジトリの指定

以下にリポジトリを設定します。

// Your Git repository
set('repository', 'git@github.com:org/your-codeigniter-app.git');

サーバ上でこのリポジトリからgit cloneしますので、アクセス可能に設定する必要があります。

サーバの設定

sudo

ttyなしパスワードなしでsudoが実行できる必要があります。そのように設定してください。

例えば、以下のようになります。

Defaults:username !requiretty

username   ALL=(ALL) NOPASSWD: /usr/bin/setfacl

デプロイ方法

以下でデプロイされます。

$ cd /path/to/codeigniter/
$ cd deploy/
$ sh deploy.sh

サーバ上では以下のように配置されます。

your-codeigniter-app/
├── current -> /var/www/your-codeigniter-app/releases/20150603181638
└── releases/
     ├── 20150603180505/
     ├── 20150603181203/
     └── 20150603181638/

デプロイ先のベースパスの中のcurrentが現在リリースされているソースになります。currentフォルダはreleases/20150603181638へのシンボリックリンクです。

Webサーバの設定は(codeigniter-composer-installerを使っている場合は)current/publicをドキュメントルートに設定します。

CodeIgniterをデフォルトのフォルダ構成で使っている場合は、currentをドキュメントルートに設定します。

関連

Tags: codeigniter, deployment

Deployerでrsyncを使う

昨日の記事「PHPプロジェクトを簡単にデプロイするならDeployerがお薦め」が思ったより「はてブ」されたので、フォローの記事を書いておきます。

昨日のまとめに書きましたが、

  • Deployerは非常にシンプルなツールで必要最低限の機能も不足しているかも知れません。

なので、自分の要求に足りない機能というのが、たぶん出てくると思います。

標準のワークフローでは、デプロイ先のサーバからgit cloneしてソースを取得してデプロイします。

PHPプロジェクトを簡単にデプロイするならDeployerがお薦め — A Day in Serenity (Reloaded) — PHP, FuelPHP, Linux or something

試してみたけど、デプロイ先のサーバー側でgit cloneコマンド実行するからcloneできる設定をいちいちするのがめんどいな。git cloneはデプロイサーバーの1回で済ませたい。.gitもついちゃうし。。

2015/06/02 22:12

というような感想も出てきます。

  • でも大丈夫。Deployerは簡単にレシピを拡張できます。

足りないものや合わないものは自分で書いていけばいいじゃん、ということです。で、それが簡単に書けるのがDeployerです。

なんとなくUnix的な感じです。機能が多い方がいいという人には今のところ向きません。

rsyncを使ってみる

ということで、例えば、rsyncを使うようなタスクを書いてみます。

標準のワークフローに乗っかりやすいように、

  1. ローカルからデプロイ先にGitリポジトリをrsync
  2. デプロイ先ではrsyncしたGitリポジトリからgitでデプロイ

というフローにします。これだと標準のワークフローに追加するだけで使えます。

rsync元(rsync_from)とリポジトリ(repository)を定義します。

set('rsync_from', '/home/deploy/your-project');         // rsync元(ローカル)
set('repository', '/var/www/repository/your-project');  // rsync先(サーバ上)

rsyncするタスクrsyncを定義します。

task('rsync', function () {
    $server = \Deployer\Task\Context::get()->getServer()->getConfiguration();
    $host = $server->getHost();
    $port = $server->getPort();
    $user = $server->getUser();

    // rsync to server
    $rsync_from = get('rsync_from');
    $rsync_to   = get('repository');
    runLocally(
        "rsync -e \"ssh -p $port\" -avz --delete \
        --exclude 'vendor' --exclude '*~' --exclude '*.bak' \
        \"$rsync_from/\" \"$user@$host:$rsync_to\""
    );
})->desc('Rsync repository to server');

タスクrsyncをタスクdeployの前に実行するように設定します。

before('deploy', 'rsync');

これで完了です。

別にgitいらないという場合は、common.phpで定義されているタスクdeploy:update_codeをオーバーライドして、rsyncで直接ソースを更新するようにすればOKです。

まとめ

  • Deployerを使うとPHPプロジェクトを簡単にデプロイできます。
  • Deployerは非常にシンプルなツールで必要最低限の機能も不足しているかも知れません。
  • でも大丈夫。Deployerは簡単にレシピを拡張できます。

関連

Tags: php, deployment

PHPプロジェクトを簡単にデプロイするならDeployerがお薦め

今日はPHP製のデプロイツールの紹介です。デプロイツールとはCapistranoみたいなツールのことです。コマンド一発でデプロイが完了するようにするツールです。

PHP製のツールもいくつかありますが、Deployerは非常にシンプルなツールで、最近3.0がリリースされました(最新版は3.0.4)。

3.0リリースに付いていた謎の画像
https://github.com/deployphp/deployer/releases/tag/v3.0.0 より。

インストールが簡単

公式サイト http://deployer.org/ へアクセスし、deployer.pharをダウンロードするだけです。

公式には/usr/local/bin/depにインストールすると書いてありますが、プロジェクトのフォルダに突っ込んでも問題ありません。

私はプロジェクトのルートにdeployというフォルダを作成し、そこに関連するファイルをまとめることにしました。

project/
└── deploy/
     └── deployer.phar

これでインストール完了です。

設定が簡単

設定ファイルは1つdeploy.phpだけです。これを作成します。

project/
└── deploy/
     ├── deploy.php
     └── deployer.phar

そして、deploy.phpに設定やタスクを記述します。

<?php

// あらかじめ定義されているComposer Recipeを使います。
require 'recipe/composer.php';

// デプロイ先のサーバを定義します。
// サーバ名を「prod」とし、SSHは22番ポートを使用します。
server('prod', 'host', 22)
    ->user('name')
    // ssh agentを使い認証します。
    ->forwardAgent()
    ->stage('production')
    ->env('branch', '1.7/master')
    // デプロイ先のベースパスを定義します。
    ->env('deploy_path', '/var/www/your/project');

// Gitリポジトリを設定します。サーバ上にgitが必要です。
set('repository', 'https://github.com/fuel/fuel.git');

これだけで完了です。

パスワードやSSH鍵ファイルの指定方法は公式ドキュメントのServersに例があります。

deploy.phpでは、Composer Recipeで定義されているタスクをオーバーライドしたり、追加したいタスクを記述します。

Composr RecipeはComposerを使っているシンプルなプロジェクト用のレシピです。公式ドキュメントのRecipesに詳細があります。

Composr Recipe以外にもすべてのベースとなるCommon Recipeや、Symfony Recipeなどの専用のレシピがあります。

サーバでのsudo

デプロイのタスクでsudoを使う場合、ttyなしパスワードなしで実行できる必要があります。そのように設定してください。

例えば、以下のようになります。

Defaults:username !requiretty

username   ALL=(ALL) NOPASSWD: /usr/bin/setfacl

付属するレシピの中では、フォルダの書き込み権限を設定する場合、例えば、以下のような設定がある場合にsudoを使用します。

set('writable_dirs', ['app/cache', 'app/logs']);

デプロイする

デプロイはdeployコマンドにステージ(production)を指定します。これでサーバにデプロイされます。

$ php deployer.phar deploy -vvv production

サーバ上では以下のように配置されます。

project/
├── current -> /var/www/your/project/releases/20150602181638
└── releases/
     ├── 20150602180505/
     ├── 20150602181203/
     └── 20150602181638/

デプロイ先のベースパスの中のcurrentが現在リリースされているソースになります。currentフォルダはreleases/20150602181638へのシンボリックリンクです。

Webサーバの設定では(この例ではpublicフォルダがドキュメントルートなので)current/publicをドキュメントルートに設定します。

まとめ

  • Deployerを使うとPHPプロジェクトを簡単にデプロイできます。
  • Deployerは非常にシンプルなツールで必要最低限の機能も不足しているかも知れません。
  • でも大丈夫。Deployerは簡単にレシピを拡張できます。

関連

Tags: php, deployment, symfony