Produced by Fourier

GitHub ActionsとDeployer(rsync)を使ってLaravelをデプロイする

Hirayama Hirayama カレンダーアイコン 2024.07.25

弊社では 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では、以下の手順でアプリケーションをデプロイします。

  1. git push
  2. 依存関係のインストール
  3. アセットビルド(JavaScript関連)
  4. テスト実行
  5. 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 thumbnail

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点を変更・追加しています。

  1. デプロイ方法を rsync に変更

    記事冒頭でも説明した通り、Laravelレシピでのデプロイ方法は、サーバーで git clone コマンドでコードを更新するようになっていますが、リポジトリの認証情報(SSH鍵等)を事前にサーバーに持たせておく必要があります。

    この方法だと、環境ごとに認証情報を置く手間や、万が一不正アクセスされた場合、リポジトリにまでアクセスされる可能性があるため、 rsync でデプロイするように変更します。

    また、 rsync にするメリットとして、必要のないファイルを除外することができるので、開発環境が分かる情報が入ったファイル等を不必要にデプロイしなくてすみます。

  2. .env ファイルの生成

    でも解説した通り、デプロイ時に .env ファイルを生成し、 APP_KEY を引き継ぎます。

deploy.php ファイル

上記の内容を反映させた deploy.php ファイルは以下のようになります。

laravel-deployer-ci/deploy.php at main · FOURIER-Inc/laravel-deployer-ci thumbnail

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 thumbnail

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

Hirayama

Hirayama slash forward icon Engineer

業務では主にPHPやTypeScriptを使用したバックエンドアプリケーションやデスクトップアプリケーションの開発をしています。趣味は登山。

関連記事