GitHub Actionsを使ってLaravelのさくらインターネットへのデプロイを自動化する

GitHub Actionsを使ってLaravelのさくらインターネットへのデプロイを自動化する
(※この記事は、2019年に初稿を書いた記事ではありますが、何度か編集をし、ジーズアカデミー 技術記事書いてみた編 Advent Cale...

以前、Laravelをさくらインターネットのレンタルサーバにデプロイ・アップロードする方法をまとめてみたというブログ記事を書きましたが、今回はその続編になります!

以前のブログではデプロイをするところまでを紹介させていただいたのですが、実際デプロイ後も更新作業をすることは往々にしてあると思います。

そうなった時に、先述したブログ記事の内容を毎回更新のたびに行うのでは手間がかかって仕方がありません。

ということで、Laravel更新→さくらインターネットのレンタルサーバに自動デプロイをさせればだいぶ手間が軽減されるだろうということで、今回は自動デプロイのやり方について書かせていただきたいと思います!

前提として

  • GItHubにLaravelのソースコードはプッシュ済の状態からスタート
  • mainブランチにpushがあったら自動デプロイが発火するようにする

で行きたいと思います!

GitHub Actionsって?

GitHub Actionsは、あなたがGitHubで何かをするたびに自動的にさまざまなタスクを実行させることができる仕組みです。

タスク事例)

  • 新しいコードを追加したときに、そのコードが正しく動作するかを自動的にチェックする。
  • GitHubにソースコードがpushされたら、指定したサーバに自動的にデプロイ作業を行なってくれる。

GItHub Actionsを使うと手作業による手間が省かれ、効率化を実現することができます!

今回は、「GitHubのmainブランチにソースコードがpushされたら、さくらレンタルサーバに自動デプロイがなされる」をやってみたいと思います!

YAMLファイルについて

GitHub Actionsでは、YAMLファイルというものに自動化の指示書を書いて登録するという作業が発生します。

YAMLファイルは、上のような感じの構造で内容を記述していきます。

パッと見何が書いてあるのか意味がわからないと思うのですが、要するにGitHub Actionsに対して

  • まずはこれやってねー
  • 前の工程が終わったら次これやっておいてねー

みたいな感じで、自動化の手順説明をしてあげるためのファイルと思ってください!

GitHub Actions →さくらレンタルサーバの自動デプロイのイメージ

GitHubからさくらインターネットのレンタルサーバへの自動デプロイのイメージ

今まで、いちいちさくらインターネットにターミナルを使ってSSH接続でログインをして、手作業でgit pull oriign mainやphp artisan migrateなどを実施していました。

この作業を全部GitHub Actionsが全部やってくれるわけですね!!!すごい!!!

GitHubからさくらレンタルサーバへの自動デプロイ実現に必要なこと

今回の自動デプロイをする上で必要なことを図にしてみました。

1. GitHub側に秘密鍵&さくら側に公開鍵、のSSH鍵ペアを生成

GitHub側に対しては、さくらインターネットに自動的に接続し、php artisan migrateなどのコマンドを勝手にやってくれるようにするためには、GItHubに対してさくらインターネットにSSH接続するための権限を与える必要があります。

そのため、SSH接続のための鍵を作成し

  • GitHub側に秘密鍵を設定
  • さくらサーバ側に公開鍵を設定

してあげましょう!

2. GitHub側に公開鍵&さくら側に秘密鍵、のSSH鍵ペアを生成

さくらインターネット側から見ると、GitHub上のソースコードをgit pullしてサーバ側に引っ張ってくる必要があります。

そのため、1とは別のSSH接続のための鍵を作成し

  • GitHub側に公開鍵を設定
  • さくらサーバ側に秘密鍵を設定

してあげる必要があります。

自動デプロイに必要な設定を行う

それでは、自動デプロイに必要な設定を行なっていきましょう!

