AWSのEC2に構築したLaravelプロジェクトに対して、Github Actionsを利用して自動テスト・デプロイをしてみます。
デプロイまでの手順・自動化の大まかな流れは下記のようになります。
1. ローカル環境からGitHubへpush。
2. GitHubのmusterブランチに問題なくマージされると、
3. Github Actions上の仮想環境から、SSHによってEC2のサーバーに接続。
4. 接続されたらLaravelプロジェクト内に移動し、GitHubからpullしてデプロイ完了。
上記自動化のためには、Github Actions上の仮想環境からSSHによってEC2のインスタンスサーバーと接続する必要があります。そのためにEC2上でSSH鍵の作成し、秘密鍵等をGitHubに登録する必要があります。
EC2
まずEC2上のサーバーに接続したら、SSH鍵の有無(id_rsaやid_rsa.pubといった名前のキーペアとしてのファイル)を調べます。
1 |
$ ls -al ~/.ssh |
存在しない場合(もしくは既存の鍵と分けて利用したい場合)は、SSH鍵を新規作成します。今回途中の質問は、何も入力せずに進みます。
1 |
$ ssh-keygen -t rsa -b 4096 -m pem -C "hoge@hoge.co.jp" |
上記コマンドによって、デフォルトでは id_rsa (秘密鍵)とid_rsa.pub (公開鍵)ファイルが生成されます。
生成されたid_rsa.pubの内容を、リダイレクトによってauthorized_keysに追記しておきます。
1 |
$ cat id_rsa.pub >> authorized_keys |
GitHub
構築したLaravelプロジェクトであるリポジトリの「Actions」画面を開くと、すでに雛形のWorkflowとしてLaravelが用意されているので、今回はまずそれを利用します。
プロジェクトのルートディレクトリに.github/workflows/ディレクトリ、そして設定ファイルであるlaravel.ymlが生成されます。今回はそのまま「Start commit」>「Commit new file」をクリックします。もちろんはじめにGitHub上で生成しなくても、ローカルで作成し後でpushすることが可能です。

次にGitHub Actionsの仮想環境からSSHによってEC2のインスタンスサーバーと接続するための準備をします(正確に言うならば環境変数の準備:後述)。
構築したLaravelプロジェクトであるリポジトリの「Settings」>「Secrets」画面を開きます。「Add a new secret key」ボタンをクリックして、NameとValueのフォームにそれぞれ以下の説明のように値を設定します。
1 |
$ cat ~/.ssh/id_rsa |
デプロイの自動化
最後にテストに通った場合のデプロイ自動化のために、デフォルトで生成されたlaravel.ymlを編集します。※本記事ではあらかじめlaravel.ymlをローカルにpullしてから、ローカル上で編集、再度GitHubにpushしています。
下記ハイライト部分が追記・編集した部分です。
Laravelのプロジェクト/.github/workflows/laravel.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
name: Laravel on: push: branches: [master] pull_request: branches: [master, dev] jobs: laravel-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Copy .env run: php -r "file_exists('.env') || copy('.env.example', '.env');" - name: Install Dependencies run: composer install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist - name: Generate key run: php artisan key:generate - name: Directory Permissions run: chmod -R 777 storage bootstrap/cache - name: Create Database run: | mkdir -p database touch database/database.sqlite - name: Execute tests (Unit and Feature tests) via PHPUnit env: DB_CONNECTION: sqlite DB_DATABASE: database/database.sqlite run: vendor/bin/phpunit deploy: if: github.ref == 'refs/heads/master' needs: [laravel-tests] runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Deploy env: PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} USER_NAME: ${{ secrets.USER_NAME }} HOST_NAME: ${{ secrets.HOST_NAME }} run: | echo "$PRIVATE_KEY" > private_key && chmod 600 private_key ssh -o StrictHostKeyChecking=no -i private_key ${USER_NAME}@${HOST_NAME} 'cd /var/www/aws-laravel/ && git pull origin master' |
7行目
devを追記し、devブランチにプルリクエストをした場合にもテストが実行されるようにしています。
33〜35行目
デプロイを実行するためのdeployという名前のジョブを定義しています。このdeployジョブはmaster限定(34行目のif)、かつlaravel-testsジョブのテストに成功した場合(35行目のneeds)にのみ実行されます。
40〜43行目
GitHubの「Secrets」画面で入力した値を環境変数として設定し、SSH接続時に利用しています。
以上で準備は終了です。テストにパスし最終的にGitHub上のmasterにマージされると、下記のような表示が確認できます。
deployジョブにも緑のチェックがあることが確認できます。
参照ページ