のんびりSEの議事録

プログラミング系のポストからアプリに関してのポストなどをしていきます。まれにアニメ・マンガなど

CircleCIでmysql8を使用する設定

CircleCIでmysqlを使用しようとしたときに、思ってた以上にハマってしまうポイントがあったので、備忘録として残しておきます。 versionは2を使用する想定です。

設定ファイル

Railsアプリを想定した例です。

  • .circleci/config.yml
version: 2
general:
  branches:
    only:
      - master
      - develop
      - /^test.*/
jobs:
  build:
    working_directory: ~/sample
    docker:
      - image: circleci/ruby:2.5.3-node-browsers
        environment:
          RAILS_ENV: test
          DB_USER: dbuser
          DB_PASSWORD: ******
          DB_HOST: '127.0.0.1' # Point 1
      - image: circleci/mysql:8.0.13-ram
        command: |
          mysqld --default-authentication-plugin=mysql_native_password
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
          MYSQL_DATABASE: sample_test
          MYSQL_HOST: 127.0.0.1
          MYSQL_ROOT_PASSWORD: ''
          MYSQL_USER: dbuser
          MYSQL_PASSWORD: dbuser
          MYSQL_ROOT_HOST: '%'
    steps:
      - checkout

      - run:
          name: Install System Dependencies
          command: |
            sudo apt-get update
            sudo apt-get install build-essential patch ruby-dev zlib1g-dev liblzma-dev
            sudo apt-get install -y lsb-release mysql-client

      - run:
          name: Install dockerize
          command: wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && sudo tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
          environment:
            DOCKERIZE_VERSION: v0.6.1

      - run:
          name: Wait for DB
          command: dockerize -wait tcp://127.0.0.1:3306 -timeout 3m # Point 2

      - restore_cache:
          name: Restore bundle cache
          keys:
            - solos-bundle-{{ checksum "Gemfile.lock" }}
            - solos-bundle-

      - run:
          name: Bundle Install
          command: bin/bundle check --path vendor/bundle || bin/bundle install --path vendor/bundle --jobs 4 --retry 3
      - save_cache:
          name: Store bundle cache
          key: solos-bundle-{{ checksum "Gemfile.lock" }}
          paths:
            - vendor/bundle

      - run:
          name: Rubocop
          command: bundle exec rubocop --rails -f html -o doc/rubocop.html --fail-level F --force-exclusion 'app/**/*.rb' --force-exclusion 'lib/**/*.rb'

      - store_artifacts:
          path: doc

      - run:
          name: Set up DB
          command: |
            bundle exec rake db:create
            bundle exec rake db:schema:load

      - run:
          name: RSpec
          command: bundle exec rspec --format progress spec

      - store_artifacts:
          path: coverage

Point

1. DBの接続先を127.0.0.1に向ける

CircleCIではnetnsを利用していて、localhostmysqlに接続しようとすると、ConnectionErrorになるので、127.0.0.1に変更する必要があります。 以下が詳しくまとめられてました。

ja.stackoverflow.com

2. DBのイメージが立ち上がるまで待機する

先にテスト等のアクションが走らないように、dockerizeを利用して待機しておく必要があるようです。 これは公式でも載ってました。

circleci.com

どうも最近Dockerのネットワーク周りの理解がまだ不足しているなと気づけたので、もうちょいその辺を重点的に調べておきたいと痛感しました。。。

参考文献

tech.smarthr.jp