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
を利用していて、localhost
でmysqlに接続しようとすると、ConnectionErrorになるので、127.0.0.1
に変更する必要があります。
以下が詳しくまとめられてました。
2. DBのイメージが立ち上がるまで待機する
先にテスト等のアクションが走らないように、dockerize
を利用して待機しておく必要があるようです。
これは公式でも載ってました。
どうも最近Dockerのネットワーク周りの理解がまだ不足しているなと気づけたので、もうちょいその辺を重点的に調べておきたいと痛感しました。。。