★CI/CD laravel テスト 設定

masterブランチ以外ではworkflowsが動かないように設定した場合

f:id:noel-blog:20200729145204p:plain

masterブランチのみでworkflowsが動く

f:id:noel-blog:20200729145214p:plain

Laravel, Laradock, Docker, CI/CD, テスト

テストが通った時の設定

データベースが見つかりませんというエラーに対して。

// MySQLコンテナに入る
$ docker exec -it laradock_mysql_1 bash

// ログイン
$ mysql -u root -p

// テストようのデータベースを作成
> CREATE DATABASE tweet_testing DEFAULT CHARACTER SET utf8mb4;

// MySQLコンテナを出て、workspaceコンテナに入る
$ php artisan migrate --database=mysql_testing



[app側] phpunit.xml

    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>

        <!-- <server name="DB_CONNECTION" value="sqlite"/> -->
        <server name="DB_CONNECTION" value="mysql_testing"/>

        <!-- <server name="DB_DATABASE" value=":memory:"/> -->
        <server name="DB_DATABASE" value="tdd_testing"/>

        <server name="MAIL_DRIVER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
    </php>



[app側] .env

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=tweet_third
DB_USERNAME=bird
DB_PASSWORD=secret

DB_CONNECTION=mysql_testing
DB_TESTING_HOST=mysql
DB_TESTING_PORT=3306
DB_TESTING_DATABASE=tweet_testing
DB_TESTING_USERNAME=root
DB_TESTING_PASSWORD=root



[app側] databases/config.php

'mysql_testing' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_TESTING_HOST', '127.0.0.1'),
            'port' => env('DB_TESTING_PORT', '3306'),
            'database' => env('DB_TESTING_DATABASE', 'forge'),
            'username' => env('DB_TESTING_USERNAME', 'forge'),
            'password' => env('DB_TESTING_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],



[app側] .circleci/config.yml

php artisan key:generate --show

(--showオプションを付けることで、直接.envに値が設定されず、
コンソールにキーが表示されます。)

version: 2
jobs:
  build:
    docker:
      - image: circleci/php:7.3-cli
        environment:
          - TZ=Asia/Tokyo
          - LOCALE=ja
          - LANG=ja_JP.UTF-8
          - DB_TESTING_HOST=127.0.0.1
          - DB_TESTING_DATABASE=tweet_testing
          - DB_TESTING_USERNAME=root
          - DB_TESTING_PASSWORD=root
          - MAIL_DRIVER=log
          - APP_ENV=testing
          - APP_URL=http://localhost
          - APP_KEY=[php artisan key:generate --showの値 (base64も含む)]

      - image: circleci/mysql:5.7-ram
        command: |
          mysqld --default-authentication-plugin=mysql_native_password
        environment:
          - MYSQL_DATABASE=tweet_testing
          - MYSQL_ROOT_PASSWORD=root
          - MYSQL_ROOT_HOST=%
          - TZ=Asia/Tokyo

    steps:
      - checkout

      - run:
          name: Install
          command: |
            sudo apt update
            sudo docker-php-ext-install intl pdo_mysql mbstring zip bcmath
            # timezone
            sudo cp -f /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
            # locale
            echo 'ja_JP.UTF-8 UTF-8' | sudo tee -a  /etc/locale.gen
            echo "date.timezone = Asia/Tokyo" | sudo tee /usr/local/etc/php/conf.d/date.ini
            sudo locale-gen
            sudo update-locale LANG=ja_JP.UTF-8

      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "composer.json" }}
            - v1-dependencies-

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

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

      - run:
          name: Prepare Database
          command: |
            # wait for db
            dockerize -wait tcp://127.0.0.1:3306 -timeout 1m

      - run:
          name: Run tests
          command: |
            ./vendor/bin/phpunit

      - store_artifacts:
          path: ./storage/logs/laravel.log
          destination: /tmp/artifacts/laravel.log

上記のconfig.ymlを編集して、特定のブランチのみ実行する場合

blog.sshn.me

workflowsキーのブロックを作る。

  • version: 2であること。
  • build_deploy:は何でもOK
  • jobsに対して、filtersを掛けてあげるだけ。
version: 2
jobs:
  build:
    docker:
      - image: circleci/php:7.3-cli
        environment:
          - TZ=Asia/Tokyo
          - LOCALE=ja
          - LANG=ja_JP.UTF-8
          - DB_TESTING_HOST=127.0.0.1
          - DB_TESTING_DATABASE=tweet_testing
          - DB_TESTING_USERNAME=root
          - DB_TESTING_PASSWORD=root
          - MAIL_DRIVER=log
          - APP_ENV=testing
          - APP_URL=http://localhost
          - APP_KEY=[]

      - image: circleci/mysql:5.7-ram
        command: |
          mysqld --default-authentication-plugin=mysql_native_password
        environment:
          - MYSQL_DATABASE=tweet_testing
          - MYSQL_ROOT_PASSWORD=root
          - MYSQL_ROOT_HOST=%
          - TZ=Asia/Tokyo

    steps:
      - checkout

      - run:
          name: Install
          command: |
            sudo apt update
            sudo docker-php-ext-install intl pdo_mysql mbstring zip bcmath
            # timezone
            sudo cp -f /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
            # locale
            echo 'ja_JP.UTF-8 UTF-8' | sudo tee -a  /etc/locale.gen
            echo "date.timezone = Asia/Tokyo" | sudo tee /usr/local/etc/php/conf.d/date.ini
            sudo locale-gen
            sudo update-locale LANG=ja_JP.UTF-8

      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "composer.json" }}
            - v1-dependencies-

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

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

      - run:
          name: Prepare Database
          command: |
            # wait for db
            dockerize -wait tcp://127.0.0.1:3306 -timeout 1m

      - run:
          name: Run tests
          command: |
            ./vendor/bin/phpunit

      - store_artifacts:
          path: ./storage/logs/laravel.log
          destination: /tmp/artifacts/laravel.log

workflows:
  version: 2
  build_deploy:
    jobs:
      - build:
          filters:
            branches:
              only: master