【问题标题】:How to setup connection to MySql database with gitlab CI/CD如何使用 gitlab CI/CD 设置与 MySql 数据库的连接
【发布时间】:2020-06-21 08:36:40
【问题描述】:

我正在尝试使用 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

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

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

我做了什么

添加到mysql 脚本 tcp connection unstead socket

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'"

在这种情况下,我得到了

ERROR 2002 (HY000): Can't connect to MySQL server on 'localhost' (99)

如何正确设置?

【问题讨论】:

    标签: mysql django gitlab


    【解决方案1】:

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

    • MySQL 版本不正确。
      • 解决方案:使用mysql:5.7 而不是mysql:latest
    • 缺少 MySQL 主机。
      • 解决方案:在variables 中添加MYSQL_HOST 和MySQL 服务器的主机名。 (在 services 键中使用 mysql:5.7 时应为 mysql
    • Django 使用不同的数据库凭据。
      • 解决方案:检查.gitlab-ci.ymlvariables 部分中的凭据,并与Django 的settings.py 进行比较。它们应该是相同的。
    • 未安装 MySQL 客户端。
      • 解决方法:在脚本部分安装mysql-client,查看是否可以连接。

    这是一个示例script,它安装 MySQL 客户端并连接到基于 debian 的映像(或 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}"
    

    这是一个完整且有效的示例,它使用 MySQL 5.7 作为服务和一个安装了 mysql-clientpython 图像成功连接到 MySQL 数据库:

    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}'"
    

    【讨论】:

    【解决方案2】:

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

    您可以在 Gitlab page 上查看示例并阅读有关 how services are linked to the job 的信息

    【讨论】:

    • 感谢您的评论。添加MYSQL_HOST: "mysql" 后,我得到了django.db.utils.OperationalError: (1045, "Access denied for user 'userlocal'@'172.17.0.3' (using password: YES)")
    • yml中指定的变量是否应该与项目.env文件中指定的实际数据相匹配?
    • 是的,django 应该使用为 mysql 服务定义的凭据连接到测试数据库。
    【解决方案3】:

    我看到有一个公认的答案,但在 mysql 8.0 和 python3:buster 中有些东西坏了。 Python Debian 镜像附带 mariadb,设置标准 mysql-client 包并不容易,导致:“django.db.utils.OperationalError: 2059, “Authentication plugin”

    我在下面得到了一个可用的 YAML,使用 Ubuntu 作为基础映像,使用 mysql 8.0 作为服务。您可以在 .gitlab-ci 和 test_settings 中使用 root 用户,或者授予 MYSQL 用户创建新数据库和更改现有数据库的权限。

    初始的MYSQL_DB _USER和_PASS变量可以在Gitlab的Settings -> CI/CD -> Variables下设置。

    .gitlab-ci.yml:

    variables:
      # "When using a service (e.g. mysql) in the GitLab CI that needs environtment variables
      # to run, only variables defined in .gitlab-ci.yml are passed to the service and
      # variables defined in GitLab GUI are unavailable."
      # https://gitlab.com/gitlab-org/gitlab/-/issues/30178
      # DJANGO_CONFIG: "test"
      MYSQL_DATABASE: $MYSQL_DB
      MYSQL_ROOT_PASSWORD: $MYSQL_PASS
      MYSQL_USER: $MYSQL_USER
      MYSQL_PASSWORD: $MYSQL_PASS
      # -- In your django settings file for the test environment you could put:
      # DATABASES = {
      #     'default': {
      #         'ENGINE': 'django.db.backends.mysql',
      #         'NAME': os.environ.get('MYSQL_DATABASE'),
      #         'USER':  os.environ.get('MYSQL_USER'),
      #         'PASSWORD': os.environ.get('MYSQL_PASSWORD'),
      #         'HOST': 'mysql',
      #         'PORT': '3306',
      #         'CONN_MAX_AGE':60,
      #         },
      # }
    
      # -- You could us '--settings' to specify a custom settings file on the command line
      # -- below or use an environment variable to trigger an include in your settings:
      #   if os.environ.get('DJANGO_CONFIG')=='test':
      #       from .settings_test import *  # or specific overrides
      #
    
    
    default:
      image: ubuntu:20.04
    
      # -- Pick zero or more services to be used on all builds.
      # -- Only needed when using a docker container to run your tests in.
      # -- Check out: http://docs.gitlab.com/ee/ci/docker/using_docker_images.html#what-is-a-service
      services:
        - mysql:8.0
    
      # This folder is cached between builds
      # http://docs.gitlab.com/ee/ci/yaml/README.html#cache
      # cache:
      #   paths:
      #     - ~/.cache/pip/
    
      before_script:
        - echo -e "Using Database $MYSQL_DB with $MYSQL_USER"
        - apt --assume-yes update
        - apt --assume-yes install apt-utils
        - apt --assume-yes install net-tools python3.8 python3-pip mysql-client libmysqlclient-dev
        # - apt --assume-yes upgrade
        - pip3 install -r requirements.txt
    
    djangotests:
      script:
        # -- The MYSQL user gets only permissions for MYSQL_DB and therefor cant create a test_db.
        - echo "GRANT ALL on *.* to '${MYSQL_USER}';"| mysql -u root --password="${MYSQL_ROOT_PASSWORD}" -h mysql
        # -- use python3 explicitly. see https://wiki.ubuntu.com/Python/3
        - python3 manage.py test
    
    
    migrations:
      script:
        - python3 manage.py makemigrations
        - python3 manage.py makemigrations myapp
        - python3 manage.py migrate
        - python3 manage.py check
    

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 2019-02-02
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      相关资源
      最近更新 更多