기존 service와 controller 테스트를 실제 db와 똑같은 환경의 컨테이너 테스트 db에서 실행 하였음
깃 액션 ci에서도 같은 환경의 테스트를 구축 하려함
mysql 5.7버전 부터 Group By 절에 포함되지 않는 Column (nonaggregated column)을 select 할 경우, 컬럼의 어느 부분에 표시해야 할 지 애매하여 발생하는 에러가 발생.
MySQL 실행 시 only_full_group_by 옵션을 비활성화 하면 해결됨.
command
옵션으로 cnf 설정이 가능services:
db:
...
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password
- --sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
...
- name: Set up MySQL
run: |
mysql --version
sudo echo -e "[mysqld]\nsql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\nskip-grant-tables\n" | sudo tee /etc/mysql/my.cnf
sudo systemctl start mysql.service
mysql -e 'select @@sql_mode;' -uroot -proot
mysql -e 'CREATE DATABASE test;' -uroot -proot
mysql -e 'SHOW DATABASES;' -uroot -proot
...
깃 액션에서도 컨테이너 환경에서 실행되는 것은 같기 때문에
cnf
파일 수정 후 service를 실행 시켜주었지만 아래 오류 발생
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
https://github.com/actions/virtual-environments/issues/576
를 참고하여 재 시도
- name: Set up MySQL
run: |
mysql --version
sudo echo -e "[mysqld]\nsql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\nskip-grant-tables\n" | sudo tee /etc/mysql/my.cnf
sudo chown -R mysql:mysql /var/lib/mysql
sudo /lib/systemd/systemd-sysv-install enable mysql
sudo systemctl enable mysql.service
sudo systemctl start mysql.service
sudo systemctl status mysql.service
mysql -e 'select @@sql_mode;' -uroot -proot
mysql -e 'CREATE DATABASE test;' -uroot -proot
mysql -e 'SHOW DATABASES;' -uroot -proot
하지만 시도 1
과 같은 에러 발생
해결을 하기 전 sql_mode에 NO_AUTO_CREATE_USER
도 같이 추가 하였더니
'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'
에러가 발생
mysql 8.0.11 버전 이후로는 deprecated
되어 cnf 파일 sql_mode
에 명시되어 있는 경우 수동으로 수정 해주어야 에러가 발생하지 않는다.
https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html
- name: Set up MySQL
run: |
mysql --version
sudo systemctl start mysql.service
mysql -e 'SET GLOBAL sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";' -uroot -proot
mysql -e 'select @@sql_mode;' -uroot -proot
mysql -e 'CREATE DATABASE test;' -uroot -proot
mysql -e 'SHOW DATABASES;' -uroot -proot
하루의 시간을 쏟고 보니 정작 수정한 코드는 몇 줄 안된다 ㅋㅋ..
따로 인스턴스를 구축하지 않아도 되고 yaml 코드로만 구축 가능하기 때문에
젠킨스 대신 사용하는데 아직 자료가 많지 않아 흠인 것 같다.
깃 이슈: https://github.com/volunteer-project-1/volunteer-server/issues/16
https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html
https://github.com/actions/virtual-environments/issues/576
https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html