【问题标题】:Makefile increase variable on each buildMakefile 在每次构建时增加变量
【发布时间】:2021-06-29 09:57:15
【问题描述】:

我有一个带有变量DOCKER_TAG = 0.0.1的makefile

并且我希望在每个调用它的目标上都会遇到问题(仅补丁版本)是否可能

例如

DOCKER_TAG = 0.0.1

push: 
    docker push docker.io/testasm:$(DOCKER_TAG)

现在,如果我运行make push,它将使用版本0.0.1,但如果我第二次这样做,它将被撞到0.0.2,依此类推(每次运行make push),是否有可能?

更新我已经尝试了以下

DOCKER_TAG = 0.0.1
DOCKER_REGISTRY = testreg/vsp


VERSION_FILE   := version.txt
-include $(VERSION_FILE)

VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))

DOCKER_TAG     := $(shell [ -f "$(VERSION_FILE)" ] && cat "$(VERSION_FILE)" || echo '0.0.1')
VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)



NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)


build:
    echo "$(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

而version.txt 文件的值是.. 两个点...知道如何解决吗?

如果我选择答案中的最后一个选项原样 我看到version.txt 文件包含DOCKER_TAG := ..

更新 2

我创建了空的 version.txt 文件并按原样使用以下文件

VERSION_FILE   := version.txt
DOCKER_TAG     := 0.0.1.

-include $(VERSION_FILE)

VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))

NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)
build:
    docker build -t docker.io/vcd/test:$(DOCKER_TAG) .
    echo "DOCKER_TAG := $(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

我在 version.txt 文件中得到了以下DOCKER_TAG := ..

【问题讨论】:

  • 你知道不用make怎么做吗?我的意思是,如何使用docker命令获取当前版本号,以及如何使用shell来递增它?
  • @RenaudPacalet - 有没有办法让我采用像 0.0.1 这样的 var 值,当你运行一些目标来更新它时,像 push: updversion 这样只增加最后一个值?跨度>

标签: bash shell makefile gnu-make


【解决方案1】:

最好使用一些 docker 命令 (docker search?) 来查询存储库并从那里获取最新版本。如果不可能,您可以将其存储在文本文件中,每次运行 make 时读取并更新它。比如:

VERSION_FILE   := version.txt
DOCKER_TAG     := $(shell [ -f "$(VERSION_FILE)" ] && cat "$(VERSION_FILE)" || echo '0.0.1')
VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)

push:
    docker push docker.io/testasm:$(DOCKER_TAG)
    echo "$(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

当然,您必须照顾好您的版本文件并避免意外删除。为了更高的安全性,您可以自己编写第一个版本文件并指示 make 在文件不存在的情况下引发错误:

VERSION_FILE   := version.txt

ifneq ($(wildcard $(VERSION_FILE)),$(VERSION_FILE))

$(error $(VERSION_FILE) not found)

else

DOCKER_TAG     := $(shell cat "$(VERSION_FILE)")
VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)

push:
    docker push docker.io/testasm:$(DOCKER_TAG)
    echo "$(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

endif

版本文件本身就是主文件包含的 Makefile 的变体:

VERSION_FILE   := version.txt
DOCKER_TAG     := 0.0.1

-include $(VERSION_FILE)

VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)

push:
    docker push docker.io/testasm:$(DOCKER_TAG)
    echo "DOCKER_TAG := $(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

(如果文件不存在,请删除-include $(VERSION_FILE)前面的-会出错。最后一个是我最喜欢的。

【讨论】:

  • 谢谢!我尝试了最后一个,当我运行它时出现错误 version.txt:1: *** missing separator. Stop. 我已经创建了一个文件 version.txt 同级到 makefile 并放在那里值 0.0.1 ,我错过了什么吗?
  • 当我从txt 文件中删除值并运行make push 它可以工作,但新值会添加到文件DOCKER_TAG := ..
  • 您合并了两个解决方案。如果您使用include $(VERSION_FILE) 解决方案,则echocommand 是echo "DOCKER_TAG := $(NEW_DOCKER_TAG)" > "$(VERSION_FILE)" 而不是echo "$(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"。选择其中之一,但不要将它们混合在一起。您的第一个问题可能是由于空格而不是制表符。在解决方案中,我显示所有缩进的行都应该缩进一个制表符,而不是空格。
  • 请查看我的更新 2,我已经尝试了最后一个选项,并且 version.txt 文件包含 DOCKER_TAG := .. 值,知道我做错了什么吗?
  • 哦!我懂了。您没有替换我用来不重复相同行的... 省略号。抱歉,这还不够清楚。我编辑了我的答案以删除省略号。尝试复制粘贴最后一个解决方案,在每个缩进行中用制表符替换前导空格,并且小心,它是DOCKER_TAG := 0.0.1,而不是DOCKER_TAG := 0.0.1.(没有尾随点)。
猜你喜欢
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2021-01-03
  • 2023-04-01
相关资源
最近更新 更多