깃 액션, MySQL ci 구축 이슈

00_8_3·2022년 3월 16일
0

SEEME 이슈

목록 보기
1/10

이슈

  • 기존 service와 controller 테스트를 실제 db와 똑같은 환경의 컨테이너 테스트 db에서 실행 하였음

  • 깃 액션 ci에서도 같은 환경의 테스트를 구축 하려함

  • mysql 5.7버전 부터 Group By 절에 포함되지 않는 Column (nonaggregated column)을 select 할 경우, 컬럼의 어느 부분에 표시해야 할 지 애매하여 발생하는 에러가 발생.

  • MySQL 실행 시 only_full_group_by 옵션을 비활성화 하면 해결됨.

문제

  • 로컬 도커에서는 docker-compose의 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

시도 1

...
- 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.

시도 2

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

0개의 댓글