1. GitHub側に秘密鍵&さくら側に公開鍵、のSSH鍵ペアを生成して登録する

■SSH鍵の生成


まずは、お手元のPCでSSH鍵を生成し、

  • GitHub側に秘密鍵
  • さくらインターネット側に公開鍵

を設定していきましょう!

お手元のPCで以下のコマンドを実行し、SSH鍵を設定します。

ssh-keygen -t rsa -b 4096 -C "comment" -m PEM -f ~/.ssh/id_rsa_sakura -N ""
  • commentのところは任意のものを入れてください
  • id_rsa_sakuraのところは、任意のファイル名にしてください。 (以下の説明は、ファイル名をid_rsa_sakuraにしたことを前提として書かせていただきますので、状況に応じてファイル名部分は書き換えしてください)
  • -N “”を最後に入れることで、パスフレーズの設定をすっ飛ばすことができます。

■さくらインターネット側に公開鍵を登録する


生成ができたら、次にさくらインターネット側に公開鍵を登録します。

まずは、以下のコマンドで公開鍵のコピーをしましょう!

cat ~/.ssh/id_rsa_sakura.pub 

表示されたものは頭から終わりまで、全部コピーしてOKです!

(ssh-rsaの部分や、== 以降も含む)

次に、さくらインターネットのサーバコントロールパネルにログインをしましょう!

ログインをしたら、サーバ情報>SSH公開鍵、のメニューを選択してください!

次に出てきたメニューで、**「新規追加ボタン」**を押します。

次に出てきた画面で、公開鍵の入力欄に、先ほど表示&コピーした公開鍵を貼り付けします。

後は、登録ボタンを押せば、さくらインターネット側への公開鍵の登録作業は完了です!

■GitHub側に秘密鍵&その他の情報を登録する

次に、GItHub側に秘密鍵&その他の情報を登録しましょう!

まずは、お手元のPCで以下のコマンドを実行します。

cat ~/.ssh/id_rsa_sakura | base64 

表示されたもの(秘密鍵)をコピーしてください!

次に、LaravelのソースコードをプッシュしているGitHubのリポジトリのページを開いてください!

開いたら、Settings → サイドバーからSecrets and variables内のActionsを選択し、出てきたページからNew repository Secretボタンを押し、以下に掲載した情報をそれぞれ登録していってください!

  • Name「PRIVATE_KEY」 & Secret 「先ほどコピーした秘密鍵
  • Name「HOST」 & Secret 「さくらレンタルサーバのホスト名●●●●.sakura.ne.jp)」
  • Name「USER」 & Secret 「さくらインターネットのユーザー名」
  • Name「APP_DIR」 & Secret 「/home/さくらインターネットのユーザー名/Laravelのプロジェクト名

<aside> 👂 Laravelのプロジェクト名は、LaravelのソースコードをプッシュしているGitHubのリポジトリ名を入れておけばOKです!

</aside>

これで、工程1は終了です!

2. GitHub側に公開鍵&さくら側に秘密鍵、のSSH鍵ペアを生成して登録する

■SSH鍵の生成


次に、さくらインターネットサーバの中にSSH接続をして、お手元のPCでSSH鍵を生成し、

  • GitHub側に公開鍵
  • さくらインターネット側に鍵

を設定していきましょう!

<aside> 👂 上の方にも書きましたが、 「2. **/vendor/フォルダ内と.envファイル以外のデータを、さくらインターネットのサーバにデプロイする」** の中の **「3、GitHubからさくらインターネットのサーバにデータを引っ張っておくことができるようにするための設定を行う」 において 「パスフレーズなし」**でSSH接続の設定を行なった方は、この工程は不要です。

以後の工程を経て、自動デプロイが失敗する場合は、この箇所の設定を行なってみてください。

</aside>

さくらインターネットサーバのの中にSSH接続をしてサーバにログインしたら、以下のコマンドを実行します。

