如何使用 gitlab CI/CD 设置与 MySql 数据库的连接

Jek*_*son 11 mysql django gitlab

我正在尝试使用 CI/CD gitlab 设置 django 项目的自动测试。问题是,我无法以任何方式连接到 Mysql 数据库。

gitlab-ci.yml

services:
  - mysql:5.7

variables:
      MYSQL_DATABASE: "db_name"
      MYSQL_ROOT_PASSWORD: "dbpass"
      MYSQL_USER: "username"
      MYSQL_PASSWORD: "dbpass"
      

stages:
  - test

test:
  stage: test
  before_script:
  - apt update -qy && apt-get install -qqy --no-install-recommends default-mysql-client
  - mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DATABASE --host=$MYSQL_HOST --execute="SHOW DATABASES; ALTER USER '$MYSQL_USER'@'%' IDENTIFIED WITH mysql_native_password BY '$MYSQL_PASSWORD'"
  script:
  - apt update -qy
  - apt install python3 python3-pip virtualenvwrapper -qy
  - virtualenv --python=python3 venv/
  - source venv/bin/activate
  - pwd
  - pip install -r requirement.txt
  - python manage.py test apps
Run Code Online (Sandbox Code Playgroud)

使用此文件配置,我收到错误

 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Run Code Online (Sandbox Code Playgroud)

我尝试过做什么

添加到 mysql脚本 tcp 连接而不是套接字

mysql --protocol=TCP --user=$MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DATABASE --host=$MYSQL_HOST --execute="SHOW DATABASES; ALTER USER '$MYSQL_USER'@'%' IDENTIFIED WITH mysql_native_password BY '$MYSQL_PASSWORD'"
Run Code Online (Sandbox Code Playgroud)

在这种情况下我得到了

ERROR 2002 (HY000): Can't connect to MySQL server on 'localhost' (99)
Run Code Online (Sandbox Code Playgroud)

我该如何正确设置?

小智 10

您的问题可能有多种原因:

  • MySQL 版本不正确。
    • 解决方案:使用mysql:5.7代替mysql:latest
  • MySQL 主机丢失。
    • 解决方案:添加MYSQL_HOSTMySQLvariables服务器的主机名。(应该是mysql使用mysql:5.7in serviceskey 时)
  • Django 使用不同的数据库凭据。
    • variables解决方案:检查您的 部分中的凭据.gitlab-ci.yml并与 Django 的settings.py. 它们应该是相同的。
  • MySQL 客户端未安装。
    • 解决办法:在脚本部分安装mysql-client并检查是否能够连接。

以下是安装 MySQL 客户端并连接到基于 debian 的映像(或映像)script中的数据库的示例:python:latest

script:
  - apt-get update && apt-get install -y git curl libmcrypt-dev default-mysql-
  - mysql --version
  - sleep 20
  - echo "SHOW tables;"| mysql -u root -p"$MYSQL_ROOT_PASSWORD" -h "${MYSQL_HOST}" "${MYSQL_DATABASE}"
Run Code Online (Sandbox Code Playgroud)

以下是使用 MySQL 5.7 作为服务和已安装成功连接到 MySQL 数据库的python映像的完整且有效的示例:mysql-client

stages:
  - test

variables:
  MYSQL_DATABASE: "db_name"
  MYSQL_ROOT_PASSWORD: "dbpass"
  MYSQL_USER: "username"
  MYSQL_PASSWORD: "dbpass"
  MYSQL_HOST: mysql

test:
  image: python:latest
  stage: test
  services:
    - mysql:5.7
  script:
    - apt-get update && apt-get install -y git curl libmcrypt-dev default-mysql-client
    - mysql --version
    - sleep 20
    - echo "SHOW tables;" | mysql -u root -p"$MYSQL_ROOT_PASSWORD" -h "${MYSQL_HOST}" "${MYSQL_DATABASE}"
    - echo "Database host is '${MYSQL_HOST}'"
Run Code Online (Sandbox Code Playgroud)


mak*_*aki 5

您需要使用服务名称作为数据库主机名。在这种情况下MYSQL_HOST应该是mysql

您可以在Gitlab 页面上查看示例并了解服务如何链接到作业