Иногда возникает проблема при выполнении merge requests в gitlab.
В моем случае, у меня был старый gitlab, который пришлось обновить с версии 6.3 до версии 10.х (а в конечном итоге и до самой актуальной).
Ошибка имеет следующий вид:
1 2 3 4 5 6 7 |
Processing by Projects::MergeRequests::CreationsController#create as HTML Parameters: {"utf8"=>"<E2><9C><93>", "authenticity_token"=>"[FILTERED]", "merge_request"=>{"title"=>"Sonarqube Helm", "description"=>"", "assignee_ids"=>["0"], "label_ids"=>[""], "force_remove_source_branch"=>"0", "squash"=>"0", "lock_version"=>"0", "source_project_id"=>"332", "source_branch"=>"sonarqube", "target_project_id"=>"332", "target_branch"=>"master"}, "namespace_id"=>"roman", "project_id"=>"infrastructure"} Completed 500 Internal Server Error in 2050ms (ActiveRecord: 132.4ms) Started POST "/api/v4/jobs/request" for 192.168.1.2 at 2019-09-19 09:37:00 +0000 ActiveRecord::StatementInvalid (Mysql2::Error: Incorrect string value: '\xF0\x9F\x94\x90mT...' for column 'diff' at row 197: INSERT INTO merge_request_diff_files (`diff`, `new_path`, `old_path`, `a_mode`, `b_mode`, `new_file`, `renamed_file`, `deleted_file`, `too_large`, `binary`, `merge_request_diff_id`, `relative_order`) VALUES ('@@ -0,0 +1,23 @@\n+# Patterns to ignore when building packages.\n+# This supports shell glob matching, relative path matching, and\n+# negation (prefixed with !). Only one pattern per line.\n+.DS_Store\n+# Common VCS dirs\n+.git/\n+.gitignore\n+.bzr/\n+.bzrignore\n+.hg/\n+.hgignore\n+.svn/\n+# Common backup files\n+*.swp\n+*.bak\n+*.tmp\n+*~\n+# Various IDEs\n+.project\n+.idea/\n+*.tmproj\n+# OWNERS file for Kubernetes\n+OWNERS\n', 'helm/sonarqube/.helmignore', 'helm/sonarqube/.helmignore', '0', '100644', 1, 0, 0, 0, 0, 5050, 0), ('@@ -0,0 +1,19 @@\n+apiVersion: v1\n+name: sonarqube\n+description: Sonarqube is an open sourced code quality scanning tool\n+version: 2.3.0\n+appVersion: 7.9\n+keywords:\n+ - coverage\n+ - security\n+ - code\n+ - quality\n+home: https://www.sonarqube.org/\n+icon: https://www.Started POST "/api/v4/jobs/request" for 192.168.1.2 at 2019-09-19 09:36:54 +0000 |
Причина кроется в размере выделяемой памяти для той или иной кодировки https://dev.mysql.com/doc/refman/5.5/en/charset-charsets.html
Проверять необходимо всю базу, но начать можно с табличек в базе gitlabhq_production с префиксами «merge_»:
1 2 3 4 5 6 |
merge_request_diff_commits merge_request_diff_files merge_request_diffs merge_request_metrics merge_requests merge_requests_closing_issues |
Кодировка данных таблиц была latin-swedish-ci, после конвертации в utf8mb4_general_ci проблемы с merge requests были исправлены.
Выведем список всех таблиц и сделаем выборку тех, которые не в кодировке utf8mb4_general_ci:
1 |
show table status; |
В качестве заметки привожу SQL запросы. Необходимо пройти по всем таблицам в базе и установить нужную кодировку.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
DESCRIBE merge_request_diff_commits; ALTER DATABASE `gitlabhq_production` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE gitlabhq_production; ALTER TABLE `gitlabhq_production`.`merge_request_diff_commits` CHANGE COLUMN `committed_date` `committed_date` TIMESTAMP NULL DEFAULT NULL ; ALTER TABLE `gitlabhq_production`.`merge_request_diff_commits` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE `gitlabhq_production`.`merge_request_diff_files` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE `gitlabhq_production`.`merge_request_diffs` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE `gitlabhq_production`.`merge_request_metrics` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE `gitlabhq_production`.`merge_requests` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE `gitlabhq_production`.`merge_requests_closing_issues` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; |
Иногда возникает ошибка вида:
1 |
Invalid default value for 'updated_at' |
или
1 |
Invalid default value for 'created_at' |
В данном случаи выполняем для проблемной таблицы запрос:
1 2 |
set sql_mode =''; ALTER TABLE approval_project_rules CHANGE COLUMN `created_at` `created_at` TIMESTAMP NULL DEFAULT NULL ; set sql_mode =''; ALTER TABLE approval_project_rules CHANGE COLUMN `updated_at` `updated_at` TIMESTAMP NULL DEFAULT NULL ; |
Также устанавливаем кодировку для всей базы gitlab:
1 |
ALTER DATABASE gitlabhq_production CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; |
Проверяем, что все ок
1 2 3 4 5 6 7 8 9 |
SELECT SCHEMA_NAME 'gitlabhq_production', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA; +---------------------+---------+--------------------+ | gitlabhq_production | charset | collation | +---------------------+---------+--------------------+ | ... | ... | ... | | gitlabhq_production | utf8mb4 | utf8mb4_general_ci | | ... | ... | ... | +---------------------+---------+--------------------+ |
Проверяем чтобы в настройках gitlab в конфиге также были указанные нужные нам кодировки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
cat config/database.yml # # PRODUCTION # production: adapter: mysql2 encoding: utf8mb4 collation: utf8mb4_general_ci reconnect: false database: gitlabhq_production host: mysql port: 3306 username: username password: "Password" pool: 10 |