问题
在GitHub中使用CI工具进行测试,发现 steps下面的 Setup environment
设置的环境变量不能在后面(Test basic collection
"步骤)使用。
如:这个mysql的ci的部分配置如下:
……
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup environment
run: |
export MYSQL_PATH=/usr/bin/mysql
export MYSQL_HOST=127.0.0.1
export MYSQL_PORT=3306
export MYSQL_USER=root
export MYSQL_PWD=root
export MYSQL_DATABASE=test_db
export OUTPUT_FILE=processlist.log
- name: Install MySQL client
run: sudo apt-get install -y mysql-client
- name: Test basic collection
run: |
# 授予PROCESS权限
mysql -h127.0.0.1 -P3306 -uroot -proot -e "GRANT PROCESS ON *.* TO 'root'@'%';" test_db
export MYSQL_PATH=/usr/bin/mysql
export MYSQL_HOST=127.0.0.1
export MYSQL_PORT=3306
export MYSQL_USER=root
export MYSQL_PWD=root
export MYSQL_DATABASE=test_db
export OUTPUT_FILE=processlist.log
……
echo ${MYSQL_PATH}
- name: Test basic collection2
run: |
# 授予PROCESS权限
mysql -h127.0.0.1 -P3306 -uroot -proot -e "GRANT PROCESS ON *.* TO 'root'@'%';" test_db
export MYSQL_PATH=/usr/bin/mysql
export MYSQL_HOST=127.0.0.1
export MYSQL_PORT=3306
export MYSQL_USER=root
export MYSQL_PWD=root
export MYSQL_DATABASE=test_db
export OUTPUT_FILE=processlist.log
……
echo ${MYSQL_PATH}
……
可以发现export这一块其实是重复的,但是如果只在Setup environment
步骤设置,发现后面的步骤取不到值;如果只在具体步骤设置,就需要设置多个相关的配置,比较冗余。目标是设置一个就行。
解决方法
后面直接在copilot得到了答案:
在 GitHub Actions 的 workflow 中,每个 run
步骤默认会在一个新的 shell 环境中执行。
因此,“Setup environment”步骤里用 export
命令设置的环境变量,只在该步骤内有效,后续的步骤(比如 “Test basic collection”)是无法直接继承这些变量的。
如何让环境变量在所有步骤都有效?
这里介绍两个推荐方法:
方法一:在 job 级别使用 env:
统一设置
jobs:
test-mysql-versions:
runs-on: ubuntu-latest
env:
MYSQL_PATH: /usr/bin/mysql
MYSQL_HOST: 127.0.0.1
MYSQL_PORT: 3306
MYSQL_USER: root
MYSQL_PWD: root
MYSQL_DATABASE: test_db
OUTPUT_FILE: processlist.log
steps:
# 其它步骤...
这样所有步骤都能直接使用这些环境变量。
方法二:用 $GITHUB_ENV
文件在一个步骤设置,供后续步骤使用
- name: Setup environment
run: |
echo "MYSQL_PATH=/usr/bin/mysql" >> $GITHUB_ENV
echo "MYSQL_HOST=127.0.0.1" >> $GITHUB_ENV
echo "MYSQL_PORT=3306" >> $GITHUB_ENV
echo "MYSQL_USER=root" >> $GITHUB_ENV
echo "MYSQL_PWD=root" >> $GITHUB_ENV
echo "MYSQL_DATABASE=test_db" >> $GITHUB_ENV
echo "OUTPUT_FILE=processlist.log" >> $GITHUB_ENV
这样后续步骤就可以直接用这些变量,例如 ${MYSQL_PATH}
等。
具体效果
以这个mysql为例:
方法2可参考这个文件:https://github.com/yansheng836/mysql_collect_processlist/blob/main/.github/workflows/mysql-ci.yml
参考:github copilot