GitHub ActionsでLaravelプロジェクトをデプロイする

Laravel Sailで作成したプロジェクトをServerless FrameworkでAWS LambdaとAurora Serverlessへデプロイできるようにしましたが、GitHub Actionsを利用してデプロイできるか試してみました。


## 前提

[こちら](https://github.com/kai-kou/laravel-sail-sample-projects/tree/feature/deploy-aws-lambda)のリポジトリにGitHub Actionsのワークフローを追加する手順となります。

## 手順

### リポジトリにSecretを追加する

AWS環境へデプロイするのにAWSのクレデンシャル情報が必要となるため、対象となるリポジトリに以下のSecretを追加します。

- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/26a27999-d6f1-68b2-7786-007a5ff6f0da.png)

### デプロイ用の`.env`ファイルを用意する

GitHub Actions環境でLaravelプロジェクトを展開する必要があるので、デプロイ用の`.env`ファイルを用意します。

```console
> cp .env.example .env-deploy

# 環境に合わせて編集
```

### GitHub Actionsのワークフロー定義

以下がワークフローの定義となります。

```yaml
name: deploy

on:
  push:
    branches:
    - main

jobs:
  deploy:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: cache vendor
      id: cache
      uses: actions/cache@v1
      with:
        path: ./vendor
        key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
        restore-keys: |
          ${{ runner.os }}-composer-

    - name: Composer install
      if: steps.cache.outputs.cache-hit != 'true'
      run: composer install -n --prefer-dist

    - name: Copy .env
      run: cp .env.deploy .env
    - name: generate key
      run: php artisan key:generate

    - name: Setup Node.js
      uses: actions/setup-node@v1
      with:
        node-version: '12.x'

    - name: Install Dependencies
      run: |
        npm install serverless -g
        npm install

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-1

    - name: Deploy to Lambda
      run: sls deploy

    - name: Migrate
      run: vendor/bin/bref cli --region=ap-northeast-1 laravel-dev-artisan -- migrate

    - name: S3 sync
      run: aws s3 sync public s3://kai-laravel-test/public --delete
```

検討事項として、`S3 sync`にバケット名をベタ書きしている点、AWSクレデンシャルをステージ(prod、dev)ごとに切り替える方法などです。


## 動作確認

実際にGitHubリポジトリへpushしてワークフローが動作するか確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/f9c33920-9da6-fb0a-ef87-71719c5279ec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/48a3fc55-acf0-35fd-97d2-7dd9e82edcc8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/6e14f916-d44f-11e9-7348-2f1234e4f0e2.png)

うまく動作しました。デプロイ環境へアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/be99ac36-448d-92b4-327b-fe62381890c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/8bc40529-8b3c-54d6-93a5-7148033d5cf5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/8db254ed-caf8-be29-6fe1-5e916194c176.png)

うまく動作しました。
やったぜ

## 不要になったら

手元にリポジトリをクローンして開発・デプロイ環境があれば、コマンドで削除できます。

```console
> aws s3 rm --recursive s3://kai-laravel-test/
> serverless remove
```

##　参考

kai-kou/laravel-sail-sample-projects at feature/deploy-aws-lambda
https://github.com/kai-kou/laravel-sail-sample-projects/tree/feature/deploy-aws-lambda

GitHub Actionsを使ってAWS Lambdaへ自動デプロイ (詳説＋デモ手順付きver) - Qiita
https://qiita.com/homines22/items/412d4e81b24804d75205

GitHub ActionsでAWS S3に自動でデプロイする（静的ファイルのディレクトリを丸ごとアップロードする） - Qiita
https://qiita.com/tippy/items/488e52411a9a5765330f