#bash #shell #makefile #gnu-make
Вопрос:
У меня есть файл makefile с переменной DOCKER_TAG = 0.0.1
и я хочу, чтобы на каждую вызываемую цель она попадала (только версия патча), возможно ли это
напр.
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)" ] amp;amp; 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 := ..
Комментарии:
1. Вы знаете, как это сделать без макияжа? Я имею в виду, как использовать
docker
команды для получения текущего номера версии и как использовать оболочку для его увеличения?2. @RenaudPacalet — есть ли способ ,которым я могу принять значение var, например 0.0.1, и когда вы запускаете какую-то цель, чтобы обновить ее, что-то вроде
push: updversion
и увеличить только последнее значение ?
Ответ №1:
Лучше всего было бы использовать какую-нибудь команду docker ( docker search
?) для запроса репозитория и получения оттуда последней версии. В случае, если это невозможно, вы можете сохранить его в текстовом файле, читать его каждый раз при запуске make и обновлять. Что-то вроде:
VERSION_FILE := version.txt
DOCKER_TAG := $(shell [ -f "$(VERSION_FILE)" ] amp;amp; 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
Вариант, в котором файл версии сам по себе является файлом создания, включенным в основной:
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)
панель, чтобы получить сообщение об ошибке, если файл не существует. Этот последний — мой любимый.
Комментарии:
1. Спасибо! Я попробовал последний раз , и когда я его запустил, я получил ошибку,
version.txt:1: *** missing separator. Stop.
я создал файлversion.txt
, похожий на файл makefile, и поместил туда значение0.0.1
, я что-то пропустил ?2. когда я удаляю значение из
txt
файла и запускаюmake push
его, оно работает, но в файл добавляется новое значениеDOCKER_TAG := ..
3. Вы объединили два решения. Если вы используете
include $(VERSION_FILE)
решениеecho
, командаecho "DOCKER_TAG := $(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"
неecho "$(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"
выполняется . Выберите одно или другое, но не смешивайте их вместе. И ваша первая проблема, вероятно, была связана с пробелами вместо вкладок. В решениях, которые я показываю, все строки с отступами должны быть разделены одной вкладкой, а не пробелами.4. Пожалуйста, посмотрите мое обновление 2, я попробовал последний вариант и version.txt файл содержит
DOCKER_TAG := ..
значение, есть идеи, что я делаю не так?5. О! Я понимаю. Вы не заменили
...
многоточие, которое я использовал, чтобы не повторять одинаковые строки. Извините, это было недостаточно ясно. Я отредактировал свой ответ, чтобы удалить многоточие. Попробуйте скопировать и вставить точно последнее решение, в каждой строке с отступом замените начальные пробелы табуляцией и будьте осторожны , этоDOCKER_TAG := 0.0.1
неDOCKER_TAG := 0.0.1.
так (нет конечной точки).