Github ActionsでLaravelのテストとECRへpushするまで

## 目標
Laravelで作成したアプリに対して、Github Actionsを利用してテストの実行及びECRへのイメージのpushまで行います。
### 前提条件
- Laravelアプリケーション作成済み
- Laravel実行用イメージ作成済み
- ECRのリポジトリ作成済み

## Github Actionsについて
いわゆるCI / CDです。細かい部分は既に多くご紹介されているので省略いたします。
[公式](https://github.co.jp/features/actions)

Public Repositoryだと無料みたいですね。
PrivateだとFreeプランでは1ヶ月2000分までだとか。

## Laravelのテスト実行
こちらは既にテンプレートが用意されており、変更するところといえば実行タイミングくらいでしょうか。MySQLやRedisが欲しい場合は別途追加する必要があります。
今回はテストなのでDBもsqliteで、実行タイミングもmasterへのpushという指定をしていますが、実際はかなり柔軟に設定できます。
[リファレンス](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#on)

```yaml
name: Laravel

on:
  push:
    branches:
    - master

jobs:
  laravel-tests:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - 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: Create Database
      run: |
        mkdir -p database
        touch database/search.sqlite
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      env:
        DB_CONNECTION: sqlite
        DB_DATABASE: database/database.sqlite
      run: vendor/bin/phpunit

```
masterへのpushが完了すると、

<img width="1266" alt="Screen Shot 2019-12-02 at 15.08.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455289/46ed2395-2bdb-2afb-b532-a0b8c6de8267.png">

という感じで結果を見ることができます。
特にテストも追加していないデフォルトの状態でテストを実行した場合、実行時間は合計35秒でした。このあと何回か実施したところ50秒くらいのもあったので、そんくらいのブレでおさまる感じみたいですね。

## ECRへのpush
テストだけで終わるのもさみしいので、ECRへイメージをpushするところまでやりたいと思います。
こちらも既にテンプレートが用意されているというか、もっといえばECSへのデプロイまでやってくれるテンプレートがありましたので、まずはそのうちのECRへのイメージのpushのところを使ってやってみようと思います。

```yaml

on:
  push:
    branches:
      - master

name: Deploy to Amazon ECS

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v1

    - 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: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1

    - name: Build, tag, and push image to Amazon ECR
      id: build-image
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        ECR_REPOSITORY: sample_repository
        IMAGE_TAG: ${{ github.sha }}
      run: |
        docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
        echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"

```

変更するところはリポジトリ名です。今回は「sample_repository」というリポジトリ名にしているので、こちらを変更しています。

```yaml
        ECR_REPOSITORY: sample_repository
```

また、「${{ secrets.AWS_ACCESS_KEY_ID }}」という形で利用できる変数は以下を参考に設定してみてください。今回設定するのは以下2点です。

- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY

[登録手順](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets)

実行すると以下のようになるかなと思います。
<img width="1264" alt="Screen Shot 2019-12-02 at 15.27.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455289/15408d8f-5551-d97a-f58f-b9531fa2c774.png">

## 終わりに
今回の設定のままだとイメージのタグが${{ github.sha }}で設定されてしまうので、ブランチのタグから取得するような形にするときれいにイメージを保存できそうですね。