2017-02-08 7 views
2

Что я хочу сделать, так это настроить мой travis.yml для использования соответствующих названных окружений, основанных на том, какая ветка строится.Трэвис: Можете ли вы построить env var, используя другие env vars?

Я имею в виду вдоль линии, если я хранится в Трэвис $ DEV_ARTIFACTS_KEY/$ TEST_ARTIFACTS_KEY и т.д.

Тогда я нажимаю на DEV ветви, так что $ TRAVIS_BRANCH = DEV

Затем я могу сделать что-то как: ARTIFACTS_KEY = $ {$} TRAVIS_BRANCH _ARTIFACTS_KEY и становится: ARTIFACTS_KEY = $ DEV_ARTIFACTS_KEY

Очевидно, что выше синтаксис с {} не работает, или я бы здесь не было! Интересно, возможен ли в теории этот метод, и если да, то как !?

EDIT: Для более подробно о том, что я пытаюсь сделать

Я хотел установить 3 переменные описанным выше способом.

ARTIFACTS_KEY, ARTIFACTS_SECRET & ARTIFACTS_BUCKET создан на лету из {ПОДРАЗДЕЛЕНИЯ} _ARTIFACTS_KEY, {ДП} _ARTIFACTS_SECRET {ДП} _ARTIFACTS_BUCKET

У меня он работает без ветвления переменных, как:

env: 
    - ARTIFACTS_KEY=$DEV_ARTIFACTS_KEY ARTIFACTS_SECRET=$DEV_ARTIFACTS_SECRET ARTIFACTS_BUCKET=$DEV_ARTIFACTS_BUCKET 

где $ DEV_ARTIFACTS_KEY и т. д. определены в Travis. Однако я до сих пор не смог заменить часть DEV на имя ветки на лету.

ответ

0

Это работает в Баш и, следовательно, должны также работать в Travis:

# setup dummy values 
TRAVIS_BRANCH=DEV 
DEV_ARTIFACTS_KEY=dev-artifacts-key-value 
DEV_ARTIFACTS_SECRET=dev-artifacts-secret-value 
DEV_ARTIFACTS_BUCKET=dev-artifacts-bucket-value 

# actual lines you want 
eval ARTIFACTS_KEY=\$${TRAVIS_BRANCH}_ARTIFACTS_KEY 
eval ARTIFACTS_SECRET=\$${TRAVIS_BRANCH}_ARTIFACTS_SECRET 
eval ARTIFACTS_BUCKET=\$${TRAVIS_BRANCH}_ARTIFACTS_BUCKET 

# test results 
echo "key=$ARTIFACTS_KEY" 
echo "secret=$ARTIFACTS_SECRET" 
echo "bucket=$ARTIFACTS_BUCKET" 

Всякий раз, когда у вас есть имя переменной внутри другой переменной, вам нужно eval интерпретировать его. Когда Баш видит эту строку:

eval ARTIFACTS_KEY=\$${TRAVIS_BRANCH}_ARTIFACTS_KEY 

Это первый расширяет переменную (и оставляет сбежавший $ покое):

eval ARTIFACTS_KEY=\$DEV_ARTIFACTS_KEY 

Затем он выполняет eval на строку ARTIFACTS_KEY=$DEV_ARTIFACTS_KEY, которая, в свою очередь расширяет $DEV_ARTIFACTS_KEY и присваивает значение до ARTIFACTS_KEY.

+0

ooh, это ближе, хотя все еще не совсем работает. Теперь он правильно оценивает TRAVIS_BRANCH, но затем пытается обработать результирующее значение как строку, а не другую переменную среды. Итак, помимо ARTIFACTS_KEY, я также пытаюсь установить ARTIFACTS_BUCKET & в журнале, это говорит «bucket: $ DEV_ARTIFACTS_BUCKET», а не мое фактическое имя ведра. Возможно ли, чтобы полученное значение рассматривалось как env var, или я пытаюсь сделать невозможное? – MissGeek

+0

Этот код, когда выполняется в bash, * должен * присваивать значение '$ DEV_ARTIFACTS_BUCKET'' ARTIFACTS_KEY'. Тем не менее, я не тестировал его на Трэвисе. Но вы, похоже, делаете что-то еще, о котором вы ранее не говорили ('ARTIFACTS_BUCKET'), позаботиться о том, чтобы обновить вопрос? – flyx

+0

Извините за неясность, обновили вопрос, чтобы включить все переменные, которые я пытаюсь установить :) – MissGeek