TeamCity sagt, dass in einem MSBuild-Schritt "Build Parameters" anstelle von "/ property:" verwendet werden soll. Was bedeutet das?

80

Ich habe ein TeamCity-Server-Setup für meine CI-Builds. Ich erstelle und teste eine C # -Lösung und führe einige benutzerdefinierte MSBuild-Aufgaben aus. Eine dieser Aufgaben ist das Drucken einer Warnung in meiner Build-Ausgabe ...

Die MSBuild-Befehlszeilenparameter enthalten die Parameter "/ property:" oder "/ p:". Bitte verwenden Sie stattdessen Build-Parameter.

Ich verstehe nicht, was dies bedeutet oder wie man es entfernt. Google funktioniert nicht gut (mit oder ohne Tippfehler). Ich habe die Aufgabe über die Befehlszeile (mit /verbosity:diagnostic) ausgeführt und sie wird nicht angezeigt. Ich glaube, es handelt sich um eine TeamCity-Nachricht.

Die MSBuild-Aufgabe lautet

<Target Name="InstallDb">
  <MakeDir Directories="$(DbPath)" />
  <Exec Command="sqlcmd -S .\sqlexpress -i db\OmnyxDatabaseDrop.sql" />
  <Exec Command="sqlcmd -S .\sqlexpress -i db\OmnyxDatabaseCreate.sql -v DbPath=&quot;$(DbPath)&quot;" />
  <Exec Command="sqlcmd -S .\sqlexpress -i db\OmnyxDatabaseProgrammability.sql" />
</Target>

Und die relevanten TeamCity-Schrittinformationen sind

MSBuild-Version: 4.0
MSBuild ToolsVersion: 4.0
Plattform
ausführen : x64 Ziele: InstallDb
Befehlszeilenparameter: /property:DbPath=%env.DB_PATH%

Anthony Mastrean
quelle
5
@AnneTheAgile Sie fügen einfach einen TeamCity System Build Parameter hinzu. Dies ist eine der drei Arten von Build-Parametern, die Sie erwähnt haben. Sie nennen es 'system. <Name-von-my-build-parameter>' und geben den gewünschten Wert an. TeamCity sendet es automatisch an MSBuild. Sie können den Wert des Parameters im Erstellungsbericht überprüfen. Es gibt eine Registerkarte für Parameter, in der alle aufgelistet werden.
Anthony Mastrean

Antworten:

58

Sie müssen in der Konfiguration Build Parametersunter Properties and environmentVariablen hinzufügen

`Geben Sie hier die Bildbeschreibung ein

Build StepEntfernen Sie daher in den Befehlszeilenparametern von for MSBUild alle Eigenschaften, die als angegeben sind, /p:und fügen Sie jede dieser Eigenschaften dem hinzu Build Parameters(Abbildung oben), und geben Sie die Werte an

Manojlds
quelle
5
@ Anthony Mastrean Yeah -Build parameters are passed to a build. Build parameters can be of two types: system properties and environment variables. Environment variables are supported by any build runner, however system properties are only available for build runners with property notion. For example, Command line runner does not support properties.
Manojlds
8
Vielen Dank! Dies funktionierte, aber ich musste dieses Dokument besuchen , um die Implementierung / Verwendung wirklich zu verstehen.
Anthony Mastrean
2
aus Teamstadtdokumenten: Konfigurationsparameter bieten eine Möglichkeit, einige Einstellungen in einer Buildkonfiguration zu überschreiben, die von einer Vorlage geerbt wurde. Sie werden niemals an einen Build übergeben.
Topwik
8
Dies scheint ein Problem zu sein, wenn Sie zwei MSBuild-Schritte in derselben Build-Konfiguration haben, die denselben Parameter, aber unterschiedliche Werte verwenden. Wenn sie auf der Ebene "Build-Konfiguration" definiert werden müssen, ist es anscheinend unmöglich, unterschiedliche Werte desselben Parameters an einen Build-Schritt zu übergeben.
TSmith
2
Das wäre toll. Außer es ist ein Fehler. Was ist, wenn verschiedene Parameter an zwei verschiedene Erstellungsschritte übergeben werden sollen, die denselben Parameternamen haben?
Doug
39

Es passiert alles hinter den Kulissen! Sie müssen nur die richtigen Konventionen befolgen. In Ihrem MSBuild-Skript verwenden Sie die reguläre Variablennotation

$(DbPath)

In TeamCity definieren Sie eine System- oder Umgebungsvariable

system.DbPath

TeamCity sendet automatisch alle System- / Env-Variablen an Ihre MSBuild-Aufgabe und entfernt den Teil 'System' oder 'Env'. Und Sie müssen nicht /property:DbPath=system.DbPathin Ihre TeamCity-Aufgabe schreiben .

Anthony Mastrean
quelle
Gemäß den Dokumenten werden nur Systemvariablen in Skripte eingefügt.
Beladung
1
Soweit ich weiß, werden Umgebungsvariablen als tatsächliche Umgebungsvariablen auf dem Build-Agenten festgelegt. Sie werden möglicherweise nicht wie Systemvariablen an das Build-Skript / den Build-Schritt übergeben, können jedoch verwendet werden. MSBuild muss Umgebungsvariablen verwenden, um Werte für bereitzustellen, $(MyVar)da ich eine TeamCity-Umgebungsvariable habe, die einen Wert für ein doofes cmd-Zeilen-Tool bereitstellt, das ich mit MSBuild aufrufe.
Anthony Mastrean