PHP製のDeployerでデプロイ環境構築

【 2016/12/12 12:20 】by 月琴かりん

デプロイツールにdeployerを使う

はじめに

Capistranoを数年使ってみて、いろいろ煩わしくてMakefileに帰ってきてしまったが、最近deployerが軽量でイケてるという話をよく聞いたので、しばらく使ってみることにした。

この手のツールあるあるだが、例に漏れず更新が頻繁で、二次情報だと古い情報ばかりで逆にはまる。

公式のドキュメント読もう。

あと、PHP 5.5.0 以上じゃないと動かないので古いPHPはこれを機に一掃しよう。

インストール

wget https://deployer.org/deployer.phar
mv deployer.phar /usr/local/bin/deployer
chmod +x /usr/local/bin/deployer

初期設定(make world的なやつ)

dep init

deploy.php が生成される。
depコマンドは指定しない場合、deploy.phpをレシピとみなす。

タスク実行について

単に下記のように打つと
task()の第一引数と${TASK}が一致したラムダを実行する。

dep ${TASK}

リモートでコマンドを実行したい場合はtask内でrun()コマンドを呼ぶ

task('pwd', function () {
    $result = run('pwd');
    writeln("Current dir: $result");
});

serverの設定で、stageプロパティが定義される場合、
deployファイルで下記のようにset()コマンドを呼び出して指定していない場合にエラーとなる。

And then you call command dep [task] [server or stage], it will be executed only on specified stage servers.

set('default_stage', 'ステージ名');  

デプロイコマンドはリポジトリベースかファイルベースの二種類から選択可能。
プログラム系ならリポジトリベース、DBファイルとか扱うならファイルベースになるんだろうかな。

ちなみに、リポジトリ指定については、デプロイ先からのクライアント実行になるので、ローカルリポジトリ参照させようとする場合には、ローカルリポジトリを同期しないとダメ。ネットワーク越しの参照の場合でも、多段プロキシ時の問題があったりするので注意。

set('repository', 'git@domain.com:username/repository.git');
set('shared_files', [...]);

tackに失敗した時

{deploy_path}/.dep/deploy.lock

が残留して何もできなくなるので、手動で消すか、下記のtaskを定義しておいて実行する。

task('fix_lock', [
    'deploy:unlock'
]);

composerについて

deploy:vender taskでcomposerが走る。 プロジェクトのルートに"compoer"がなく、かつ、composerにパスが通っていない場合、インターネットからcomposerを取ってきて呼ぶので注意。

また、確実にcomposer installを呼ぶことになるので、composer.jsonが存在しないとエラーで止まる。空でいいからプロジェクトに作っておくこと。

rsync したいとき

  • http://blog.a-way-out.net/blog/2015/06/03/rsync-with-deployer/

deploy.php 例

<?php
namespace Deployer;
require 'recipe/common.php';

// Configuration                                                                                                                                                                                                                             

set('shared_files', []);
set('shared_dirs', []);
set('writable_dirs', []);
set('default_stage', 'local');
set('repository', '~/var/git/repos');
//set('repository', 'git@domain.com:username/repository.git');                                                                                                                                                                                

// Servers                                                                                                                                                                                                                                   

serverList("config/servers.yml");


// Task Def                                                                                                                                                                                                                                   
task('deploy', [
    'deploy:prepare',
    'deploy:lock',
    'deploy:release',
    'deploy:update_code',
    'deploy:shared',
    'deploy:writable',
    'deploy:vendors', // composerの扱い注意                                                                                                                                                                                                  
    'deploy:clear_paths',
    'deploy:symlink',
    'deploy:unlock',
    'cleanup',
    'success'
])->desc('Deploy your project');

task('fix_lock', [
    'deploy:unlock'
])->desc('Remove lock leaved deploy failing');

desc() コマンド

dep を引数なしで呼び出した時のhelpの Available Commands: のセクションに説明が表示されるようになる。 taskの直前にdesc()宣言か、メソッドチェインでtask()=>desc()すればよい。

サーバ設定について

メソッドチェインで定義する方法とyaml定義してserverList()関数で読む方法がある。

記法注意点

ハハッ、あたりめーだろ、、って無意識に書くと、盛大にはまるので注意。

  • yaml定義で、タブを使うとパーサが死ぬ。2spaceルールが安全っぽい。。Make感覚で書いてはいけない。。
  • 一部引数を定義し始めると、タスク呼び出し次に環境指定が必須になるので、注意。
  • deploy_path プロパティは絶対パスのみ使用可能。相対パスをするとdeployコマンド時にエラーになる。
  • コメントアウト(先頭に#)は機能する。

サンプル

hostname:
  host: hostname
  port: 22
# forward_agent: ~ 
  user: user
  identity_file:
    public_key: ~/.ssh/id_rsa.pub
    private_key: ~/.ssh/id_rsa
    password: ''
  stage: local
  deploy_path: /my/project/path
  branch: master  

踏み台サーバ経由のデプロイについて(旧)

普段 .ssh/config に ProxyCommand 書いてさっくりやってると、Deployerでsshconfigみて適当にやってくれんかなー、と期待するわけですが、無理です。
(メソッドチェインでのみ、configFileコマンドで設定できますが、なんもしてくれねぇ。。)

github上でIssueに上がってるけど、出来るできるーという無責任な返答の末、未解決のままプロジェクトメンバーが強引にIssue閉じるという暴挙にでてるので、対応されないでしょう。ソールも見たけど、無理っぽいです。

なので、あの忌々しい(?)ssh port forward コマンドでトンネルを貼って、トンネル経由のデプロイを試みるしか今の所ないっぽい。

ssh -L ${トンネル用ポート}:${接続したい先のサーバ}:22 ${踏み台サーバアカウント}@${踏み台サーバ}

とデプロイ前にトンネルをはってやって、servers.yml は

host: localhost
port: ${トンネル用ポート}

とすれば、いける。

  • 難解な ssh port forward の良いまとめ
    • http://qiita.com/mechamogera/items/b1bb9130273deb9426f5

踏み台サーバ経由のデプロイについて(新)

とおもったら、ssh driverを変えればいけた!!!

set('ssh_type', 'native');

これやると、OSのssh client使ってくれるので、.ssh/config に従うし、 ProxyCommand の設定が当然そのまま使える。

パス周りの注意

deployerのコマンド実行は非対話モードなので、ユーザシェルの環境変数を読まない(.bashなんたらに書いても無駄)

sshdの設定を変えてもにょもにょするか、ssh コマンドの引数でどうにかする方法があるが、権限あるなら、普通にパス通しちゃうのが一番楽。

  • 参考: http://april.fool.jp/blogs/2013/07/freebsdlinux-ssh経由でコマンド実行すると環境変数を読まな/

自分用メモ:新規APIの構築時メモ

  • dep init する(やらないとなぜかパス周りで読まないことが...?)
  • deploy.php を オレオレテンプレートで上書き、config/servers.yml も同様に。
  • echo "{}" > composer.json
  • 必要に応じて、上記ファイルを修正
  • デプロイ先のシンボリックリンク調整
  • あとはもりもり開発せぇや!!

  • 更新時は、dep deploy production

  • エラー調べたい時は、-vvv オプション
  • 実行中にエラーでこけてlockのこったら、dep fix_lock production

Link Infomation

alomarron

サイト内検索