LaravelをCircleCI 2.0で自動テストしherokuへ自動デプロイ

# はじめに
ポートフォリオをLaravelで作成した際に、テストからデプロイまでをCircleCIで自動化したので、まとめてみました。



# 前提条件
- herokuアカウントを作成し、Heroku CLIをインストール済み
- ``heroku config:set``でDBを設定しLaravelアプリが既にherokuにデプロイできる状態になっていること
- CircleCIとGitHubを連携済み

# デプロイまでの流れ
1. GitHubのリモートリポジトリへpush
2. pushをフックにCircleCIでマイグレーションとシーディングを実行
3. テストデータが入った状態で、テストを実行
4. 問題なければherokuへ自動デプロイ

# CircleCI用のデータベース設定を追加
使用するDockerイメージ（https://hub.docker.com/r/circleci/mysql/）
の設定値をLaravelの`config/database.php`に追記

```php:config/database.php
'connections' => [
        'circle_test' => [
            'driver' => 'mysql',
            'host' => '127.0.0.1',
            'port' => '3306',
            'database' => 'circle_test',
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ]
 ]
```

# .circleci/config.ymlを作成
Larevelプロジェクトのルートディレクトリに
`.circleci/config.yml`を作成

```
Laravel-project
  ├ .circleci
  │   └config.yml
  ├ app
  ├ bootstrap
  ├ config
  ├ database
  ・
  ・
  ・
```
CircleCIでプロジェクトを作る際に出てくるおすすめ設定をベースに
いくつか変更しました。

```yml:.circleci/config.yml
# PHP CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-php/ for more details
#
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here
      - image: circleci/php:7.2
      - image: circleci/mysql:5.7

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # - image: circleci/mysql:9.4

    environment:
      - APP_DEBUG: true
      - APP_ENV: testing
      - APP_KEY: APP_KEYを入れてください
      - DB_CONNECTION: circle_test
      - MYSQL_ALLOW_EMPTY_PASSWORD: true

    working_directory: ~/repo

    steps:
      - checkout

      # Install PHP Extension
      - run: sudo docker-php-ext-install pdo_mysql

      # Download and cache dependencies
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "composer.json" }}
          # fallback to using the latest cache if no exact match is found
          - v1-dependencies-

      - run: composer install -n --prefer-dist

      - save_cache:
          paths:
            - ./vendor
          key: v1-dependencies-{{ checksum "composer.json" }}

      # run seeding
      - run: php artisan migrate
      - run: php artisan db:seed

      # run tests!
      - run: php ./vendor/bin/phpunit
       
      #heroku deploy
      - deploy:
          name: Deploy Master to Heroku
          command: |
            if [ "${CIRCLE_BRANCH}" == "master" ]; then
              git push https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME.git master
            fi
```

## 変更箇所
### Dockerイメージを指定
DBにMySQLを使うため、MySQLのDokerイメージを指定

```yml:
docker:
  - image: circleci/php:7.2
  - image: circleci/mysql:5.7
```

### 環境変数を指定

```yml:
environment:
  - APP_DEBUG: true
  - APP_ENV: testing
  - APP_KEY: APP_KEYを入れてください
  - DB_CONNECTION: circle_test
  - MYSQL_ALLOW_EMPTY_PASSWORD: true
```

### PDO_MYSQLのインストール
DBを使用したテストのためPDO_MYSQLをインストール

```yml:
# Install PHP Extension
  - run: sudo docker-php-ext-install pdo_mysql
```

### マイグレーションとシーディング

```yml:
# run seeding
    - run: php artisan migrate
    - run: php artisan db:seed
```

### herokuへデプロイ

```yml:
#heroku deploy
      - deploy:
          name: Deploy Master to Heroku
          command: |
            if [ "${CIRCLE_BRANCH}" == "master" ]; then
              git push https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME.git master
            fi
```

# HEROKU_API_KEYとHEROKU_APP_NAMEを設定
herokuへログインしAccount SettingsからAPI Keyをコピー
![FireShot Capture 020 - Account - Heroku - dashboard.heroku.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406100/10f8a66f-dd01-4a5b-b2cc-b697fa0182f7.png)

CircleCIでプロジェクト名の設定にAPI Keyをペースト
![CircleCI - circleci.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406100/efbd7227-9fd4-09d5-160f-4543e14f7126.png)

HEROKU_APP_NAMEはherokuのプロジェクト名を入力

# GitHubへpush

```tex:
cd Laravel-project
git init
git remote add origin [GitHubで作成したリポジトリのURL]
git remote -v
でリモートリポジトリを設定

git add .
git commit -m "CircleCI"
git push origin master
```

# 実行結果
CircleCIへログインしプロジェクトのjobsが``SUCCESS``になっていればデプロイ成功
![IMG_4260.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406100/14cbac40-dc88-77f4-8ccc-3d1a41cad20e.png)