GitHub Action:如何在Job与Step的If条件中引用环境变量
GitHub Actions Job级别If条件使用环境变量的问题
我尝试在Job和Step级别的If条件中使用环境变量,但Job级的写法始终报错或不符合预期,Step级则正常。
我的初始代码:
name: CI/CD on: push: branches: [ other, stable ] env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} STABLE_BRANCH_NAME: stable jobs: job1: name: test runs-on: [ self-hosted, linux, enterprise, .... ] container: image: some-image steps: - name: echo run: echo $BRANCH_NAME
在stable分支推送时,能正常打印stable。
尝试给Job添加If条件:
jobs: job1: name: test runs-on: [ self-hosted, linux, enterprise, .... ] container: image: some-image if: env.BRANCH_NAME == env.STABLE_BRANCH_NAME steps: - name: echo run: echo $BRANCH_NAME
执行失败,提示语法错误。改成if: ${{ env.BRANCH_NAME == env.STABLE_BRANCH_NAME }}后,依然无法正常工作。
我需要同时实现Job和Step级的If条件:
name: CI/CD on: push: branches: [ other, stable ] env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} STABLE_BRANCH_NAME: stable jobs: job1: name: test runs-on: [ self-hosted, linux, enterprise, .... ] if: #### 这里需要判断分支是否为stable - 写法无效 container: image: some-image steps: - name: echo run: echo $BRANCH_NAME if: ${{ env.STABLE_BRANCH_NAME != env.BRANCH_NAME }} # 这个写法正常工作
Step级的if: ${{ env.STABLE_BRANCH_NAME != env.BRANCH_NAME }}可以正常运行,但同样的写法在Job级别无效。有没有简便的解决方法?
解决方法
核心原因
GitHub Actions中,Job级别的全局env变量在Job的if条件判断阶段还未完成初始化,因此直接引用会失效;而Step级的env变量在Step执行前已初始化,所以可以正常使用。
简便实现方式
无需依赖自定义环境变量,直接在Job的if条件中使用GitHub上下文变量判断分支:
name: CI/CD on: push: branches: [ other, stable ] env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} STABLE_BRANCH_NAME: stable jobs: job1: name: test runs-on: [ self-hosted, linux, enterprise, .... ] if: ${{ github.ref_name == 'stable' }} # 直接用上下文变量判断分支 container: image: some-image steps: - name: echo run: echo $BRANCH_NAME if: ${{ env.STABLE_BRANCH_NAME != env.BRANCH_NAME }}
需复用环境变量的场景
如果需要在多个地方复用分支判断的变量,可以将环境变量定义在Job内部的env中,而非全局env,这样Job级的if就能正常引用:
name: CI/CD on: push: branches: [ other, stable ] jobs: job1: name: test runs-on: [ self-hosted, linux, enterprise, .... ] env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} STABLE_BRANCH_NAME: stable if: ${{ env.BRANCH_NAME == env.STABLE_BRANCH_NAME }} container: image: some-image steps: - name: echo run: echo $BRANCH_NAME if: ${{ env.STABLE_BRANCH_NAME != env.BRANCH_NAME }}
不过这种写法不如直接使用上下文变量简洁,推荐优先采用第一种方案。
内容的提问来源于stack exchange,提问作者Amin Ba
相关产品推荐
相关产品推荐

