是否可以通过 GitHub Actions 在合并过程中更新文件,而无需创建第二次提交?

Sri*_*Sri 7 versioning github pull-request semantic-versioning github-actions

目前,我正在尝试使用 GitHub Actions 将应用程序的凹凸版本自动化,作为 PR 合并的一部分。有一个自定义脚本可以识别应用程序的当前版本和 PR 附带的标签,并在存储版本号的文件上相应地更改主要|次要|补丁版本。重要的是,版本碰撞仅在合并 PR 时发生,并且作为 GitHub Actions 的一部分,因为它有助于避免版本文件中的合并冲突,并消除了手动碰撞版本的方式。

下面给出了 GitHub Actions 代码片段。

jobs:
  release:
    # Skip on Pull Request Close event.
    if: "!(github.event_name == 'pull_request' && !github.event.pull_request.merged)"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          ref: ${{ github.ref }}

      - id: bumpversion
        if: github.event.pull_request.merged
        env:
          PR_LABELS: ${{ toJson(github.event.pull_request.labels) }}
        run: bash .github/scripts/bump_version.sh -l "${PR_LABELS}"
Run Code Online (Sandbox Code Playgroud)

bump_version.sh脚本具有下面给出的函数,该函数可以进行版本更改,然后将其推送到分支main

  git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"

  echo "commiting the version bump changes..."
  git add .
  git commit -m "Bump Version v${current_version} -> v${incremented_version}"
  echo "pushing the version bump changes..."
  git push origin dev
Run Code Online (Sandbox Code Playgroud)

这运行良好,但问题是main当 PR 合并到分支时,它会在分支上进行 2 次提交。有一个 CI/CD 管道侦听此main分支的更改,并在有新提交时触发它。由于此 PR 合并进行了 2 次提交,因此它被触发两次。

单个 PR 合并图像的 2 次提交

问题:是否可以通过 GitHub Actions 更新文件作为合并的一部分,而无需创建第二次提交?有没有其他方法可以解决此问题,帮助我在 PR 合并过程中提升版本?

小智 0

我的直接想法是,您可以更改 CI/CD 中的触发器(“on:”)以忽略 2 个提交中的第一个,并仅在第二个提交上运行 CI/CD。

您可以通过多种方法来做到这一点,利用提交附带的任何元数据。这是一个利用标签的想法。您可能必须重构定义incremented_version 的代码,但在bash 中应该不难做到。

这是一个 CI/CD,它将忽略标记为 *.0.0 的内容,但会触发 *.1 或 *.0.1 之类的内容:

on:
  push:
    # Sequence of patterns matched against refs/tags
    tags:
      - !v*.0.0
      - !v*.0  # Do not push events to tags v1.0.0, v1.0, v2.0.0, and v2.0, etc.
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我喜欢让 2 个提交中的第一个有一个额外的 .0 并忽略它们的想法。看起来更干净。配置 bash 脚本来执行此操作后:

on:
  push:
    # Sequence of patterns matched against refs/tags
    tags:
      - !v*.0.0 # Do not push events to tags v1.0.0, v2.0.0, etc.
Run Code Online (Sandbox Code Playgroud)