Gitlab CI/CD 自动标记发布

Posted

技术标签:

【中文标题】Gitlab CI/CD 自动标记发布【英文标题】:Gitlab CI/CD auto tagging release 【发布时间】:2021-11-29 02:09:20 【问题描述】:

我正在尝试让我的 gitlab 管道自动标记 master 分支,但没有成功。

我想做的事

由于该项目是一个作曲家包,我想做的是从composer.json文件中获取版本号,将其存储在一个变量中,然后将此变量与git一起使用来标记分支。

我在做什么

这是我的.gitlab-ci.yml 的管道作业部分:

tagging:
  stage: publish
  image: alpine
  only:
    - master
  script:
    - version=$(cat composer.json | grep version | grep -Eo "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+")
    - git tag "$(version)"
    - git push --tags

错误

我实际上无法判断问题是什么,因为 gitlab 作业输出中没有显示输出,如下图所示

【问题讨论】:

之前可以cat composer.json进行调试。我认为 grep 命令失败是因为找不到文件或模式。 在之前添加set -xv 命令可能有助于调试。 最后用jq 代替grep 解析JSON 文件怎么样? 【参考方案1】:

好的,不知道为什么这不起作用,但我发现我在第一个 grep 命令中写了Version(大写V)而不是version:这不应该是原因的问题,因为在本地相同的命令管道返回 0 但不是错误。

我不想像 @davide-madrisan 建议的那样在管道作业映像上安装额外的 cli 命令,因为我想让它尽可能简单。

提示和技巧

此外,我发现这个有趣的 gitlab 存储库正是我所需要的:https://gitlab.com/guided-explorations/gitlab-ci-yml-tips-tricks-and-hacks/commit-to-repos-during-ci/commit-to-repos-during-ci

结果

所以最后我想出了这个管道工作:

tagging:
  stage: publish
  only:
    - master
  script:
    - git config --global user.name "$GITLAB_USER_NAME"
    - git config --global user.email "$GITLAB_USER_EMAIL"
    - tag=$(cat composer.json | grep version | grep -Eo "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+")
    - git tag "$tag"
    - git push --tags http://root:$ACCESS_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git HEAD:master

我只需要创建一个个人访问令牌并使用 git credentials 添加树管道变量来创建标签并将其从管道内推送到主分支,但它现在确实可以工作了。

【讨论】:

以上是关于Gitlab CI/CD 自动标记发布的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab CI/CD自动部署方案探索

Gitlab CI/CD自动部署方案探索

好文分享GitLab CI/CD前端自动流水线发布教程

持续集成指南:Gitlab CI/CD 自动部署前端项目

GitLab Jenkins CI/CD 自动化部署

还在用Jenkins?试试Gitlab的CI/CD功能吧