我有一个带有变量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 := ..
最好使用一些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)
前面的-
以获得错误。最后一个是我最喜欢的。