ssh-keygen -t rsa -b 4096 -C "comment" -f ~/.ssh/id_rsa -N ""
  • commentのところは任意のものを入れてください
  • id_rsaのところは、任意のファイル名にしてください。 (以下の説明は、ファイル名をid_rsaにしたことを前提として書かせていただきますので、状況に応じてファイル名部分は書き換えしてください)
  • -N “”を最後に入れることで、パスフレーズの設定をすっ飛ばすことができます。

これで、SSH鍵の生成ができました。

秘密鍵ファイルは、さくらレンタルサーバ側の中に先ほどのコマンドで生成されたことになるので、以下はGitHub側に公開鍵を登録する作業のみを行えばOKとなります。

■GtHub側に公開鍵を登録する


それでは、GitHubに先ほど生成したSSH鍵の公開鍵側を登録しましょう!

引き続きさくらインターネットのレンタルサーバ内で、以下のコマンドを実行してください!

cat < ~/.ssh/id_rsa.pub

先ほど同様、表示されたものは全てコピーしてください!

次にGitHubへ公開鍵を登録しましょう!

GitHubを開いたら右上のユーザーアイコン(丸いやつ)をクリックします。

出てきたメニューから「Settings」の箇所を選択します。

次に出てきたページで、「SSH and GPG keys」を選択します。

表示された画面で「New SSH Key」を選択します。

次に出てきた画面でKeyのところに先ほどコピーした公開鍵の内容を貼り付けします。

貼り付けたら、Add SSH Keyボタンを押しましょう!

これで、GitHubへの公開鍵の登録が完了になります!

3. GitHub ActionsにYAMLファイルを登録し、自動化の指示を入力する

それでは、いよいよGitHubのリポジトリ内でGitHub ActionsにYAMLファイルによる自動化の指示を入力していきましょう!

Laravelのソースコードがプッシュされているリポジトリ上で「Actions」タブを選択します。

表示された画面から「set up workflow yourself」のリンクを選択します。

次に表示された画面に、自動化の指示内容を入力していきます。

以下の内容を入力してください!

(コードの細かい意味は追って説明します)

name: Deploy to Server

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:

    - name: Checkout repository
      uses: actions/checkout@v4
      
    - name: Set up SSH key
      env:
        PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
      run: |
        echo "$PRIVATE_KEY" | base64 --decode > private_key
        chmod 600 private_key
        eval $(ssh-agent -s)
        ssh-add private_key

    - name: Deploy to Server
      env:
        HOST: ${{ secrets.HOST }}
        USER: ${{ secrets.USER }}
        APP_DIR: ${{ secrets.APP_DIR }}
      run: |
        ssh -v -o StrictHostKeyChecking=no -i private_key ${USER}@${HOST} "cd ${APP_DIR} && git pull origin main && php composer.phar install --no-dev && php artisan migrate --force"

入力をしたら、Commit Changesボタンを押しましょう!

コミットメッセージを入力する画面が求められるので、コミットメッセージを入力して「Commit Changes」ボタンを押します。

これで基本的には完了!

Actionsタブで自動化によるフローの実行結果が表示されます。

  • 赤・・・自動化失敗など何らかの問題がある
  • 緑・・・自動化によるタスク実行が成功

と見分けることができます!

緑が無事に出たら、ちゃんとデプロイがなされているはずです!

以後、mainブランチにデータをプッシュ→自動デプロイが実行されますので、確認してみてください!

YAMLファイル の中身の解説

さて、先ほど貼り付けたYAMLファイルの中身について見ていきましょう!YAMLファイルに書かれた内容を総じて言うと

「特定の条件(mainブランチにコードをプッシュしたとき)に基づいて、自動的にサーバーに新しいコードをデプロイ(アップデート)する仕組み」

の詳細を定義しています!

name: Deploy to Server

