CircleCI2.0+BitbucketでLaravel MySQLでテスト設定の備忘録

# CircleCI2.0+BitbucketでLaravel MySQLでテスト設定の備忘録

## まえがき

phpunitでのテストは行っていたがテストの自動実行が出来ていなかったのでCircleCIを使って自動実行するようにした。

## 前提条件

+ リポジトリはbitbucketを利用
+ Laravel 6.4.x
+ テスト用のデータベース設定は migrateとseedで事前に設定できる様にしてある
+ tests以下にユニットテストを記述し、開発機上ですべてのテストが成功する状態

## config.yml

```yaml
# PHP CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-php/ for more details
#
version: 2
jobs:
  build:
    shell: /bin/bash

    docker:
      # Specify the version you desire here
      - image: circleci/php:7.2-node-browsers

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # Using the RAM variation mitigates I/O contention
      # for database intensive operations.
      - image: circleci/mysql:5.7-ram
      #- image: circleci/mysql:5.7
      - image: redis:2.8.19

    environment:
      - APP_DEBUG: true
      - APP_ENV: testing
      - APP_KEY: base64:moozahMeihbeebahpeYeGuivireipoVeesahNgah=   # ← Your app key here.
      - DB_CONNECTION: circle_test
      - MYSQL_ALLOW_EMPTY_PASSWORD: true

    #working_directory: ~/repo

    steps:
      - checkout

      - run: sudo apt update # PHP CircleCI 2.0 Configuration File# PHP CircleCI 2.0 Configuration File sudo apt install zlib1g-dev libsqlite3-dev
      - run: sudo docker-php-ext-install zip
      - run: sudo apt-get install libpng-dev

      - run:
          name: Install PHP Extensions
          command: sudo docker-php-ext-install pdo_mysql mbstring gd

      # Download and cache dependencies
      - restore_cache:
          keys:
            # "composer.lock" can be used if it is committed to the repo
            - 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

      - run:
          name: PDF保存フォルダの作成
          command: |
            sudo mkdir -p /var/myapp/pdf /var/myapp/pdf/sengen
            sudo chmod 0777 -R /var/myapp
            sudo chmod 0777 -R /var/myapp/pdf

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

      - run:
          name: Wait for db
          command: dockerize -wait tcp://localhost:3306 -timeout 1m

      - restore_cache:
          keys:
            - node-v1-{{ checksum "package.json" }}
            - node-v1-
      - run: yarn install
      - save_cache:
          key: node-v1-{{ checksum "package.json" }}
          paths:
            - node_modules

      - run:
          name: Migration & Seeding
          # working_directory: laravel
          command: php artisan migrate --seed

      - run: php -dxdebug.coverage_enable=1 ./vendor/phpunit/phpunit/phpunit --configuration ./phpunit.xml ./tests --teamcity



```

### メモ

+ \#working_directory: ~/repo
  build直下のworking_directoryを有効にしておくと他のworking_directoryに影響してうまく動かなかった。

+ run: sudo apt-get install libpng-dev
  QR生成モジュールを使っているのでapt-getでlibpng-devをインストールした

+ 作業フォルダの作成
+ 
```yaml
    - run:
        name: PDF保存フォルダの作成
        command: |
          sudo mkdir -p /var/myapp/pdf /var/myapp/pdf/sengen
          sudo chmod 0777 -R /var/myapp
          sudo chmod 0777 -R /var/myapp/pdf
  ```
  テスト実行で作成する作業フォルダをmkdirしてchmod 0777 した

+ command: php artisan migrate --seed

  を実行してmigrateとseedを行いテスト用データベースとテストデータを設定

+ run: php -dxdebug.coverage_enable=1 ./vendor/phpunit/phpunit/phpunit --configuration ./phpunit.xml ./tests --teamcity
  ユニットテストを追加。これで良いのかまだ分からない。とりあえずビルドに失敗するとCircleCIでエラーが発生する様にはなった。

  

### config/database.php

```php

return [
    'default' => env('DB_CONNECTION', 'mysql'),
    '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,
        ],
      ...以下略

```

テスト用のMySQLコネクションをdatabase.php に追記した。



## 結果

bitbucketにpushすると自動でテストを実行して失敗したら通知が届く様になった。

## 参考

以下の記事を参考にさせて頂きました

+ https://qiita.com/kazuhei/items/29ee2c3cbd5960814959