利用github-slug-action暴漏Github Action上下文中的关键变量
source link: https://wiki.eryajf.net/pages/77e2fe/#%E9%AA%8C%E8%AF%81
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
利用github-slug-action暴漏Github Action上下文中的关键变量
# 前言
使用 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
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
网上大多数的方案是对 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)"
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/
这自然没什么毛病,但着实用起来不够方便,不够优雅。
也许你看到了,上边日志输出中还有一个 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 }}"
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 }}"
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。
- 更多可用变量,可参考官方文档的说明 (opens new window)。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK