実現したいこと
閲覧いただきありがとうございます。
rails,docker,CircleCIを用いて開発を行っています。
CircleCIでテスト実行前にrails db:migrateを実行すると下記エラーが出てしまいます。
== 20191125043900 CreateUsers: migrating ====================================== -- create_table(:users, {:id=>:bigint, :unsigned=>true}) -> 0.0018s -- add_index(:users, :email, {:unique=>true}) rails aborted! StandardError: An error has occurred, all later migrations canceled: Mysql2::Error: Specified key was too long; max key length is 767 bytes
エラーの原因はkeyの制限が最大の767byteを超えたことと認識しておりますが、どのようにCircleCI内で解決してよいかわからず、下に記載したとおり自分なりに修正してみましたが、うまくいきません。
解決策などご教示いただければ幸いです。
エラーの該当コード
config.yml
... - run: name: Database setup command: bundle exec rails db:migrate ...
コード
config.yml
version: 2.1 orbs: ruby: circleci/ruby@1.1.2 jobs: build: docker: - image: cimg/ruby:2.6.5 working_directory: ~/myapp/web steps: - checkout: path: ~/myapp - restore_cache: name: bundle install restore keys: - v1-dependencies-{{ checksum "Gemfile.lock" }} - v1-dependencies- - run: name: default mysql client install command: | sudo apt update sudo apt-get install default-mysql-client sudo apt-get install libmysqlclient-dev - run: name: bundle Install command: bundle check --path=vendor/bundle || bundle install --jobs=4 --retry=3 --path vendor/bundle - save_cache: name: bundle install save paths: - ./vendor/bundle key: v1-dependencies-{{ checksum "Gemfile.lock" }} test: docker: - image: cimg/ruby:2.6.5 - image: circleci/mysql:5.5 environment: MYSQL_DATABASE: 'ci_test' MYSQL_USER: 'root' MYSQL_ROOT_PASSWORD: 'rootpass' environment: BUNDLE_JOBS: "3" BUNDLE_RETRY: "3" APP_DATABASE_HOST: "127.0.0.1" RAILS_ENV: test TZ: "Asia/Tokyo" working_directory: ~/myapp/web steps: - checkout: path: ~/myapp - restore_cache: name: bundle install restore key: v1-dependencies-{{ checksum "Gemfile.lock" }} - run: name: default mysql client install command: | sudo apt update sudo apt-get install default-mysql-client sudo apt-get install libmysqlclient-dev - run: name: bundle install command: bundle check --path=vendor/bundle || bundle install --path vendor/bundle --clean --jobs 4 --retry 3 - run: name: RUN apt install tzdata command: sudo apt install tzdata - run: name: Database setup command: bundle exec rails db:migrate - run: name: Echo Test command: echo "CircleCI Test" - run: name: test command: bundle exec rake test workflows: version: 2 build_and_test: jobs: - build - test: requires: - build
Gemfile
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.6.5' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 6.0.3', '>= 6.0.3.7' # Use mysql as the database for Active Record gem 'mysql2', '>= 0.4.4' # Use Puma as the app server gem 'puma', '~> 4.1' # Use SCSS for stylesheets gem 'sass-rails', '>= 6' # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker gem 'webpacker', '~> 4.0' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.7' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use Active Model has_secure_password # gem 'bcrypt', '~> 3.1.7' # Use Active Storage variant # gem 'image_processing', '~> 1.2' # jQuery gem "jquery-rails" gem 'rails-i18n', '~> 6' # enum i18n gem "enum_help" gem "config" gem 'faraday' gem 'acts_as_paranoid', '~> 0.6.0' gem 'http-cookie' gem 'kaminari' gem 'devise' gem 'devise_token_auth' gem 'devise-security' gem 'devise-two-factor', '~> 3.1' # AWS gem 'aws-sdk' # Reduces boot times through caching; required in config/boot.rb gem 'bootsnap', '>= 1.4.2', require: false gem 'composite_primary_keys' gem 'clamav-client', require: 'clamav/client' gem 'wovnrb' group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] end group :development do # Access an interactive console on exception pages or by calling 'console' anywhere in the code. gem 'web-console', '>= 3.3.0' gem 'listen', '>= 3.0.5', '< 3.2' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' end group :test do # Adds support for Capybara system testing and selenium driver gem 'capybara', '>= 2.15' gem 'selenium-webdriver' # Easy installation and use of web drivers to run system tests with browsers gem 'webdrivers' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
試したこと
試したこと(1)
migrateする前にinnodbのrunを走らせる
config.yml
- run: name: innodb_file_format command: | echo '[mysqld]' | sudo sh -c 'cat >> /etc/mysql/my.cnf' echo 'innodb_file_format=Barracuda' | sudo sh -c 'cat >> /etc/mysql/my.cnf' echo 'innodb_file_per_table=1' | sudo sh -c 'cat >> /etc/mysql/my.cnf' echo 'innodb_large_prefix=1' | sudo sh -c 'cat >> /etc/mysql/my.cnf' sudo service mysql restart - run: name: Database setup command: bundle exec rails db:migrate
↓
circleCIで実行
↓
別なエラーが出現
mysql: unrecognized service Exited with code exit status 1
試したこと(2)
dependenciesとしてmigrateに追記
- run: name: Database setup command: bundle exec rails db:migrate dependencies: pre: - echo '[mysqld]' | sudo sh -c 'cat >> /etc/mysql/my.cnf' - echo 'innodb_file_format=Barracuda' | sudo sh -c 'cat >> /etc/mysql/my.cnf' - echo 'innodb_file_per_table=1' | sudo sh -c 'cat >> /etc/mysql/my.cnf' - echo 'innodb_large_prefix=1' | sudo sh -c 'cat >> /etc/mysql/my.cnf' - sudo service mysql restart
↓
circleCIで実行
↓
同じエラー
== 20191125043900 CreateUsers: migrating ====================================== -- create_table(:users, {:id=>:bigint, :unsigned=>true}) -> 0.0031s -- add_index(:users, :email, {:unique=>true}) rails aborted! StandardError: An error has occurred, all later migrations canceled: Mysql2::Error: Specified key was too long; max key length is 767 bytes
あなたの回答
tips
プレビュー