on:
  push:
    branches:
      - main
  • name: このファイルの名前を「Deploy to Server」にしています。
  • on: どんなイベントが起きたらこのファイルを実行するかを設定しています。ここでは、「push」というイベント、つまりコードがリポジトリにプッシュされたときに実行されます。
  • branches: 特に「main」ブランチにプッシュされたときに実行されます。

簡単に言うと: mainブランチに新しいコードが追加されたらこのYAMLファイルに書かれていることを実行する、という仕組みの根幹を定義しています。

jobs:
  deploy:
    runs-on: ubuntu-latest

  • jobs: 実行する仕事(ジョブ)を定義しています。
  • deploy: このジョブの名前です。
  • runs-on: このジョブがどんなコンピュータ(仮想マシン)で実行されるかを指定しています。ここでは、最新のUbuntu(うぶんつ)というLinuxのバージョンを使います。

簡単に言うと: このジョブは最新のUbuntuで実行されます。ここは難しいのであまり気にしなくてもいいかもです。

steps:
  - name: Checkout repository
    uses: actions/checkout@v4
  • steps: ジョブの中で実行するステップを定義します。
  • name: このステップの名前を「Checkout repository」(リポジトリのチェックアウト)にしています。
  • uses: **actions/checkout**というツールのバージョン4を使ってリポジトリのコードを取得します。

簡単に言うと: まず、対象リポジトリから最新のコードを取得します。

- name: Set up SSH key
  env:
    PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
  run: |
    echo "$PRIVATE_KEY" | base64 --decode > private_key
    chmod 600 private_key
    eval $(ssh-agent -s)
    ssh-add private_key
  • name: このステップの名前を「Set up SSH key」(SSHキーの設定)にしています。
  • env: 環境変数を設定します。ここでは**PRIVATE_KEY**という秘密の鍵(シークレット)を使用しています。
  • run: 実行するコマンドを定義しています。
    1. echo “$PRIVATE_KEY” | base64 –decode > private_key: **PRIVATE_KEYというシークレットをデコードして、private_key**というファイルに保存します。
    2. chmod 600 private_key: **private_key**ファイルの権限を設定します。これにより、ファイルの所有者のみが読めるようになります。
    3. eval $(ssh-agent -s): SSHエージェントを起動します。SSHエージェントはSSHキーを管理するためのプログラムです。
    4. ssh-add private_key: **private_key**ファイルをSSHエージェントに追加します。

簡単に言うと 安全にサーバーに接続するための秘密の鍵を設定します。

- name: Deploy to Server
  env:
    HOST: ${{ secrets.HOST }}
    USER: ${{ secrets.USER }}
    APP_DIR: ${{ secrets.APP_DIR }}
  run: |
    ssh -v -o StrictHostKeyChecking=no -i private_key ${USER}@${HOST} "cd ${APP_DIR} && git pull origin main && php composer.phar install --no-dev && php artisan migrate --force"
  • name: このステップの名前を「Deploy to Server」(サーバーへのデプロイ)にしています。
  • env: 環境変数を設定します。HOSTUSER、**APP_DIR**というシークレット(先にリポジトリ内に設定した環境変数)を使用します。
  • run: 実行するコマンドを定義しています。
    1. ssh -v -o StrictHostKeyChecking=no -i private_key ${USER}@${HOST}: SSHを使って、指定されたユーザーとホストに接続します。
    2. “cd ${APP_DIR} && git pull origin main && php composer.phar install –no-dev && php artisan migrate –force”: 接続先のサーバーで、指定されたディレクトリに移動し、最新のコードを取得して、必要な依存関係をインストール(php composer.phar install)し、データベースの更新(php artisan migrate)を行います。

簡単に言うと: サーバーに接続し、最新のコードを取得して、必要な設定や更新を行います。

以上です!!!!

.envファイルの編集以外はこれで自動化できるはずですね!!!!ぜひトライしてみてくだsだい!!!!


一覧へ戻る

ADAデプロイ会

シェアする

  • このエントリーをはてなブックマークに追加

フォローする