Aws codebuild - как назначить значения динамических переменных в buildspec.yml?

Я хочу назвать артефакт, созданный моей CodeBuild, в соответствии со временем его создания.

Я пробовал следующее, но когда артефакт загружается в S3, имя буквально является выражением, а не оцененным значением выражения, которое я установил.

Можно ли установить для переменных env: динамические значения, и если да, то как? Если нет, есть ли лучший способ сделать то, что я пытаюсь здесь сделать?

version: 0.2

env:
  variables:
    ARTIFACT_NAME: '[string]::Format("v{0}.zip", (Get-Date).ToString("yyyyMMdd-HHmmss"))'

... build commands ...

artifacts:
  Name:$Env:ARTIFACT_NAME

Обновление: я скорректировал раздел артефактов следующим образом и полностью опустил переменную, согласно предложению ниже, но при этом продолжаю получать ошибку.

artifacts:
  files:
    - '**/*'
  discard-paths: no
  base-directory: publish/release
  name: version-$(date +%Y%m%d-%H%M%S).zip

Результаты по ошибке:

[Container] 2018/08/10 15:59:26 Updating artifact name as  Get-Date : Cannot bind parameter 'Date'. 
Cannot convert value "+%Y%m%d-%H%M%S" to type "System.DateTime". 
Error: "String was not recognized as a valid DateTime."
At C:\codebuild\tmp\script.ps1:5 char:21
+ echo version-$(date +%Y%m%d-%H%M%S).zip
+                     ~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (:) [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetDateCommand

version-.zip
3
0
2 992
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Согласно документы вы можете добиться этого с помощью следующего синтаксиса:

version: 0.2         
phases:
  build:
    commands:
     - rspec HelloWorld_spec.rb
artifacts:
  files:
   - '**/*'
  name: myname-$(date +%Y-%m-%d) ```

Я видел этот пример, но он не включает время, только дату, и мне сложно понять, откуда взялось значение. Я попытался расширить то, что было перечислено, включив% h% m% s, но это не сработало, поэтому я пытался использовать формат PowerShell, с которым я более знаком. Когда я включаю% H% M% S, выражение даты, похоже, вообще не оценивается и просто опускается. Я ожидаю, что артефакты будут генерироваться несколько раз в день, поэтому указанная дата нам не подходит.

SWC 10.08.2018 17:25

если под значением вы имеете в виду $ (date +% Y-% m-% d) - это командный язык оболочки, который они поддерживают. pubs.opengroup.org/onlinepubs/9699919799 это правда не работает? `name: myname - $ (date +% Y-% m-% d-% H-% M-% S)` и как именно оно не работает? ... в чем ошибка

Nune Isabekyan 10.08.2018 17:28

он может не работать в разделе переменных, вы пробовали раздел артефактов? ... не могли бы вы опубликовать имеющийся у вас пример, который не работает с продлением даты с помощью% H?

Nune Isabekyan 10.08.2018 17:33

Конечно, я обновил свой исходный раздел артефактов и соответствующую ошибку.

SWC 10.08.2018 18:05

Я упустил тот факт, что это PowerShell. Тогда я думаю, что он придерживается формата .Net DateTime. И насколько я понимаю, заглавная S - вот что здесь ломает ... docs.microsoft.com/en-us/dotnet/standard/base-types/… Попробуйте использовать "date +% Y% m% d-% H% M% s"

Nune Isabekyan 10.08.2018 19:59

Изменение строки формата на единицу, которая соответствует этому правилу, не решает проблему, а просто жалуется на новый формат. Мне остается неясным, какой формат он на самом деле ожидает или как он анализирует строку имени артефакта. версия - $ (date +% yyyy% MM% dd-% HH% mm% ss) .zip действителен в Powershell, и на самом деле, если я добавлю post_build, который перемещает файл в это место, он работает. Но попытка применить его к имени артефакта не удалась, как указано выше.

SWC 13.08.2018 15:52

из-за ошибки похоже, что вместо "date" выполняется "get-date" ... Я только что попробовал онлайн-редактор PowerShell ... можете ли вы дать ему последнюю попытку с помощью $ (date -UFormat "% Y% m % d-% H% M% S ")

Nune Isabekyan 13.08.2018 21:46

Версия -UFormat действительно работает с именем артефакта, поэтому я буду использовать ее. Я не уверен, почему это должно работать, когда добавление к документированному примеру без флага не работает, но спасибо за то, что разобрались!

SWC 14.08.2018 15:31

Согласно https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-date?view=powershell-6 Вы можете попробовать $ (Get-Date -UFormat "% Y% m% d-% H% M% S") в PowerShell.

Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши друзья-пользователи имели некоторое представление о том, что это такое и почему. Всегда цитируйте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно отключен.

rsjaffe 15.08.2018 03:11

Следующее работает для вас?

name: myname-`date '+%y%m%d-%H%M%S'`

Другие вопросы по теме