GitHub Actions:如何检查当前推送是否有新标签(是否为新版本)?

54
name: test-publish

on: [push]

jobs:
  test:
    strategy:
      ...
    steps:
      ...

  publish:
    needs: test
    if: github.event_name == 'push' && github.ref???
    steps:
      ...  # eg: publish package to PyPI

为了检查这个提交是否是新版本,我应该在jobs.publish.if中放置什么内容?

这样写可以吗:contains(github.ref, '/tags/')

如果我同时推送代码和标签会发生什么?

3个回答

83

你可以使用这个方法来检查当前的 push 事件是否是针对以 v 开头的标签。

  publish:
    needs: test
    if: startsWith(github.ref, 'refs/tags/v')

正如你所指出的,我不认为你能保证这是一个新版本。 我的建议是改用on: release 而不是 on: push。 这将仅在新标记版本上触发。

请参阅此处有关on:release的文档: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#release


2
我使用该工作流程来测试每个推送,我不想创建一个完全相同的测试工作流程和额外的发布工作流程。因此,“on:release”不适用。此外,在检查“github”对象后,我得出结论,使用“startsWith/contains”解析“ref”是一个有效的解决方案,因为没有其他关于发布的信息。 - aiven
5
您能否将操作触发器设置为既可以按下又可以释放,并且使发布步骤取决于此条件,即 if: github.event_name == 'release' - Joshua Coady
4
这种方法对我没用。github.ref包含的是refs/heads/blabla而不是标签。我尝试了几种组合:提交推送,然后创建并推送标签(使用--tags选项)。 提交、打标签,然后推送(当然也要使用--tags选项)。 CI作业链接 - Stepan Dyatkovskiy
2
我真的很困惑,@StepanDyatkovskiy 如果这不起作用,为什么会收到那么多赞? - knocte
3
@StepanDyatkovskiy 看起来你需要使用 on: push: tags: ... 或者 on: release 来设置 github.ref 为标签。请参考文档以了解 github.ref 如何根据触发器进行设置:https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#release - erb
显示剩余2条评论

23

如果您想自由使用标签并仅发布特定版本,可以使用GitHub Release作为触发器的替代方法:

on:
  release:
    types: [created]

jobs:
  release-job:
    name: Releasing
    if: github.event_name == 'release' && github.event.action == 'created'

1
你可以使用github.ref_type来检查触发工作流运行的ref类型。
引发工作流运行的ref类型。有效值为branchtag
  publish:
    needs: test
    if: github.ref_type == 'tag'

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