#github-action #version #deployment #generate #outputs #docker #repository

bin+lib ghaction_version_gen

生成各种版本选项作为 GitHub 动作输出

12 个版本

0.14.0 2024 年 2 月 18 日
0.13.6 2023 年 12 月 26 日
0.13.5 2023 年 10 月 18 日
0.13.2 2023 年 3 月 30 日
0.13.0 2022 年 11 月 29 日

#330命令行工具

MIT 许可证

25KB
397

marketplace CI coveralls github docker

ghaction-version-gen

ghaction-version-gen 是一个 Docker GitHub 动作,为您在部署动作中使用输出版本号。

为仓库生成版本信息有许多方法。它们通常涉及以某种方式处理 GITHUB_REF,也许甚至使用 github-script

此存储库也是如何创建一个在容器中编译 Rust 入口点并将其移动到第二个最小容器的 Docker GitHub 动作的示例。

输出

以下是该动作的 主要 输出,通常用于版本控制

  • version_tagged:对于仅应部署在标签上的仓库,如果 GitHub 事件是标签的推送,则定义。

    输出本身是标签,可选的 v 被移除。

    可以通过 OVERRIDE_VERSION_TAGGED 环境变量覆盖此输出。

  • version_commit:对于在标签上部署且在 mastermain 上提交所有提交的仓库。如果 GitHub 事件是标签的推送或这些分支之一,则定义。

    输出本身是推送的标签,或分支上的最新标签,后跟分支与标签之间的距离(始终不带 v)。

    可以通过 OVERRIDE_VERSION_COMMIT 环境变量覆盖此输出。

  • version_docker_ci:对于持续部署到 hub.docker 的仓库。如果提交推送到 mastermain,则变量具有值 "latest";如果推送了标签,则具有标签(不带 v);否则,它具有值 "null" 作为字符串。最后一种情况允许我们始终将变量用作 build-push-action 的版本,它不喜欢空字符串。

    可以通过 OVERRIDE_VERSION_DOCKER_CI 环境变量覆盖此输出。

您可以在 示例 部分中使用这些变量。

这个 GitHub Action 也可以检查项目特定版本是否与最新标签匹配。目前,仅检查 Rust 的 Cargo.toml 文件。如果存在不匹配,并且正在推送新的标签,该操作将失败。

次要输出

以下是一些可能用于调试或作为替代版本控制方案的 次要 输出。

  • is_push:如果识别出 GitHub 事件,则为 "true",否则为 "false"。
  • is_tag:如果识别出 GitHub ref,则为 "true",否则为 "false"。
  • is_main:"true",如果 GitHub ref 是 mainmaster 分支。
  • is_push_tag:"true",如果推送了标签。
  • is_push_main:"true",如果推送了 mainmaster
  • commit:提交的哈希值。
  • commit_main:主/主分支的提交哈希值。
  • is_main_here:"true",如果主/主分支与当前提交相匹配。
  • git_describe_tagsgit describe --tags 的输出。
  • tag_latest:最新的标签。
  • distance:当前提交与 tag_latest 之间的距离。
  • tag_distancetag_latest-distance
  • tag_head:如果 HEAD 上有标签(不依赖于 GitHub 事件),则为该标签。
  • dash_distance- 预加到 distance
  • tag_latest_ltrimv:不带可选的前置 vtag_latest
  • tag_head_ltrimv:如果 tag_head 已定义,则不带可选的前置 vtag_head
  • rust_crate_version:如果存在,则为 Cargo.toml 中的版本。
  • version_taggedtag_head_ltrimv,如果 is_push_tag
  • version_committag_head_ltrimv,如果 is_push_tagtag_distance_ltrimv,如果 is_push_main
  • version_docker_ci"latest",如果 is_push_main,否则为 tag_head_ltrimv,如果 is_push_tag
  • version_mismatch:如果文件内容与最新标签之间存在版本不匹配,则为错误消息。这也会出现在 GitHub Action 的 "错误" 中。

示例

version_taggedversion_commit

使用 version_taggedversion_commit 非常简单。

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - id: version
        uses: docker://lpenz/ghaction-version-gen:0.13.4
      ...
      - name: deploy
        uses: <deploy action>
        if: steps.version.outputs.version_tagged != ''
        with:
          version: ${{ steps.version.outputs.version_tagged }}

这会使 deploy 步骤仅在推送标签时运行,并将 version 设置为不带可选的 v 前缀的标签。

如果我们将示例中的 version_tagged 替换为 version_commit,我们得到额外的行为:当推送 mainmaster 时,version_commit 也会定义,并且它假定最后一个标签(v 被剥离)的值,后缀为 - 和推送提交到该标签的距离。这应该在每次推送 main 时部署的项目中使用。

version_docker_ci

变量 version_docker_ci 是为与 Docker 的 build-push-action 一起使用而设计的。它应该在需要从标签和 main/master 部署的项目中使用,但我们希望 main/master 在 Docker Hub 上被识别为 latest

这是它的使用方式

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - id: version
        uses: docker://lpenz/ghaction-version-gen:0.13.4
      - uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - uses: docker/build-push-action@v2
        with:
          push: ${{ steps.version.outputs.version_docker_ci != 'null' }}
          tags: ${{ github.repository }}:${{ steps.version.outputs.version_docker_ci }}

请注意,我们没有将 build-push-action 步骤设置为条件,因为我们始终需要构建容器。相反,我们通过检查 version_docker_ci 是否不为 null 来使 push 条件化。我们使用 null 而不是空字符串作为解决方案,因为该操作不允许我们将空字符串用作 tags 中的版本。

依赖项

~3.5–5.5MB
~98K SLoC