GitHub Actions中steps下面的Setup environment设置的环境变量不能在后面步骤使用问题处理
文章目录
- 问题
- 解决方法
- 方法一:在 job 级别使用 `env:` 统一设置
- 方法二:用 `$GITHUB_ENV` 文件在一个步骤设置,供后续步骤使用
- 具体效果
问题
在GitHub中使用CI工具进行测试,发现 steps下面的 Setup environment
设置的环境变量不能在后面(Test basic collection
"步骤)使用。
如:这个mysql的ci的部分配置如下:
……steps:- name: Checkout codeuses: actions/checkout@v4- name: Setup environmentrun: |export MYSQL_PATH=/usr/bin/mysqlexport MYSQL_HOST=127.0.0.1export MYSQL_PORT=3306export MYSQL_USER=rootexport MYSQL_PWD=rootexport MYSQL_DATABASE=test_dbexport OUTPUT_FILE=processlist.log- name: Install MySQL clientrun: sudo apt-get install -y mysql-client- name: Test basic collectionrun: |# 授予PROCESS权限mysql -h127.0.0.1 -P3306 -uroot -proot -e "GRANT PROCESS ON *.* TO 'root'@'%';" test_dbexport MYSQL_PATH=/usr/bin/mysqlexport MYSQL_HOST=127.0.0.1export MYSQL_PORT=3306export MYSQL_USER=rootexport MYSQL_PWD=rootexport MYSQL_DATABASE=test_dbexport OUTPUT_FILE=processlist.log……echo ${MYSQL_PATH}- name: Test basic collection2run: |# 授予PROCESS权限mysql -h127.0.0.1 -P3306 -uroot -proot -e "GRANT PROCESS ON *.* TO 'root'@'%';" test_dbexport MYSQL_PATH=/usr/bin/mysqlexport MYSQL_HOST=127.0.0.1export MYSQL_PORT=3306export MYSQL_USER=rootexport MYSQL_PWD=rootexport MYSQL_DATABASE=test_dbexport 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-latestenv:MYSQL_PATH: /usr/bin/mysqlMYSQL_HOST: 127.0.0.1MYSQL_PORT: 3306MYSQL_USER: rootMYSQL_PWD: rootMYSQL_DATABASE: test_dbOUTPUT_FILE: processlist.logsteps:# 其它步骤...
这样所有步骤都能直接使用这些环境变量。
方法二:用 $GITHUB_ENV
文件在一个步骤设置,供后续步骤使用
- name: Setup environmentrun: |echo "MYSQL_PATH=/usr/bin/mysql" >> $GITHUB_ENVecho "MYSQL_HOST=127.0.0.1" >> $GITHUB_ENVecho "MYSQL_PORT=3306" >> $GITHUB_ENVecho "MYSQL_USER=root" >> $GITHUB_ENVecho "MYSQL_PWD=root" >> $GITHUB_ENVecho "MYSQL_DATABASE=test_db" >> $GITHUB_ENVecho "OUTPUT_FILE=processlist.log" >> $GITHUB_ENV
这样后续步骤就可以直接用这些变量,例如 ${MYSQL_PATH}
等。
具体效果
以这个mysql为例:
方法1可参考这个文件:https://github.com/yansheng836/mysql_collect_processlist/blob/main/.github/workflows/mysql-ci-8.0.43.yml
方法2可参考这个文件:https://github.com/yansheng836/mysql_collect_processlist/blob/main/.github/workflows/mysql-ci.yml
参考:github copilot