Увеличивайте переменную Makefile при каждой сборке

#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. так (нет конечной точки).