如何使用GitHub Actions连接MySQL数据库?

Rav*_*ven 4 mysql github-actions

在我的 GitHub Action 中,我使用 Linux 运行程序(Ubuntu 18.04 和 20.04),并且我想使用 MySQL 数据库。因此,为了进行设置,我运行一个类似的脚本

sudo apt update
sudo apt install mysql-server

sudo mysql < someInstructions.txt
Run Code Online (Sandbox Code Playgroud)

但是,当我在 GitHub Actions 上运行此脚本时,出现以下错误:

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

所以我认为MySQL服务器在安装后没有运行(我已验证)。这很奇怪,因为 Ubuntu 软件包的文档明确指出服务器应该在成功安装后运行。

无论如何,我随后sudo systemctl start mysql.service启动了 MySQL 服务器,但现在收到此错误

'Access denied for user 'root'@'localhost' (using password: NO)'
Run Code Online (Sandbox Code Playgroud)

这真的让我感到困惑,因为sudo mysql应该以 root 身份连接到数据库。我验证了这可以在常规 Ubuntu 安装上运行。

有谁知道如何连接到 GitHub Actions 上的 MySQL 数据库?

Rav*_*ven 5

混乱的根源在于,当使用 GitHub Actions(或更具体地说:GitHub 托管的运行器之一)时,您会获得一个已安装 MySQL 的 Linux 映像。因此,执行时sudo apt install mysql-server,不会触发实际安装。

因此,安装后通常发生的默认设置也不适用,因为它永远不会被执行。相反,GitHub 预先配置了 MySQL 服务器,以便用户root设置显式密码(这就是普通密码sudo mysql不起作用的原因)。用户的默认密码rootroot

另请注意,MySQL 服务器默认情况下处于禁用状态,因此您必须先启动它(如问题中所述)。启动并运行后,您可以使用以下命令连接到它

sudo mysql --user=root --password=root
Run Code Online (Sandbox Code Playgroud)

参考文献:


cri*_*ter 5

根据我使用 Github Actions 和 MySQL 数据库的经验,该Can't connect to local MySQL server through socket错误是由于您正在使用localhost,而 linux 主机显然无法解析。如果你使用的127.0.0.1话它应该可以工作。

还要确保如果您要创建数据库,您的用户有权这样做 - 由于我们正在测试,我更喜欢使用具有所有权限的根用户,以避免任何此类问题。

一般来说,我在 Github Actions 中使用 mysql 测试服务器的理想方法是在主机上启动一个容器,如下所示(此示例基于 Python/Django,但可重复用于您正在使用的任何技术堆栈) ):

jobs:
  tests:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:8.0
        env:
          # The MySQL docker container requires these environment variables to be set
          # so we can create and migrate the test database.
          # See: https://hub.docker.com/_/mysql
          MYSQL_DATABASE: testdb
          MYSQL_ROOT_PASSWORD: testrootpass
        ports:
          # Opens port 3306 on service container and host
          # https://docs.github.com/en/actions/using-containerized-services/about-service-containers
          - 3306:3306
          # Before continuing, verify the mysql container is reachable from the ubuntu host
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
    steps:
      - uses: actions/checkout@v3
      - name: Install Ubuntu dependencies
        run: |
          sudo apt-get update
          sudo apt-get install libcurl4-openssl-dev libmysqlclient-dev libgirepository1.0-dev
      - name: Setup Python
        uses: actions/setup-python@v3
        with:
          python-version: 3.8
      - name: Install Python dependencies
        run: |
          pip install -r requirements.txt
      - name: Run tests
        # These environment variables will take precedence over the ones in the Django settings file
        env:
          # Set the DJANGO_SECRET_KEY in the Github repo settings: Go to Secrets and variables > Actions > New repository secret 
          DJANGO_SECRET_KEY: ${{ secrets.DJANGO_SECRET_KEY }}
          DATABASE_NAME: testdb
          DATABASE_USERNAME: root          
          DATABASE_PASSWORD: testrootpass          
          DATABASE_ENDPOINT: 127.0.0.1 # Will not work with 'localhost', since that will try a Unix socket connection (!)
        run: |
            python manage.py migrate
            python manage.py test
Run Code Online (Sandbox Code Playgroud)