I have a build process that uses MSBuild to update Azure SQL Managed Instance databases. Essentially, it runs .sql scripts to make these updates. I have successfully ran the commands in PowerShell on a VM. However, when I convert to a pipeline job on a Windows runner, I get the following error in output.
Microsoft ® Build Engine version 4.8.3761.0 [Microsoft .NET Framework, version 4.0.30319.42000] Copyright © Microsoft Corporation. All rights reserved. MSBUILD : error MSB1009: Project file does not exist.
The command I’m trying to run is:
# example values for these vars and p:ManagedInstanceFQDN, p:SqlDbaOperatorEmail - $UserId = "myuserid" - $Password = "SomePassword$!@132" - $BuildName = "dev" - $MsBuildEnvironmentNameParam = "/p:EnvironmentName=$BuildName" # Used to establish LOGSA self-referencing Linked Server - $MsBuildLinkedServerParams = "/p:ManagedInstanceAdminUserName=$UserId /p:ManagedInstanceAdminPassword=$Password /p:ManagedInstanceFQDN=$($ManagedInstance.FullyQualifiedDomainName)" # Used to create SQL Agent Operator - $MsBuildSqlAgentParams = "/p:SqlDbaOperatorName=SQLDBA /p:SqlDbaOperatorEmail=$($SqlAgentOperatorEmail)" - MSBuild.exe `".\Msbuild\Environments\$BuildName.msbuild`" /t:ConfigureSqlServer /p:EnvironmentName=`"$BuildName`" /p:ManagedInstanceAdminUserName=`"$UserId`" /p:ManagedInstanceAdminPassword=`"$Password`" /p:ManagedInstanceFQDN=`"mysmi.windows.net`" /p:SqlDbaOperatorName=SQLDBA /p:SqlDbaOperatorEmail=`"firstname.lastname@example.org`"
In another job, I’m able to execute MSbuild on the same runner without issue, but it does not rely on variables. Here’s an example of a the successful run:
- MSBuild.exe ".\Web Apps\MyApp\MyApp.csproj" /t:Build /p:Configuration=Release /p:DeployOnBuild=true /v:m
I’m thinking it has to do with wrapping quotes around /p: values correctly. I’ve tried several different variations including in addition to the `" above such as '", ", and '. I’ve also tried only wrapping certain values that might be problematic (email, FQDN, and Password). I’ve tried using Invoke-Command and the & operator.
I even tried calling the script I use to execute successfully from a VM with the same results.
What am I missing with this to get it to properly execute in the pipeline?