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 数据库?
混乱的根源在于,当使用 GitHub Actions(或更具体地说:GitHub 托管的运行器之一)时,您会获得一个已安装 MySQL 的 Linux 映像。因此,执行时sudo apt install mysql-server,不会触发实际安装。
因此,安装后通常发生的默认设置也不适用,因为它永远不会被执行。相反,GitHub 预先配置了 MySQL 服务器,以便用户root设置显式密码(这就是普通密码sudo mysql不起作用的原因)。用户的默认密码root是root。
另请注意,MySQL 服务器默认情况下处于禁用状态,因此您必须先启动它(如问题中所述)。启动并运行后,您可以使用以下命令连接到它
sudo mysql --user=root --password=root
Run Code Online (Sandbox Code Playgroud)
参考文献:
根据我使用 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)
| 归档时间: |
|
| 查看次数: |
4150 次 |
| 最近记录: |