github 操作:如何检查当前推送是否有新标签(是新版本)?

Aiv*_*ven 24 git github github-actions

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
Run Code Online (Sandbox Code Playgroud)

我应该输入什么jobs.publish.if来检查这个提交是否是新版本?

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

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

pet*_*ans 33

您可以这样做来检查当前推送事件是否针对以 开头的标签v

  publish:
    needs: test
    if: startsWith(github.ref, 'refs/tags/v')
Run Code Online (Sandbox Code Playgroud)

不过,正如您所指出的,我认为您不能保证这是一个新版本。我的建议是使用on: release而不是on: push. 这只会在新标记的版本上触发。

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

  • 这个方法对我不起作用。`github.ref` 包含 `refs/heads/blabla` 而不是标签。我尝试了几种组合:提交推送,然后创建并推送标签(使用“--tags”选项)。提交,标记,然后推送(当然也使用“--tags”选项)。[CI 作业链接](https://github.com/kaomoneus/cpl/runs/2978231466?check_suite_focus=true) (5认同)
  • 您能否同时通过推送和发布来触发操作,然后使发布步骤以“if: github.event_name == 'release'”为条件? (3认同)
  • @StepanDyatkovskiy 看起来您需要 `on: Push: Tags: ...` 或 `on:release` 才能将 `github.ref` 设置为标签。请参阅文档了解如何根据触发器设置 `github.ref`:https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#release (3认同)
  • 我使用该工作流程来测试每个推送,并且我不想使用完全相同的测试作业和额外的发布作业来创建单独的工作流程。所以 `on:release` 不行。另外,在检查了 `github` 对象之后,我得出结论,用 `startsWith/contains` 解析 `ref` 是一个有效的解决方案,因为没有关于发布的其他信息。 (2认同)
  • 我真的很困惑,@StepanDyatkovskiy 如果这不起作用,为什么它会收到这么多赞成票? (2认同)

Den*_*din 5

使用 GitHub Release 作为触发器的另一种方法(如果您想自由使用标签并仅发布特定版本):

on:
  release:
    types: [created]

jobs:
  release-job:
    name: Releasing
    if: github.event_name == 'release' && github.event.action == 'created'
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以用来github.ref_type检查触发工作流程运行的引用类型。

触发工作流运行的引用类型。有效值为branchtag

  publish:
    needs: test
    if: github.ref_type == 'tag'
Run Code Online (Sandbox Code Playgroud)