У меня есть Makefile в проекте, который примерно выглядит следующим образом:

.PHONY: lint test teamcity

lint:
    # commands here

test:
    # commands here

teamcity: lint test

Инструменты, которые я использую в make lint и make test, могут определить, работают ли они в CI (TeamCity), просмотрев переменную среды TEAMCITY_VERSION. Однако мы запускаем их в контейнере Docker на агентах TeamCity, поэтому переменная не установлена.

Я хочу добиться следующего:

  1. Когда выполняется make teamcity, команды в целевых объектах lint и test должны выполняться с установленным в среде параметром TEAMCITY_VERSION;
  2. Когда выполняются make test или make lint, ничего особенного не должно происходить (переменная не должна добавляться, хотя нет необходимости удалять ее, если она установлена во внешней среде).

Как я могу этого достичь?

0
Mikhail Burshteyn 20 Сен 2018 в 19:30

2 ответа

Лучший ответ

Я закончил тем, что сделал следующее:

.PHONY: lint test teamcity

lint:
    # commands here

test:
    # commands here

teamcity: export TEAMCITY_VERSION=1
teamcity: lint test

Здесь TEAMCITY_VERSION объявлен как переменная, зависящая от цели, а директива export экспортирует ее в среду для предварительных целей.

0
Mikhail Burshteyn 21 Сен 2018 в 08:48

Будет ли это работать для вас?

.PHONY: lint test teamcity

lint:
    # commands here

test:
    # commands here

teamcity:
    $(MAKE) TEAMCITY_VERSION=<whatever> lint test

При втором вызове make в командной строке установлено значение TEAMCITY_VERSION. Итак, для этого второго вызова будет установлена переменная make TEAMCITY_VERSION, а также переменная среды оболочки TEAMCITY_VERSION для всех рецептов.

0
Renaud Pacalet 20 Сен 2018 в 19:35