如何获取 GitHub 工作流的短 SHA?

78

我正在GitHub中创建一个工作流程,其中创建并使用一个docker镜像。因此,我在我的工作流文件中使用了一个全局环境变量来存储该docker镜像,该变量对于工作流程中的所有作业都可见:

name: continuous integration
on:
  push:
    branches:
      - '**'

env:
  IMAGE: docker.pkg.github.com/${{ github.repository }}/jactor-persistence:${{ github.sha }}

我想用头提交的短SHA替换${{ github.sha }},就像以下命令的结果一样:git rev-parse --short HEAD

这个可行吗?

6个回答

98

正如VonC所提到的,您可以在前一个步骤中自己计算字符串。

      - name: Set outputs
        id: vars
        run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
      - name: Check outputs
        run: echo ${{ steps.vars.outputs.sha_short }}

1
我的回答有一个很好的补充。问题在于要知道7是足够短,但不会太短:https://dev59.com/DGMl5IYBdhLWcg3wyJYe#21015031 - VonC
1
然而它确实如此:这就是 https://dev59.com/DGMl5IYBdhLWcg3wyJYe#21015031 记录/说明的内容。 - VonC
1
另外值得一提的是,在PR期间HEAD上的提交哈希实际上将指向合并提交,该提交是将PR分支合并到目标分支的结果。CI在该合并上运行,以确保即使考虑可能的合并冲突,构建也不会中断。但是当CI在主干分支上运行时,它就是正确的提交哈希。通常不是问题,但根据用例可能会对您造成影响。 - MaxGhost
8
除了 @MaxGhost 的评论之外,如果你想获取分支最新提交的哈希值而不是合并提交的哈希值:echo "::set-output name=sha_short::$(git rev-parse --short ${{ github.event.pull_request.head.sha }})" - Yoon-Jae Jeong
3
set-output已被弃用,请改用以下命令:echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - Coder1
显示剩余8条评论

47
你还可以使用短SHA设置环境变量:

您可以使用短SHA设置环境变量:

    - name: Add SHORT_SHA env property with commit short sha
      run: echo "SHORT_SHA=`echo ${GITHUB_SHA} | cut -c1-8`" >> $GITHUB_ENV

SHORT_SHA可以像其他环境变量一样使用,例如:

    - name: My step
      run: myscript ${SHORT_SHA}

8
我喜欢这种方法,但使用了rev-parse而不是原文中提到的方法。翻译后的代码如下:run: echo "SHORT_SHA=\git rev-parse --short HEAD`" >> $GITHUB_ENV`。请注意,我尽力保持原文含义不变,同时使语言更易懂。 - Gilberto Treviño
2
我最终采用了这种方法,因为 git rev-parse --short HEAD 对我来说无法工作并且为空白。我也使用了 ${{ github.sha }} - Chad

37

1
这似乎仍然是需要以某种方式逐步运行的东西...尽管它看起来非常简单,但似乎不可能作为全局变量来完成... - jactor-rises
1
@jactor-rises,目前你所寻找的还不可能实现,除非GitHub将短SHA添加到变量/上下文中。因此,目前来看,最短的方式是最好的。在我看来。 - ushuz

5

这在Windows上有效:

- name: Get short SHA
  run: echo "SHORT_SHA=$("${{ github.sha }}".SubString(0, 8))" >> $env:GITHUB_ENV

- name: Print short SHA
  run: echo "Short SHA is ${{ env.SHORT_SHA }}"

2
需要使用PowerShell(Windows工作流程的默认选项)。 - Darrin West

3
它似乎不可用:github上下文仅包括github.sha作为触发工作流运行的完整提交 sha。
您需要以某种方式计算所需的字符串(通过仅选择${{ github.sha }}的前n个字符)。
这意味着您可以:
  • peterevans答案所示定义一个变量
  • 将其写入磁盘
  • cat $my_var在每个步骤中使用您的VAR

请查看actions/starter-workflows issue 68示例

但是自2019年10月起, 您现在可以在工作流程和作业级别定义 "Env at the workflow and job level"

通常需要定义一组环境变量,这些变量在作业中的多个步骤甚至多个工作流程中使用。

现在您可以在工作流和作业级别添加一个env映射
这些环境变量将与层次结构中较低级别定义的env合并。

请参阅:


是的...这是我自己得出的结论。但是是否可能在全局变量中(在${{ github.sha }}之类的地方)使用表达式来避免在需要该变量的所有位置重复此操作? - jactor-rises
@jactor-rises 对于全局变量确实是这样,但是 peterevans 的答案使用了一个变量。 - VonC
我知道这一点,但我想要一个全局环境变量来避免在我的作业中重复代码... - jactor-rises
@jactor-rises 这可以使用环境贴图来实现:请参见我上面编辑过的答案。 - VonC
是的...我正在使用工作流环境(在工作流文件的顶部有env),因此它对工作流中的所有作业都可用。但在工作流阶段,是否可以操作${{ github.sha }}以使其成为短sha,还是必须在我的作业中复制此逻辑? - jactor-rises

0
你可以使用metadata-action从GitHub事件中提取标签(和其他元数据)。从元数据中,你还可以获得一个短SHA。以下是一个提取短SHA并随后使用它构建Docker镜像的作业示例:
- name: Extract metadata (tags, labels) for Docker
  id: meta
  uses: docker/metadata-action@v4
  with:
    images: ${{ env.REGISTRY }}/${{ github.repository }}
    tags: |
      type=sha,format=short,prefix=

- name: Build and push Docker image
  uses: docker/build-push-action@v4
  with:
    context: .
    push: true
    tags: ${{ steps.meta.outputs.tags }}
    labels: ${{ steps.meta.outputs.labels }}

你不需要使用它来构建一个新的镜像。可以通过 ${{ steps.meta.outputs.tags }} 在以下工作中访问它。这里的 meta 是定义标签的工作的标识符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接