R.Kumagaiをフォローする

【Laravel】Deployerの設定からdeployまで

バックエンド

はじめに

近頃、業務にてdevelopment,staging,productionなど、様々な環境でdeployerを使用してlaravelのプロジェクトをdeployすることが増えてきました。
その際に、最初に既存の設定されたファイルを見ると、何を記述しているのかが全く分からなかったため、備忘録も兼ねて、サンプルを作成してみました。

deployerのインストール

まずは、composerを使用して、deployerをインストールします。
インストールに配下のコマンドを実行

composer require deployer/deployer

deployerをインストールしたことによって、vendor/bin/depが使用できるようになります。
このコマンドを使用して、設定ファイルの作成やdeployの実行を行います。

deploy.phpの作成

次に以下のコマンドを実行し、設定ファイルの作成を行います。

/vendor/bin/dep init

実行すると以下のように表示されるため、案内に沿って入力を行っていきます。

ファイル作成後に変更できるため、リポジトリ名、プロジェクト名、ホスト名は一旦適当に入力してしまいます。

すると、以下のようなファイルが作成されます。

<?php
namespace Deployer;

require 'recipe/laravel.php';

// Config

set('repository', 'test_rep');

add('shared_files', []);
add('shared_dirs', []);
add('writable_dirs', []);

// Hosts

host('test_hosts')
    ->set('remote_user', 'deployer')
    ->set('deploy_path', '~/test_pro');

// Hooks

after('deploy:failed', 'deploy:unlock');

このままでは使用できないため、動く形に中身を変更すると、以下のような形になります。
Webアプリを想定して作成しているため、npm runやサーバー再起動処理を挟んでいます。
追加したコードの詳細については、個別にピックアップして書くよりも、コメントとして記載されたほうが分かりやすいかと思いましたので、コメントにて記載しています。
※今回は、deployerの説明のため、artisanコマンドについての説明は記載しておりません。

<?php
namespace Deployer;

require 'recipe/laravel.php';

// Project name
set('application', 'your_project_name'); // deployを行うプロジェクト名

// Config
set('repository', '***.git'); // 対象プロジェクトのgitURL

set('git_ssh_command', 'ssh'); // git clone をするために記載

add('shared_files', ['.env']); // deploy時に、再作成する必要がないファイルを記載

add('shared_dirs', ['vendor', 'storage']); // deploy時に、再作成する必要がないフォルダを記載

add('writable_dirs', [ // 書き込み可能なディレクトリのリスト
    'storage',
    'storage/app',
    'storage/app/public',
    'storage/framework',
    'storage/framework/cache',
    'storage/framework/sessions',
    'storage/framework/views',
    'storage/logs',
]);
// Hosts
import('hosts.php'); // 複数の情報を記載することになるため、別ファイルに分離

task('npm:run', function () {
    // npmに関する処理
});

task('web_server:restart', function () {
    // サーバーのリスタートに関する処理
});

// deployコマンド時に実行することリスト
task('deploy', [
    'deploy:prepare', // deployのための準備コマンド
    'deploy:vendors', // venderのインストールコマンド
    'npm:run', // オリジナルのコマンド
    'artisan:storage:link', // php artisan storage:link
    'artisan:config:cache', // php artisan config:cache
    'artisan:route:cache', // php artisan route:cache
    'artisan:view:cache', // php artisan view:cache
    'artisan:event:cache', // php artisan event:cache
    'artisan:migrate', // php artisan migrate
    'deploy:publish', // deploy後の後処理コマンド
    'web_server:restart', // オリジナルのコマンド
])->desc('# デプロイを開始します'); // deploy開始時に表示される文言

// 失敗時のタスク
after('deploy:failed', 'deploy:unlock'); // deploy:prepareコマンドで掛けているロックの解除

初期のテンプレートでは、Hostsのデータも同じファイルに記載されていましたが、development,staging,productionと複数の情報を入力することになることが殆どかと思いますので、分離いたしました。

また、タスクに追加できるレシピの一覧は、こちらのリンク先に公式で用意してくれています。

分離したファイルは以下になります。(今回はdevelopmentの情報のみ記載)

<?php

use function Deployer\host;

host('development') // deployコマンドで使用
    ->setHostname('dev') // 対象のhostを記載
    ->set('roles', 'app') // アプリのdeployを想定しているため、appと記載
    ->set('branch', 'develop') // 対象の環境にdeployしたいブランチ名を記載
    ->set('login_url', '***') // deploy対象アプリのログイン画面へのURLを記載
    ->set('bin/php', '/usr/bin/php') // phpコマンドを使用できるように設定
    ->setRemoteUser('deployer') // deployerに使用させるユーザーを記載
    ->setDeployPath('/') // deployを行うpathを記載
    ->setIdentityFile('~/.ssh/devkey'); // sshkeyファイルのpathを記載

これで必要な設定ファイルが揃いました。

あとは、vendorの一つ上の階層から、以下のコマンドを入力することで、hostsで設定したdevelopmentへdeployを行うことが出来ます。

vendor/bin/dep deploy development

おわりに

これで、deployを行うことが出来ました。
deployerを使用しない場合には、deployのたびに、いろいろなコマンドを実行していく必要がありますが、deployerの設定をしておくことで、上記のコマンドを打つだけで、いつでもdeployを行うことが出来ます。

また、上記にオリジナルのコマンドを記載していることをみてわかる通り、複数のDBへマイグレーション処理を実行する等の任意の処理を途中に挟むこともできます。

皆さんも、deploy時の面倒な作業はdeployerに任せてしまいましょう!