惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
G
Google Developers Blog
博客园 - 三生石上(FineUI控件)
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
V
V2EX
Vercel News
Vercel News
U
Unit 42
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
J
Java Code Geeks
WordPress大学
WordPress大学
罗磊的独立博客
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
M
MIT News - Artificial intelligence
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
云风的 BLOG
云风的 BLOG

二丫讲梵

学习周刊-总第258期-2026年第15周 学习周刊-总第257期-2026年第14周 学习周刊-总第256期-2026年第13周 学习周刊-总第255期-2026年第12周 学习周刊-总第254期-2026年第11周 学习周刊-总第253期-2026年第10周 临时插播一条羊毛,免费领取450元大模型API代金券 学习周刊-总第252期-2026年第09周 学习周刊-总第251期-2026年第08周 学习周刊-总第250期-2026年第07周 学习周刊-总第249期-2026年第06周 诚邀评论,聊聊你所知欲知的我 学习周刊-总第248期-2026年第05周 我的QQ动态之2015年 我的QQ动态之2014年 我的QQ动态之2013年 我的QQ动态之2012年 我的QQ动态-2010-2011年 我的QQ动态-创栏小叙 学习周刊-总第247期-2026年第04周 Nexus社区版权益阉割--一文告诉你有哪些版本可以选择 学习周刊-总第246期-2026年第03周 学习周刊-总第245期-2026年第02周 学习周刊-总第244期-2026年第01周 学习周刊-总第243期-2025年第52周 学习周刊-总第242期-2025年第51周 开源项目ZenOps:带你领略禅意运维 学习周刊-总第241期-2025年第50周 用京东金融,享负债人生 学习周刊-总第240期-2025年第49周
利用github-slug-action暴漏Github Action上下文中的关键变量
二丫讲梵 · 2023-02-28 · via 二丫讲梵

前注:本文同时收录在 github-slug-action 官方 README 的推荐当中:Thanks for talking about us (opens new window)

# 前言

使用 GitHub Action 时,有一种场景需求为,通过 release 触发构建,然后构建的过程中,还要用到这次创建的 release 号。

此时我在 learn-github 仓库中进行演练。添加了如下一个 action 内容:

name: test action env

on:
  release:
    types: [created] # 表示在创建新的 Release 时触发

jobs:
  test_action_env:
    name: Test Action Env
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - run: |
          env

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

此时手动创建一个 release,我这边版本号为:v0.5.6,然后在日志输出中搜索这个关键字:

GITHUB_WORKFLOW_REF=eryajf/learn-github/.github/workflows/test-env.yml@refs/tags/v0.5.6
GITHUB_REF=refs/tags/v0.5.6
GITHUB_REF_NAME=v0.5.6

1
2
3

网上大多数的方案是对 GITHUB_REF 这个变量下手,比如:

- name: Get Release version
  env:
    ACTIONS_ALLOW_UNSECURE_COMMANDS: true
  run: |
    echo "::set-env name=RELEASE_VERSION::$(echo $GITHUB_REF | cut -d'/' -f 3)"

1
2
3
4
5

📢注意: 需要注意的是,如果使用 set-env 来添加变量,则需要声明 ACTIONS_ALLOW_UNSECURE_COMMANDS: true,否则运行过程中会报错如下:

The `set-env` command is disabled. Please upgrade to using Environment Files or opt into unsecure command execution by setting the `ACTIONS_ALLOW_UNSECURE_COMMANDS` environment variable to `true`. For more information see: https://github.blog/changelog/2020-10-01-github-actions-deprecating-set-env-and-add-path-commands/

1

这自然没什么毛病,但着实用起来不够方便,不够优雅。

也许你看到了,上边日志输出中还有一个 GITHUB_REF_NAME,正好就是我和你想要的值,但是我想告诉你的是,的确官方新给出了这个变量,但可气的是,这个变量并没有在全局暴漏,因此虽然能在这个 env 输出当中看到这个变量,但实际却并不能用。

关于此问题,可见这两个讨论:

# 验证

为了验证如上表述的内容,我创建一个测试脚本如下:

name: test action env

on:
  release:
    types: [created] # 表示在创建新的 Release 时触发

jobs:
  test_action_env:
    name: Test Action Env
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - run: |
          env

      - name: Get Release version
        id: vars
        env:
          ACTIONS_ALLOW_UNSECURE_COMMANDS: true
        run: |
          echo "::set-env name=RELEASE_VERSION_ONE::$(echo $GITHUB_REF | cut -d'/' -f 3)"

      - name: Get Release version
        run: echo "RELEASE_VERSION_TWO=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV

      - name: Show Release Num
        run: |
          echo "通过GitHub-Action获取版本号: ${{ env.GITHUB_REF_NAME }}"
          echo "通过自定义脚本获取版本号第一种: ${{ env.RELEASE_VERSION_ONE }}"
          echo "通过自定义脚本获取版本号第二种: ${{ env.RELEASE_VERSION_TWO }}"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

运行后得到结果如下:

可见虽然在全局环境变量中能看到 GITHUB_REF_NAME=v0.5.13,但实际上在后续的上下文中,你并不能通过 ${{ env.GITHUB_REF_NAME }} 来引用这个变量。

# 解决

虽然上边的脚本提供了两种解决方案,但是都不算够优雅,网上也有针对这一问题处理的解决方案,其中以专门针对 GitHub Action 中变量问题解决的项目 github-slug-action 为甚,这也是本文的主角。

这个 Action 提供了一系列 GitHub Action 运行过程中的变量暴漏等功能。

此时我们把 action 的配置文件改成下边这样:

name: test action env

on:
  release:
    types: [created] # 表示在创建新的 Release 时触发

jobs:
  test_action_env:
    name: Test Action Env
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Inject slug/short variables
        uses: rlespinasse/github-slug-action@v4

      - run: |
          env

      - name: Show Release Num
        run: |
          echo "通过GitHub-Action获取版本号: ${{ env.GITHUB_REF_NAME }}"
          echo "通过github-slug-action获取版本号: ${{ env.GITHUB_REF_NAME_SLUG }}"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

当我们把 github-slug-action 应用在流水线中之后,它首先会把原来官方遗漏的变量 ${{ env.GITHUB_REF_NAME }} 给填充好,其次也可以通过使用 ${{ env.GITHUB_REF_NAME_SLUG }} 来获取到对应的版本号。

除去这个变量之外,github-slug-action 还提供了其他一些变量,并且做到了配置简单(如你所见,在流水线中引用即可),优雅易用,因此是一个性价比非常高的,值得在流水线中应用的 action。