Github Actions步骤是否独立?跨步骤调用brew失败问题
跨步骤调用brew失败的原因及解决办法
你遇到的问题核心在于:GitHub Actions的每个步骤都会启动一个全新的、非登录非交互式的bash会话,这类shell默认不会加载~/.profile、~/.bashrc这类配置文件。
具体原因拆解
- 第一步里执行的
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)",只是把brew的环境变量(比如PATH)临时加到了当前步骤的shell会话里,一旦步骤执行完毕,会话结束,变量就会失效。 - 你把brew的shellenv配置写入
/root/.profile,但后续步骤的bash是--noprofile --norc模式启动的(从错误日志里的docker exec cmd=[bash --noprofile --norc ...]能看出来),根本不会读取这个文件,所以环境变量没被加载,自然找不到brew命令。
解决办法
有两种常用方案:
方案1:每个需要brew的步骤先执行环境变量加载
在第二个步骤里先执行eval命令,再调用brew:
- name: Install prerequisites run: | eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" brew install kubernetes-cli k3d istioctl cmctl
方案2:把brew环境变量写入$GITHUB_ENV(推荐)
GitHub Actions提供了$GITHUB_ENV文件,写入这里的环境变量会被所有后续步骤继承,不用每个步骤都手动加载:
- name: Install homebrew run: | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" echo "PATH=/home/linuxbrew/.linuxbrew/bin:$PATH" >> $GITHUB_ENV sudo apt-get update -y sudo apt-get install build-essential -y brew install gcc - name: Install prerequisites run: | brew install kubernetes-cli k3d istioctl cmctl
或者直接把brew的shellenv输出追加到$GITHUB_ENV:
- name: Install homebrew run: | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" /home/linuxbrew/.linuxbrew/bin/brew shellenv >> $GITHUB_ENV sudo apt-get update -y sudo apt-get install build-essential -y brew install gcc
关于act本地测试的说明
你用act测试时,容器里的bash同样是以--noprofile --norc模式启动的,所以和GitHub Actions线上环境表现一致,上述两种方案也同样适用。
内容的提问来源于stack exchange,提问作者Jeremy Harisch
相关产品推荐
相关产品推荐

