Как получить номер сборки MSBuild в имени пакета NuGet с помощью OctoPack?
Я пробую Octopus Deploy (3.4.12) и хочу автоматически использовать номер сборки из имени сборки MS в качестве имени моего пакета NuGet. Например, если мое последнее имя сброса MS Build - "MyApp Build_20161019.2", а имя моего приложения - MyApp, то я хочу, чтобы мой пакет назывался MyApp.20161019.2.0.nupkg.
Причина этого заключается в том, что версия сборки приложения не меняется (исторические причины, не отрицательные), поэтому, если я не передам номер сборки в OctoPack вручную в качестве параметра сборки каждый раз (что снимает блеск с автоматической упаковки IMO), Я не могу загрузить пакет в библиотеку Octopus.
Я использую определение старой сборки TFS XAML между прочим.
Я должен отметить, что нашел блог, в котором написано, что нужно создать собственный шаблон сборки и изменить элемент "Запустить MS Build", чтобы параметры
String.Format("/p:SkipInvalidConfigurations=true {0} /p:OctoPackPackageVersion={1}", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty), BuildDetail.BuildNumber.Split(CChar("_"))(1))
и следовал за шагами, но это не в состоянии построить и дает следующую ошибку:
Ошибка проверки. При частной реализации действия "1: DynamicActivity" возникает следующая ошибка проверки: Обнаружены ошибки (и) компилятора при обработке выражения "String.Format("/p:SkipInvalidConfigurations=true {0} /p:OctoPackPackageVersion={1}", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty), BuildDetail.BuildNumber.Split(CChar("_"))(1))". "Microsoft.TeamFoundation.Build.Client.BuildDetail" не доступен в этом контексте, потому что это "Друг".
1 ответ
Хорошо, я узнал, как это сделать с помощью аналогичного вопроса, который был связан со сборками Git: добавьте BuildNumber в GitTemplate.12.xaml
ПРЕДУПРЕЖДЕНИЕ!! AFAIK вам понадобится VS2013 для этого. Вы не можете сделать это в VS2015.
Для полноты я перечисляю все шаги пламенных обручей, через которые мне пришлось пройти.
1-я попытка:
Я попытался просто установить номер пакета OctoPack, используя переменную среды TF_BUILD TF_BUILD_BUILDNUMBER, указав следующие аргументы MSBuild
/p:RunOctoPack=true /p:OctoPackPackageVersion=”$(TF_BUILD_BUILDNUMBER)"
но TF_BUILD_BUILDNUMBER включает в себя текст (я думаю, название приложения), а также номер, например CIBuild_20130613.6, который вызвал ошибку NuGet, поскольку NuGet может работать только с числами. Кроме того, я действительно хочу только часть 20130613.6.
2-я попытка:
Исследования показали, что мне нужно было создать собственный шаблон процесса сборки. В качестве отправной точки я скачал копию шаблона по умолчанию, отредактировав существующее определение процесса сборки (в котором используется шаблон по умолчанию) и нажав на ссылку загрузки.
Затем я переименовал шаблон в OctoPackBuild.xaml и добавил его в TFS. Я поместил его в папку с именем BuildProcessTemplates отдельно от проекта, который я хотел построить, так как этот шаблон можно использовать для любого проекта.
Технически вы должны создать проект Workflow Activity Library и добавить шаблон в проект, а затем проверить проект в TFS, но я посчитал это ненужным. Смотрите статью MSDN, если вы хотите пойти на все.
После того, как файл xaml находится в TFS, вам нужно отредактировать его в Visual Studio, чтобы получить ссылку на номер сборки. Следующие шаги пришли от ответа на этот вопрос MSDN.
а) Проверьте файл OctoPackBuild.xaml и откройте его в Visual Studio 2013.
б) Перейдите на вкладку "Импорт" в нижней части редактора xaml и добавьте ссылку на Microsoft.TeamFoundation.Build.Activities.Extensions.
c) Щелкните контейнер " Общий процесс сборки " в редакторе xaml, а затем перейдите на вкладку "Переменные" внизу. Добавьте переменную с именем BuildDetail и установите ее тип равным IBuildDetail
d) Из панели инструментов перетащите действие GetEnvironmentVariable сразу после действия Обновить номер сборки и установите тип IBuildDetail. Редактировать свойства деятельности; установите для свойства Name значение WellKnownEnvironmentVariables.BuildDetail, для отображаемого имени - "Получить сведения о сборке " (или что-либо еще, что вас интересует), а для Result - BuildDetail <- это имя созданной вами переменной.
e) Теперь, когда у вас есть доступ к объекту BuildDetail, вы можете передать свойство BuildNumber в MSBuild. Сделайте это, отредактировав свойство CommandLineArguments действия "Выполнить MSBuild" и установив для него значение
String.Format("/p:SkipInvalidConfigurations=true {0} /p:OctoPackPackageVersion={1}", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty), BuildDetail.BuildNumber.Split(CChar("_"))(1))
Следует отметить, что BuildDetail теперь ссылается на вашу переменную, а не на "Microsoft.TeamFoundation.Build.Client.BuildDetail".
Также важно понимать, что существует предположение, что BuildNumber имеет формат [text]_[numbers]. Таким образом, функция Split удаляет текстовую часть и только передает числа в OctoPack. Если вы не разбили BuildNumber, вы могли бы вызвать проблему NuGet, о которой я говорил в моей первой попытке. Это также означает, что если вы добавите дополнительное подчеркивание в имя вашей сборки, вам придется выбрать элемент № 2, а не № 1.
е) Проверьте свой настроенный шаблон сборки (OctoPackBuild.xaml) обратно в TFS.
g) Затем вам нужно отредактировать процесс сборки, чтобы использовать собственный шаблон вместо шаблона по умолчанию.
Причина, по которой вы не можете использовать VS2015 для этого упражнения, заключается в том, что пользовательский интерфейс не позволит вам выбрать файл xaml из TFS. Похоже, MS исчерпал бюджет, и эта часть пользовательского интерфейса обанкротилась.
VS2010 также не работает, так как не может работать с шаблоном TFS 2013.
Единственный способ заставить его работать - использовать VS2013 и отредактировать процесс сборки. VS2013 позволит вам указать новый шаблон и перейти в TFS, чтобы найти файл OctoPackBuild.xaml.
h) Затем все, что вам нужно сделать в процессе сборки, это добавить / p: RunOctoPack = true к аргументам MSBuild, и все готово.
Надеюсь, это поможет кому-то!