弊社では Laravel アプリケーションをサーバーにデプロイする際、 Deployer を使用することが多いです。
Deployerは、ロールバックが容易、フレームワークごとのデプロイ手順があらかじめ レシピ として用意されているため、VPSやレンタルサーバー等にデプロイする際に重宝します。
ただ、Deployerのデプロイはサーバー上で git clone
をするため、サーバーにリポジトリにアクセスするための認証情報を持たせる必要があり、個人的にはサーバー置くセキュアな情報は極力減らしたいと思っていました。
そこで、 git clone
を使うのではなく、 rsync
を使用してLaravelをデプロイする方法を考えたため、本記事ではそのデプロイ手順を GitHub Actions を使用して自動化する方法について解説します。
前提
本記事では、以下の内容について既にご存じの方を想定して書いています。
- Deployer 7.xを使用したことがあるor概要について大体は知っている
- Laravel 11の環境構築をしたことがある
- GitHub Actionsを使用したことがある
CI/CD設定
GitHub Actionsでは、以下の手順でアプリケーションをデプロイします。
-
git push
- 依存関係のインストール
- アセットビルド(JavaScript関連)
- テスト実行
- Deployerを使用してデプロイ
本記事では、GitHub ActionsとDeployerで共通している環境変数について解説した後、それぞれの設定を簡単に解説します。
環境変数について
GitHub Actionsには Environments 機能があり、環境ごとにパラメータを切り替えることができます。
この機能によって、例えば本番、ステージング、開発環境の3環境があり、それぞれサーバーやDBが異なっていたとしても、デプロイ手順は共通化しつつデプロイ先だけ切り替えることができます。
この機能を活かし、 .env
ファイルをデプロイのたびに生成し、そのうちのパラメータのいくつかをGitHub Actionsで管理することで、シークレットパラメータをハードコードしなくていい他、 .env
の内容に変更があった場合、いちいち対象サーバーにアクセスして書き換える必要がないため、楽に管理することができます。
ただし、気を付けなければいけない点として、 .env
ファイルの APP_KEY
変数は、暗号化やハッシュ化などに使用されているため、デプロイ中に書き換わるとそれまでに登録していたパスワードが認証できなくなります。
そのため、 APP_KEY
変数を毎回引き継ぐ処理が必要になります。
GitHub Actions設定
環境変数の登録
.env
ファイルに登録するための環境変数をGitHubに登録し、Workflow内で使用できるようにします。このとき、 .env
に書き込むためのパラメータの他、デプロイサーバーにSSH接続するためのアドレスやユーザー名、秘密鍵も環境変数として登録します。
以下のスクショでは、Environmentsに production
環境を作成し、環境変数を設定しています。
workflowの作成
.github/workflows
ディレクトリ下に deploy.yml
ファイルを作成し、デプロイ手順を書きます。
laravel-deployer-ci/.github/workflows/deploy.yml at main · FOURIER-Inc/laravel-deployer-ci
The sample Laravel project deployed using GitHub Actions and Deployer, and rsync - FOURIER-Inc/laravel-deployer-ci
https://github.com/FOURIER-Inc/laravel-deployer-ci/blob/main/.github/workflows/deploy.yml
Deployer実行内容
実行内容については、概ねDeployerの Laravelレシピ の定義通りに実行しますが、以下の2点を変更・追加しています。
-
デプロイ方法を
rsync
に変更記事冒頭でも説明した通り、Laravelレシピでのデプロイ方法は、サーバーで
git clone
コマンドでコードを更新するようになっていますが、リポジトリの認証情報(SSH鍵等)を事前にサーバーに持たせておく必要があります。この方法だと、環境ごとに認証情報を置く手間や、万が一不正アクセスされた場合、リポジトリにまでアクセスされる可能性があるため、
rsync
でデプロイするように変更します。また、
rsync
にするメリットとして、必要のないファイルを除外することができるので、開発環境が分かる情報が入ったファイル等を不必要にデプロイしなくてすみます。 -
.env
ファイルの生成でも解説した通り、デプロイ時に
.env
ファイルを生成し、APP_KEY
を引き継ぎます。
deploy.php
ファイル
上記の内容を反映させた deploy.php
ファイルは以下のようになります。
laravel-deployer-ci/deploy.php at main · FOURIER-Inc/laravel-deployer-ci
The sample Laravel project deployed using GitHub Actions and Deployer, and rsync - FOURIER-Inc/laravel-deployer-ci
https://github.com/FOURIER-Inc/laravel-deployer-ci/blob/main/deploy.php
まとめ
本記事では、Deployer(rsync)を使用してLaravelアプリケーションをデプロイし、GitHub Actionsで自動化しました。
本記事の内容は以下のリポジトリにプッシュしているので、気になる方は参考にしていただければと思います。
GitHub - FOURIER-Inc/laravel-deployer-ci: The sample Laravel project deployed using GitHub Actions and Deployer, and rsync
The sample Laravel project deployed using GitHub Actions and Deployer, and rsync - FOURIER-Inc/laravel-deployer-ci
https://github.com/FOURIER-Inc/laravel-deployer-ci