はじめに
GitHub Actionsについては、G'sの授業で少し学び、最近Reactを学ぶ中でもGitHub Actionsに触れる機会がありました。
最初に見た時は、ymlファイルの中身がさっぱりわからなかったのですが、触れる機会が増え、少しずつ仕組みが分かるようになってきたので、G'sの卒業制作で作ったLaravelプロジェクトをGitHub Actionsを使ってデプロイしてみることにしました。
そのような記事も少ないように思えたので、今回、記事にした次第です。どなたかのご参考になれば幸いです。
前提条件
- さくらレンタルサーバ(スタンダード)
- すでにLaravelプロジェクトがさくらサーバにデプロイされていること
これまでの手動デプロイの流れ
- さくらサーバにsshでログイン
- サーバ上で以下のコマンドを実行
# プロジェクトがあるディレクトリに移動
$ cd ~/project
# メンテナンスモードにする(任意) my-projectは自分のプロジェクト名などに
$ php artisan down --secret="my-project-deploy"
# GitHubのリモートリポジトリから最新を取得する
$ git pull origin main
# composerのインストール(必要な場合)
$ composer install --no-dev --prefer-dist --no-interaction --optimize-autoloader
# マイグレーションを本番で実行(必要な場合)
$ php artisan migrate --force
# キャッシュクリア
$ php artisan optimize:clear
# メンテ解除(メンテモードにした場合)
$ php artisan up
注)キャッシュの生成(config:cacheなど)は実行していません。
GitHub Actionsによる自動デプロイ
SSH鍵の生成
ローカルPCのターミナルで以下のコマンドを実行します。
ssh-keygen -t ed25519 -C "my-project-github-actions" -f ~/.ssh/id_ed25519_my_project_actions
各オプションの意味
- -t ed25519 : 鍵のアルゴリズム指定
- -C "..." : 任意のコメントを書く(私の場合は、{プロジェクト名}-github-actions)
- -f path : 秘密鍵のファイル名
このあと、パスフレーズについて聞かれますが、すべてEnterで進みます。
鍵のイメージが表示されたら、OK。
公開鍵をさくらサーバに登録する
% cd .ssh
# 公開鍵を表示 .pubがついている方
% cat id_ed25519_my_project_actions.pub
画面に表示された鍵(文字列)をコピーして、さくらサーバのコントロールパネルで公開鍵を登録します。
下図の公開鍵にコピーを貼り付けます。
コメントは、何用の鍵かわかるように書いておきます。

秘密鍵をGitHubに登録する
% cd .ssh
# 秘密鍵を表示 .pubがない方
% cat id_ed25519_my_project_actions
秘密鍵が何行かにわたって表示されますので、上から下まで全部コピーします。
GitHubの対象リポジトリのSetting > Secrets and variables > Actionsを開くと、Repository secretsというのがありますので、ここでNew repository secretを叩くと、登録画面になります。ここに鍵を登録します。
- Name : SAKURA_SSH_KEY
- Secret : コピーした秘密鍵を貼り付けます
(Nameは、ご自身のわかりやすい名前にしてください。以降のサーバー情報も同様。)
今回のケースではすでにデプロイ済みのため、初回デプロイ時にさくらサーバ上で、ssh-keygenコマンドを使い、鍵ペアをひとつ作成していました。その際は、秘密鍵をさくらサーバ側に保存し、公開鍵をGitHub側に登録しています。今回、GitHub Actions用に作成した鍵ペアは、このときとは保存場所の向きが逆になります。
サーバー情報の登録
秘密鍵を登録したGitHubのRepository secretsに、サーバー情報も登録します。
Name : SAKURA_HOST
Secret : hogehoge.sakura.ne.jp(自分のサーバ名)
Name : SAKURA_USER
Secret : hogehoge(自分のアカウント)
ワークフローファイルの作成
GitHub Actionsを使って自動デプロイするためには、ワークフローを記述した deploy.yml ファイルを .github/workflows に作成します。
今回は、main ブランチに push されたら実行するワークフローを記述します。
.github/workflows/deploy.yml
name: Deploy my-project to Sakura
on:
push:
branches: [ "main" ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.2.4
with:
host: ${{ secrets.SAKURA_HOST }}
username: ${{ secrets.SAKURA_USER }}
key: ${{ secrets.SAKURA_SSH_KEY }}
port: 22
script: |
set -e
cd ~/project
php artisan down --secret="my-project-deploy" || true
trap 'php artisan up || true' EXIT
git pull origin main
composer install --no-dev --prefer-dist --no-interaction --optimize-autoloader
php artisan migrate --force
php artisan optimize:clear
-
name: Deploy my-project to Sakura: このワークフローの名前 -
on:push:branches: [ "main" ]:
「いつこのワークフローを実行するか」の条件ブロック。
今回はmainブランチにpush(またはマージ)されたら実行する条件。 -
deploy: ジョブ名。GitHub Actionsの画面にも出る -
runs-on: ubuntu-latest:
このジョブを動かす実行環境(GitHubが提供する仮想マシン)。Ubuntuの最新安定版を使用。 -
name: Deploy via SSH: ステップ名。ログ画面で見やすくするためのラベル -
uses: appleboy/ssh-action@v1.2.4:
既存のGitHub Action(appleboy/ssh-action)を呼び出して使う。「SSHでリモートサーバへ接続してコマンドを実行」するもの。 -
host: ${{ secrets.SAKURA_HOST }}: GitHub Secretsに登録した値を使用。他も同様 -
port: 22: ポート番号 -
script: |:
ここから下に書いたものがサーバ上で実行される。|は「改行込みの複数行」を書けるYAML記法。 -
set -e:
どれかひとつでもコマンドが失敗したら、その時点で全体を失敗として止める。 -
php artisan down --secret="my-project-deploy" || true:
Laravelをメンテナンスモードにする。|| trueは、もしdownが失敗しても(例:すでにdown中)そこで止めずに続行するための書き方。 -
trap 'php artisan up || true' EXIT:
trap "コマンド" EXITと記述することで、スクリプトの最後に(成功でも失敗でも)必ず指定したコマンドが実行される。メンテモードのまま放置されないように。
その他のスクリプトは、手動デプロイ時と同じ。
動作確認
これでmainブランチにpush(またはマージ)すると、GitHub Actionsが走ります。
GitHub Actionsの画面で、❌が出ていなければ成功です。
わかりやすいように、テキストの色を変更してpushすると、さくらサーバの本番用ページにも反映されていました。
おわりに
以前に「GitHub Actionsを使って簡単なReactアプリをFirebaseに自動デプロイする」ことを経験していたのですが、それと今回のさくらサーバへの自動デプロイ実装を通して、GitHub Actionsの使い方、ymlファイルの見方・書き方や、鍵生成の方法などへの理解が進みました。
それでも、まだまだよく理解できていない部分もありますので、引き続き学びを継続していきたいと思います。
参考

