SharedFxInstaller.targets 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <Project>
  2. <Target Name="BuildInstallers" DependsOnTargets="GenerateCumulativeArchives;GenerateRpms;GenerateDebs" />
  3. <Target Name="_EnsureInstallerPrerequisites">
  4. <MakeDir Directories="$(_InstallersOutputDir)" />
  5. <!-- Check Docker server OS -->
  6. <Exec Command="docker version -f &quot;{{.Server.Os}}&quot;" StandardOutputImportance="Normal" ConsoleToMSBuild="true">
  7. <Output TaskParameter="ConsoleOutput" PropertyName="DockerHostOS" />
  8. </Exec>
  9. <Error
  10. Text="Docker host must be using Linux containers."
  11. Condition="'$(DockerHostOS)' != 'linux'"/>
  12. <Error
  13. Text="Expected archive missing at $(SharedFxIntermediateArchiveFilePrefix)-%(WindowsSharedFxRIDs.Identity).zip."
  14. Condition="!Exists('$(SharedFxIntermediateArchiveFilePrefix)-%(WindowsSharedFxRIDs.Identity).zip')" />
  15. <Error
  16. Text="Expected archive missing at $(SharedFxIntermediateArchiveFilePrefix)-%(NonWindowsSharedFxRIDs.Identity).tar.gz."
  17. Condition="!Exists('$(SharedFxIntermediateArchiveFilePrefix)-%(NonWindowsSharedFxRIDs.Identity).tar.gz')" />
  18. </Target>
  19. <Target Name="_DownloadInstallers">
  20. <!-- Download dotnet installers -->
  21. <MakeDir Directories="$(_InstallerSourceDir)" />
  22. <DownloadFile
  23. SourceUrl="$(RuntimeArchiveLinkPrefix)-%(WindowsSharedFxRIDs.Identity).zip$(DotNetAssetRootAccessTokenSuffix)"
  24. DestinationFolder="$(_InstallerSourceDir)"
  25. DestinationFileName="$(DotnetRuntimeFileNamePrefix)-%(WindowsSharedFxRIDs.Identity).zip"
  26. Condition="!Exists('$(_InstallerSourceDir)$(DotnetRuntimeFileNamePrefix)-%(WindowsSharedFxRIDs.Identity).zip')" />
  27. <DownloadFile
  28. SourceUrl="$(RuntimeArchiveLinkPrefix)-%(NonWindowsSharedFxRIDs.Identity).tar.gz$(DotNetAssetRootAccessTokenSuffix)"
  29. DestinationFolder="$(_InstallerSourceDir)"
  30. DestinationFileName="$(DotnetRuntimeFileNamePrefix)-%(NonWindowsSharedFxRIDs.Identity).tar.gz"
  31. Condition="!Exists('$(_InstallerSourceDir)$(DotnetRuntimeFileNamePrefix)-%(NonWindowsSharedFxRIDs.Identity).tar.gz')" />
  32. </Target>
  33. <Target Name="_GenerateCumulativeArchive">
  34. <PropertyGroup>
  35. <ArchiveExtension>.tar.gz</ArchiveExtension>
  36. <ArchiveExtension Condition="$(SharedFxPlatform.StartsWith('win'))">.zip</ArchiveExtension>
  37. </PropertyGroup>
  38. <!-- Clear working directory -->
  39. <RemoveDir Directories="$(_WorkRoot)" />
  40. <MakeDir Directories="$(_WorkRoot)" />
  41. <!-- Create layout: Aspnet Runtime -->
  42. <Exec
  43. Command="tar -xzf $(SharedFxIntermediateArchiveFilePrefix)-$(SharedFxPlatform)$(ArchiveExtension) -C $(_WorkRoot)"
  44. Condition="'$(ArchiveExtension)' == '.tar.gz'"/>
  45. <Exec
  46. Command="tar -xzf $(_InstallerSourceDir)$(DotnetRuntimeFileNamePrefix)-$(SharedFxPlatform)$(ArchiveExtension) -C $(_WorkRoot)"
  47. Condition="'$(ArchiveExtension)' == '.tar.gz'"/>
  48. <UnzipArchive
  49. File="$(SharedFxIntermediateArchiveFilePrefix)-$(SharedFxPlatform)$(ArchiveExtension)"
  50. Destination="$(_WorkRoot)"
  51. Condition="'$(ArchiveExtension)' == '.zip'" />
  52. <UnzipArchive
  53. File="$(_InstallerSourceDir)$(DotnetRuntimeFileNamePrefix)-$(SharedFxPlatform)$(ArchiveExtension)"
  54. Destination="$(_WorkRoot)"
  55. Condition="'$(ArchiveExtension)' == '.zip'" />
  56. <ItemGroup>
  57. <SharedFxArchiveFiles Include="$(_WorkRoot)**\*" />
  58. </ItemGroup>
  59. <!-- Create Aspnet Runtime archive -->
  60. <Exec
  61. Command="tar -czf $(_InstallersOutputDir)$(SharedFxInstallerName)-$(PackageVersion)-$(SharedFxPlatform)$(ArchiveExtension) -C $(_WorkRoot) ."
  62. Condition="'$(ArchiveExtension)' == '.tar.gz'"/>
  63. <ZipArchive
  64. File="$(_InstallersOutputDir)$(SharedFxInstallerName)-$(PackageVersion)-$(SharedFxPlatform)$(ArchiveExtension)"
  65. SourceFiles="@(SharedFxArchiveFiles)"
  66. WorkingDirectory="$(_WorkRoot)"
  67. Overwrite="true"
  68. Condition="'$(ArchiveExtension)' == '.zip'"/>
  69. </Target>
  70. <Target Name="GenerateCumulativeArchives" DependsOnTargets="_EnsureInstallerPrerequisites;_DownloadInstallers">
  71. <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_GenerateCumulativeArchive" Properties="SharedFxPlatform=%(AllSharedFxRIDs.Identity)" />
  72. </Target>
  73. <Target Name="_BuildDockerImage">
  74. <Exec Command="docker build --build-arg USER_ID=%24(id -u) -t docker-image-$(Image) $(Image)" WorkingDirectory="$(_DockerDir)" />
  75. </Target>
  76. <Target Name="_RemoveDockerImage">
  77. <Exec Command="docker rmi docker-image-$(Image)" />
  78. </Target>
  79. <Target Name="_GenerateRpm">
  80. <!-- Clear working directory -->
  81. <RemoveDir Directories="$(_WorkRoot)" />
  82. <MakeDir Directories="$(_WorkRoot)" />
  83. <!-- Create layout: Extract archive if given -->
  84. <MakeDir Directories="$(_WorkRoot)package_root\" />
  85. <Exec Command="tar -xzf $(SharedFxArchive) -C $(_WorkRoot)package_root\" Condition="'$(SharedFxArchive)'!=''" />
  86. <!-- Create layout: Create changelog -->
  87. <PropertyGroup>
  88. <ChangeLogProps>DATE=$([System.DateTime]::UtcNow.ToString(ddd MMM dd yyyy))</ChangeLogProps>
  89. <ChangeLogProps>$(ChangeLogProps);MAINTAINER_NAME=$(RpmMaintainerName)</ChangeLogProps>
  90. <ChangeLogProps>$(ChangeLogProps);MAINTAINER_EMAIL=$(RpmMaintainerEmail)</ChangeLogProps>
  91. <ChangeLogProps>$(ChangeLogProps);PACKAGE_VERSION=$(RpmPackageVersion)</ChangeLogProps>
  92. <ChangeLogProps>$(ChangeLogProps);PACKAGE_REVISION=$(RpmRevision)</ChangeLogProps>
  93. </PropertyGroup>
  94. <GenerateFileFromTemplate TemplateFile="$(_PackagingDir)changelog.in" OutputPath="$(_WorkRoot)templates/changelog" Properties="$(ChangeLogProps)" />
  95. <!-- Run fpm -->
  96. <!-- Retry added due to fpm/docker race where .w/package_root directory cannot be resolved -->
  97. <Run
  98. FileName="docker"
  99. Command="run --rm -v $(RepositoryRoot):$(_DockerRootDir) docker-image-$(Image) fpm --verbose -s dir -t rpm -n $(RpmName)-$(RpmIdVersion) -p $(_DockerRootDir)artifacts/installers/$(RpmName)-$(RpmFileVersion)-$(RpmFileSuffix) -v $(RpmPackageVersion) --iteration $(RpmRevision) -a amd64 $(RpmArguments) --rpm-changelog $(_DockerRootDir).w/templates/changelog --rpm-summary &quot;$(RpmMSummary)&quot; --description &quot;$(RpmDescription)&quot; --maintainer &quot;$(RpmMaintainerName) &lt;$(RpmMaintainerEmail)&gt;&quot; --vendor &quot;$(RpmVendor)&quot; --license &quot;$(RpmLicense)&quot; --url &quot;$(RpmHomepage)&quot; $(_DockerRootDir).w/package_root/=&quot;$(RpmInstallRoot)/&quot;"
  100. MaxRetries="5"/>
  101. </Target>
  102. <Target Name="GenerateRpms" DependsOnTargets="_EnsureInstallerPrerequisites">
  103. <PropertyGroup>
  104. <Image>rhel.7</Image>
  105. <RpmVendor>.NET Foundation</RpmVendor>
  106. <RHInstallRoot>/opt/rh/rh-dotnet20/root/usr/lib64/dotnet</RHInstallRoot>
  107. <Rpm_DotnetRuntimeDependencyId>dotnet-runtime-$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion)</Rpm_DotnetRuntimeDependencyId>
  108. <Rpm_DotnetRuntimeDependencyVersion>$(MicrosoftNETCoreAppPackageVersion.Split('-')[0])</Rpm_DotnetRuntimeDependencyVersion>
  109. </PropertyGroup>
  110. <!-- Build Docker Image -->
  111. <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_BuildDockerImage" Properties="Image=$(Image)" />
  112. <ItemGroup>
  113. <RpmSharedFxDependencies Include="$(Rpm_DotnetRuntimeDependencyId)" Version="$(Rpm_DotnetRuntimeDependencyVersion)" />
  114. <RpmRHSharedFxDirectories Include="$(RHInstallRoot)/shared" />
  115. <RpmGenericSharedFxDirectories Include="$(InstallRoot)/shared" />
  116. </ItemGroup>
  117. <PropertyGroup>
  118. <RpmSharedFxArguments>@(RpmSharedFxDependencies->' -d &quot;%(Identity) &gt;= %(Version)&quot;', ' ')</RpmSharedFxArguments>
  119. <RpmRHSharedFxArguments>$(RpmSharedFxArguments) @(RpmRHSharedFxDirectories->' --directories &quot;%(FullPath)&quot;', ' ')</RpmRHSharedFxArguments>
  120. <RpmGenericSharedFxArguments>$(RpmSharedFxArguments) @(RpmGenericSharedFxDirectories->' --directories &quot;%(FullPath)&quot;', ' ')</RpmGenericSharedFxArguments>
  121. <RpmCommonProps>Image=$(Image);RpmVendor=$(RpmVendor);RpmName=$(SharedFxInstallerName)</RpmCommonProps>
  122. <RpmCommonProps>$(RpmCommonProps);RpmMaintainerName=$(MaintainerName);RpmMaintainerEmail=$(MaintainerEmail)</RpmCommonProps>
  123. <RpmCommonProps>$(RpmCommonProps);RpmHomepage=$(Homepage);RpmRevision=$(RpmPackageRevision)</RpmCommonProps>
  124. <RpmCommonProps>$(RpmCommonProps);RpmLicense=$(LicenseType)</RpmCommonProps>
  125. <RpmCommonProps>$(RpmCommonProps);SharedFxArchive=$(SharedFxIntermediateArchiveFilePrefix)-linux-x64.tar.gz</RpmCommonProps>
  126. <RpmCommonProps>$(RpmCommonProps);RpmMSummary=$(SharedFxSummary);RpmDescription=$(SharedFxDescription)</RpmCommonProps>
  127. <RpmGenericProps>RpmInstallRoot=$(InstallRoot)</RpmGenericProps>
  128. <RpmRHProps>RpmInstallRoot=$(RHInstallRoot)</RpmRHProps>
  129. <RpmProps>RpmIdVersion=$(InstallerIdVersion);RpmPackageVersion=$(InstallerPackageVersion);RpmFileVersion=$(PackageVersion)</RpmProps>
  130. <RpmSharedFxProps>$(RpmCommonProps);$(RpmGenericProps);$(RpmProps);RpmArguments=$(RpmGenericSharedFxArguments);RpmFileSuffix=x64.rpm</RpmSharedFxProps>
  131. <RpmRHSharedFxProps>$(RpmCommonProps);$(RpmRHProps);$(RpmProps);RpmArguments=$(RpmRHSharedFxArguments);RpmFileSuffix=rh.rhel.7-x64.rpm</RpmRHSharedFxProps>
  132. </PropertyGroup>
  133. <!-- Generic installer-->
  134. <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_GenerateRpm" Properties="$(RpmSharedFxProps)" />
  135. <!-- RH installer-->
  136. <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_GenerateRpm" Properties="$(RpmRHSharedFxProps)" />
  137. <!-- Remove Docker Image to save disk space -->
  138. <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_RemoveDockerImage" Properties="Image=$(Image)" />
  139. </Target>
  140. <Target Name="RunDebTool">
  141. <PropertyGroup>
  142. <BuildDebInstallerScript>$(RepositoryRoot)src/Installers/Debian/build.sh</BuildDebInstallerScript>
  143. </PropertyGroup>
  144. <!-- Build deb package -->
  145. <Exec Command="$(BuildDebInstallerScript) -i $(_WorkLayoutDir) -o $(_WorkOutputDir) -n $(INSTALLER_NAME) -v $(INSTALLER_VERSION)" />
  146. </Target>
  147. <Target Name="_GenerateDeb">
  148. <!-- Create layout: Clear work directory -->
  149. <RemoveDir Directories="$(_WorkRoot)" />
  150. <MakeDir Directories="$(_WorkRoot)" />
  151. <!-- Create layout: Extract archive if given -->
  152. <MakeDir Directories="$(_WorkLayoutDir)package_root\" />
  153. <Exec Command="tar -xzf $(SharedFxArchive) -C $(_WorkLayoutDir)package_root/" Condition="'$(SharedFxArchive)'!=''" />
  154. <!-- Create layout: Generate and Place debian_config.json -->
  155. <PropertyGroup>
  156. <DebConfigProps>MAINTAINER_NAME=$(MaintainerName)</DebConfigProps>
  157. <DebConfigProps>$(DebConfigProps);MAINTAINER_EMAIL=$(MaintainerEmail)</DebConfigProps>
  158. <DebConfigProps>$(DebConfigProps);HOMEPAGE=$(Homepage)</DebConfigProps>
  159. <DebConfigProps>$(DebConfigProps);INSTALL_ROOT=$(InstallRoot)</DebConfigProps>
  160. <DebConfigProps>$(DebConfigProps);PACKAGE_NAME=$(DebPrefix)</DebConfigProps>
  161. <DebConfigProps>$(DebConfigProps);PACKAGE_REVISION=$(PackageRevision)</DebConfigProps>
  162. <DebConfigProps>$(DebConfigProps);LICENSE_TYPE=$(LicenseType)</DebConfigProps>
  163. <DebConfigProps>$(DebConfigProps);SHORT_DESCRIPTION=$(DebSummary)</DebConfigProps>
  164. <DebConfigProps>$(DebConfigProps);LONG_DESCRIPTION=$(DebDescription)</DebConfigProps>
  165. <DebConfigProps>$(DebConfigProps);DEBIAN_DEPENDENCIES=$(DebDependencies)</DebConfigProps>
  166. </PropertyGroup>
  167. <GenerateFileFromTemplate TemplateFile="$(DebConfigInFile)" OutputPath="$(_WorkLayoutDir)debian_config.json" Properties="$(DebConfigProps)" />
  168. <!-- Build SharedFx Bundle Deb package -->
  169. <Exec Command="docker run --rm -v $(RepositoryRoot):$(_DockerRootDir) -e DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true -e INSTALLER_NAME=$(DebPrefix)-$(DebIdVersion) -e INSTALLER_VERSION=$(DebPackageVersion) docker-image-$(Image) ./build.sh /t:RunDebTool"
  170. ContinueOnError="WarnAndContinue" />
  171. <!-- Copy SharedFx packages to output -->
  172. <ItemGroup>
  173. <GeneratedDebFiles Include="$(_WorkOutputDir)/*.deb" />
  174. </ItemGroup>
  175. <Error Text="@(GeneratedDebFiles->Count()) deb installer files generated." Condition="'@(GeneratedDebFiles->Count())' != 1" />
  176. <Copy
  177. DestinationFiles="$(_InstallersOutputDir)$(DebPrefix)-$(DebFileVersion)-x64.deb"
  178. SourceFiles="@(GeneratedDebFiles)"
  179. OverwriteReadOnlyFiles="True"
  180. SkipUnchangedFiles="False"
  181. UseHardlinksIfPossible="False" />
  182. </Target>
  183. <Target Name="GenerateDebs" DependsOnTargets="_EnsureInstallerPrerequisites">
  184. <PropertyGroup>
  185. <Deb_DotnetRuntimeDependencyId>dotnet-runtime-$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion)</Deb_DotnetRuntimeDependencyId>
  186. <Deb_DotnetRuntimeDependencyVersion>$(MicrosoftNETCoreAppPackageVersion)</Deb_DotnetRuntimeDependencyVersion>
  187. <!-- Needed some creativity to convert the PackageVersion M.N.P-Build to the installer version M.N.P~Build, The conditional handles stabilized builds -->
  188. <Deb_DotnetRuntimeDependencyVersion Condition="$(Deb_DotnetRuntimeDependencyVersion.Contains('-'))">$(Deb_DotnetRuntimeDependencyVersion.Substring(0, $(Deb_DotnetRuntimeDependencyVersion.IndexOf('-'))))~$(Deb_DotnetRuntimeDependencyVersion.Substring($([MSBuild]::Add($(Deb_DotnetRuntimeDependencyVersion.IndexOf('-')), 1))))</Deb_DotnetRuntimeDependencyVersion>
  189. </PropertyGroup>
  190. <ItemGroup>
  191. <_DebSharedFxDependencies Include="$(Deb_DotnetRuntimeDependencyId)" Version="$(Deb_DotnetRuntimeDependencyVersion)"/>
  192. </ItemGroup>
  193. <PropertyGroup>
  194. <Image>ubuntu.14.04</Image>
  195. <DebSharedFxDependencies>@(_DebSharedFxDependencies->'"%(Identity)": { "package_version": "%(Version)" }', ', ')</DebSharedFxDependencies>
  196. <DebCommonProps>Image=$(Image);DebPrefix=$(SharedFxInstallerName)</DebCommonProps>
  197. <DebCommonProps>$(DebCommonProps);DebSummary=$(SharedFxSummary);DebDescription=$(SharedFxDescription)</DebCommonProps>
  198. <DebCommonProps>$(DebCommonProps);SharedFxArchive=$(SharedFxIntermediateArchiveFilePrefix)-linux-x64.tar.gz</DebCommonProps>
  199. <DebProps>DebIdVersion=$(InstallerIdVersion);DebPackageVersion=$(DebInstallerPackageVersion);DebFileVersion=$(PackageVersion);DebDependencies=$(DebSharedFxDependencies)</DebProps>
  200. </PropertyGroup>
  201. <!-- Build Docker Image -->
  202. <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_BuildDockerImage" Properties="Image=$(Image)" />
  203. <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_GenerateDeb" Properties="$(DebCommonProps);$(DebProps)" />
  204. <!-- Remove Docker Image to save disk space -->
  205. <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_RemoveDockerImage" Properties="Image=$(Image)" />
  206. </Target>
  207. </Project>