二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancker
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
推广
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • 网站状态 (opens new window)
    • json2go (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancker
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
推广
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • 网站状态 (opens new window)
    • json2go (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • 最佳实践

  • 迎刃而解

  • Nginx

  • Php

  • Zabbix

  • Prometheus

  • Grafana

  • CentOS

  • Supervisord

  • Systemd

  • Docker

  • Docker-Compose

  • Rancher

  • Ansible

  • OpenLdap

  • GitLab

  • GitHub

    • GitHub中开源项目维护流程手册
    • 分享我的开源项目Thank-Mirror
    • 一个仅需三步配置就能生成免费个人博客的开源模板vdoing-template
    • 如何将个人的GitHub主页配置的优雅好看
    • 利用GitHub Actions自动为README添加TOC目录
    • 利用GitHub Actions自动将项目贡献者列表添加到README中
    • 利用GitHub Actions自动优雅地为项目构建Releases
    • 利用GitHub Actions自动获取博客rss文章
    • 利用GitHub Actions自动构建项目的docker镜像并发布到DockerHub
    • 利用GitHub Actions自动生成GitHub的Fans
    • 利用GitHub Actions自动生成个人star列表并归类
    • 利用GitHub Actions自动对仓库内图片进行无损压缩
    • 利用GitHub Actions自动检测项目中的问题链接
    • 利用GitHub Actions自动构建go项目的二进制到release
    • 利用github-slug-action暴漏Github Action上下文中的关键变量
      • 前言
      • 验证
      • 解决
  • Etcd

  • Consul

  • RabbitMQ

  • Kafka

  • Mysql

  • MongoDB

  • OpenVPN

  • Kvm

  • VMware

  • 配置文件详解

  • Other

  • 运维观止
  • GitHub
二丫讲梵
2023-02-28
目录

利用github-slug-action暴漏Github Action上下文中的关键变量

这篇文章的发布时间较早,其中的内容可能已经过时,阅读时请注意甄别。

前注:本文同时收录在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 输出当中看到这个变量,但实际却并不能用。

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

  • https://github.com/github/docs/issues/15319 (opens new window)
  • https://github.com/rlespinasse/github-slug-action/issues/104 (opens new window)

# 验证

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

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 为甚,这也是本文的主角。

  • 项目:github-slug-action (opens new window)

这个 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。

  • 更多可用变量,可参考官方文档的说明 (opens new window)。
微信 支付宝
上次更新: 2023/03/08, 11:05:08

← 利用GitHub Actions自动构建go项目的二进制到release 单机部署一个ETCD集群→

最近更新
01
go-cache包的使用简析
03-19
02
学习周刊-总第98期-2023年第11周
03-17
03
使用retry-go给项目添加重试机制
03-15
更多文章>
Theme by Vdoing | Copyright © 2017-2023 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式