首页 > 解决方案 > 如何在 bash shell 环境中自动增加文件名版本?

问题描述

对于上下文,我正在构建一个 Jenkins 作业来自动 git 标记我们的分支代码。想法是构造一个分支标签命名标准如下:

<latest_tag_in_branch>.<branch_name>.<revision>

让我们假设一个分支名称为“hotFix”。如果最新标签中不包含分支名称(例如2.0.55),那么我们应该在其后附加修订版 1。例如

2.0.55.hotFix.1

如果在此 hotFix 分支上创建了另一个标记,而没有合并任何其他代码(因此最新的公共标记不会更改),则变为:

2.0.55.hotFix.2

如果我们随后与创建了后续标签的 master 合并(例如,假设 2.0.58 是最新的),那么该分支的下一个构建将“重置”为:

2.0.58.hotFix.1

命令:

git describe --abbrev=0 --tags

会给我最新的标签。例如,它可以是2.0.552.0.55.hotFix.1。如何在 bash shell 环境中继续使用这些信息来完成标记名称的其余部分?例如,追加<branch_name>.1或增加<revision>1。

到目前为止我的代码:

> git describe --abbrev=0 --tags

(返回例如 2.0.55 或 2.0.55.hotFix.3)

在 bash 方面相对缺乏经验,我不确定下一步该做什么的最佳方法。

标签: bash

解决方案


您可以将命令的输出通过管道git传输到另一个可以操作文本的进程(我更喜欢awk这里)。

git describe --abbrev=0 --tags | awk -F. -v OFS=. '{
 if (NF == 3) $0 = $0".hotFix.1"
 else if (NF >= 5) $5 += 1
} 1'

这样做是将输出从您的git命令重定向到awk(作为输入)。

  1. .我们通过分别做-F.和来设置输入和输出分隔符-v OFS=.

  2. awk将运行我们在大括号中提供的脚本。

  3. 我们的脚本将检查输入是否有三个参数(在 的情况下2.0.55)。NF是一个预定义变量,用于存储输入中的字段。将连接到整个输入(即)。$0 = $0".hotFix.1".hotFix.1$0

  4. 如果输入没有三个参数,我们检查它是否至少有 5 个参数 ( NF >= 5)。然后将第五个字段增加 1 ( $5 += 1)。

  5. 最后,一旦脚本完成运行,我们通过1在右大括号后附加 a 来打印语句。请注意,如果输入只有一个或两个字段,它将打印未修改的输入。

请注意,您也可以将您awk的写在一行上。我选择将它写成几行,因为它更具可读性。


如果您希望使用正则表达式来检查第五个字段是否为整数(在应用 之前+= 1,您可以else if

else if (NF >= 5 && $5 ~ /^[0-9]*$/) $5 += 1

这将检查字段数 ( NF) 是否大于 5 ,并检查第五个字段 ( $5) 是否匹配 ( ~) 正则表达式模式 ( /.../) 与[0-9]*从开头 ( ^) 到结尾 ( ) 的数字 ( $)。


推荐阅读