GitHub Actions中steps下面的Setup environment设置的环境变量不能在后面步骤使用问题处理

发布于:2025-09-12 ⋅ 阅读:(20) ⋅ 点赞:(0)


问题

在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为例:

方法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


网站公告

今日签到

点亮在社区的每一天
去签到