diff --git a/.config/CredScanSuppressions.json b/.config/CredScanSuppressions.json new file mode 100644 index 000000000..0e52eb402 --- /dev/null +++ b/.config/CredScanSuppressions.json @@ -0,0 +1,4 @@ +{ + "tool": "Credential Scanner", + "suppressions": [] +} diff --git a/.gitignore b/.gitignore index 25bf790b2..62e02185d 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,20 @@ cmake/ .dotnet.payload # MSBuild Logs -**/MSBuild_Logs/MSBuild_pid-*.failure.txt \ No newline at end of file +**/MSBuild_Logs/MSBuild_pid-*.failure.txt + +############################################################################### +# Eng branch specific files +############################################################################### +eng/ +!eng/common/ +!eng/pipelines/public.yml +!eng/Publishing.props +!eng/Signing.props +!eng/Version.Details.xml +!eng/Versions.props +src/ +tools/ +Directory.Build.props +Directory.Build.targets +workload-versions.sln \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props deleted file mode 100644 index e747638d0..000000000 --- a/Directory.Build.props +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - net8.0 - $(CopyrightNetFoundation) - MIT - false - Latest - true - - true - - - \ No newline at end of file diff --git a/Directory.Build.targets b/Directory.Build.targets deleted file mode 100644 index 817af988c..000000000 --- a/Directory.Build.targets +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - $(WorkloadsVersion)-$(VersionSuffix) - - - \ No newline at end of file diff --git a/NuGet.config b/NuGet.config index bbcd98f2b..205a37fab 100644 --- a/NuGet.config +++ b/NuGet.config @@ -7,43 +7,21 @@ - - - - - - - - - - - - - - - - - - + + + + - - - - - - + - - - @@ -62,12 +40,7 @@ - - - - - - + diff --git a/build.cmd b/build.cmd index fe43bbf96..3898c8b0f 100644 --- a/build.cmd +++ b/build.cmd @@ -1,3 +1,7 @@ @echo off +for /f %%i in ('git config --get remote.origin.url') do set REPO_URL=%%i +git clone -b eng %REPO_URL% eng-branch +robocopy "eng-branch" "." /E /XO /XD ".git" ".config" /XF ".gitignore" "build.cmd" "public.yml" /NJH /NJS /NP /NFL /NDL +rmdir /s /q "eng-branch" powershell -NoLogo -NoProfile -ExecutionPolicy ByPass -Command "& """%~dp0eng\common\build.ps1""" -restore -build -msbuildEngine vs %*" exit /b %ErrorLevel% diff --git a/documentation/release-process.md b/doc/release-process.md similarity index 100% rename from documentation/release-process.md rename to doc/release-process.md diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4e0d3d23a..07c2ed56b 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,48 +1,48 @@ - + https://github.com/dotnet/emsdk - 2c27e405e17595694d91892159593d6dd10e61e2 + b65413ac057eb0a54c51b76b1855bc377c2132c3 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 80aa709f5d919c6814726788dc6dabe23e79e672 + fa7cdded37981a97cec9a3e233c4a6af58a91c57 - + https://github.com/dotnet/android - 0ccdc57cf7fc59bd3f6cbf900c9cdbebadfe4609 + 1dcfb6f8779c33b6f768c996495cb90ecd729329 - - https://github.com/xamarin/xamarin-macios - b3ee0f2422cd950a0c0c676fb8ac9e7dc5f98290 + + https://github.com/dotnet/macios + e5afbf5332820488c4a2d26dad02df88c0110136 - - https://github.com/xamarin/xamarin-macios - b3ee0f2422cd950a0c0c676fb8ac9e7dc5f98290 + + https://github.com/dotnet/macios + e5afbf5332820488c4a2d26dad02df88c0110136 - - https://github.com/xamarin/xamarin-macios - b3ee0f2422cd950a0c0c676fb8ac9e7dc5f98290 + + https://github.com/dotnet/macios + e5afbf5332820488c4a2d26dad02df88c0110136 - - https://github.com/xamarin/xamarin-macios - b3ee0f2422cd950a0c0c676fb8ac9e7dc5f98290 + + https://github.com/dotnet/macios + e5afbf5332820488c4a2d26dad02df88c0110136 - + https://github.com/dotnet/maui - 85f2a06ecd11e4ba5a9e567d86f9d2fb49a2c5ca + 5531aa96fe88f40f612b4772fee56dceefc37932 - + https://dev.azure.com/dnceng/internal/_git/dotnet-sdk - 96da45d427abd4d74c27960061daf18b51cd474f + 49aa03442a648a5064a4440f16109db773a9f9b5 - + https://github.com/dotnet/arcade - bac7e1caea791275b7c3ccb4cb75fd6a04a26618 + 6666973b629b24e259162dba03486c23af464bab diff --git a/eng/Versions.props b/eng/Versions.props index 248529b9a..1a71e3cad 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -10,7 +10,7 @@ 1 - 03 + 12 0 false @@ -18,22 +18,6 @@ - - 2 - 00 - 0 - - - 3 - 00 - 0 - false - - preview - 0 - $(VersionMajor).$(VersionSDKMinor)$(VersionFeature).$(VersionPatch) @@ -60,19 +44,19 @@ - 9.0.2 + 9.0.11 $(MicrosoftNETWorkloadEmscriptenCurrentManifest90100PackageVersion) 9.0.100$([System.Text.RegularExpressions.Regex]::Match($(EmscriptenWorkloadManifestVersion), `-[A-z]*[\.]*\d*`)) 9.0.100 - 35.0.39 - 18.2.9173 - 18.2.9173 - 18.2.9173 - 15.2.9173 - 9.0.14 + 35.0.105 + 26.0.9766 + 26.0.9766 + 26.0.9766 + 26.0.9766 + 9.0.111 $(MicrosoftNETSdkMauiManifest90100PackageVersion) $(MicrosoftNETSdkAndroidManifest90100PackageVersion) $(MicrosoftNETSdkiOSManifest90100PackageVersion) @@ -81,7 +65,7 @@ $(MicrosoftNETSdktvOSManifest90100PackageVersion) - 9.0.2 + 9.0.11 $(MicrosoftNETCoreAppRefPackageVersion) @@ -92,4 +76,5 @@ 8.2.2 $(MicrosoftNETSdkAspireManifest80100PackageVersion) + diff --git a/eng/common/SetupNugetSources.ps1 b/eng/common/SetupNugetSources.ps1 index 5db4ad71e..792b60b49 100644 --- a/eng/common/SetupNugetSources.ps1 +++ b/eng/common/SetupNugetSources.ps1 @@ -10,8 +10,8 @@ # displayName: Setup Private Feeds Credentials # condition: eq(variables['Agent.OS'], 'Windows_NT') # inputs: -# filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1 -# arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $Env:Token +# filePath: $(System.DefaultWorkingDirectory)/eng/common/SetupNugetSources.ps1 +# arguments: -ConfigFile $(System.DefaultWorkingDirectory)/NuGet.config -Password $Env:Token # env: # Token: $(dn-bot-dnceng-artifact-feeds-rw) # diff --git a/eng/common/SetupNugetSources.sh b/eng/common/SetupNugetSources.sh index 4604b61b0..facb415ca 100755 --- a/eng/common/SetupNugetSources.sh +++ b/eng/common/SetupNugetSources.sh @@ -11,8 +11,8 @@ # - task: Bash@3 # displayName: Setup Internal Feeds # inputs: -# filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh -# arguments: $(Build.SourcesDirectory)/NuGet.config +# filePath: $(System.DefaultWorkingDirectory)/eng/common/SetupNugetSources.sh +# arguments: $(System.DefaultWorkingDirectory)/NuGet.config # condition: ne(variables['Agent.OS'], 'Windows_NT') # - task: NuGetAuthenticate@1 # diff --git a/eng/common/core-templates/job/job.yml b/eng/common/core-templates/job/job.yml index ba53ebfbd..8da43d3b5 100644 --- a/eng/common/core-templates/job/job.yml +++ b/eng/common/core-templates/job/job.yml @@ -19,6 +19,7 @@ parameters: # publishing defaults artifacts: '' enableMicrobuild: false + microbuildUseESRP: true enablePublishBuildArtifacts: false enablePublishBuildAssets: false enablePublishTestResults: false @@ -134,6 +135,11 @@ jobs: signType: $(_SignType) zipSources: false feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json + ${{ if eq(parameters.microbuildUseESRP, true) }}: + ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: + ConnectedPMEServiceName: 6cc74545-d7b9-4050-9dfa-ebefcc8961ea + ${{ else }}: + ConnectedPMEServiceName: 248d384a-b39b-46e3-8ad5-c2c210d5e7ca env: TeamName: $(_TeamName) MicroBuildOutputFolderOverride: '$(Agent.TempDirectory)' @@ -160,7 +166,7 @@ jobs: inputs: languages: ${{ coalesce(parameters.richCodeNavigationLanguage, 'csharp') }} environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'internal') }} - richNavLogOutputDirectory: $(Build.SourcesDirectory)/artifacts/bin + richNavLogOutputDirectory: $(System.DefaultWorkingDirectory)/artifacts/bin uploadRichNavArtifacts: ${{ coalesce(parameters.richCodeNavigationUploadArtifacts, false) }} continueOnError: true @@ -183,7 +189,7 @@ jobs: inputs: testResultsFormat: 'xUnit' testResultsFiles: '*.xml' - searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)' + searchFolder: '$(System.DefaultWorkingDirectory)/artifacts/TestResults/$(_BuildConfig)' testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-xunit mergeTestResults: ${{ parameters.mergeTestResults }} continueOnError: true @@ -194,7 +200,7 @@ jobs: inputs: testResultsFormat: 'VSTest' testResultsFiles: '*.trx' - searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)' + searchFolder: '$(System.DefaultWorkingDirectory)/artifacts/TestResults/$(_BuildConfig)' testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-trx mergeTestResults: ${{ parameters.mergeTestResults }} continueOnError: true @@ -238,7 +244,7 @@ jobs: - task: CopyFiles@2 displayName: Gather buildconfiguration for build retry inputs: - SourceFolder: '$(Build.SourcesDirectory)/eng/common/BuildConfiguration' + SourceFolder: '$(System.DefaultWorkingDirectory)/eng/common/BuildConfiguration' Contents: '**' TargetFolder: '$(Build.ArtifactStagingDirectory)/eng/common/BuildConfiguration' continueOnError: true diff --git a/eng/common/core-templates/job/onelocbuild.yml b/eng/common/core-templates/job/onelocbuild.yml index 00feec8eb..edefa789d 100644 --- a/eng/common/core-templates/job/onelocbuild.yml +++ b/eng/common/core-templates/job/onelocbuild.yml @@ -8,7 +8,7 @@ parameters: CeapexPat: $(dn-bot-ceapex-package-r) # PAT for the loc AzDO instance https://dev.azure.com/ceapex GithubPat: $(BotAccount-dotnet-bot-repo-PAT) - SourcesDirectory: $(Build.SourcesDirectory) + SourcesDirectory: $(System.DefaultWorkingDirectory) CreatePr: true AutoCompletePr: false ReusePr: true @@ -68,7 +68,7 @@ jobs: - ${{ if ne(parameters.SkipLocProjectJsonGeneration, 'true') }}: - task: Powershell@2 inputs: - filePath: $(Build.SourcesDirectory)/eng/common/generate-locproject.ps1 + filePath: $(System.DefaultWorkingDirectory)/eng/common/generate-locproject.ps1 arguments: $(_GenerateLocProjectArguments) displayName: Generate LocProject.json condition: ${{ parameters.condition }} @@ -115,7 +115,7 @@ jobs: is1ESPipeline: ${{ parameters.is1ESPipeline }} args: displayName: Publish LocProject.json - pathToPublish: '$(Build.SourcesDirectory)/eng/Localize/' + pathToPublish: '$(System.DefaultWorkingDirectory)/eng/Localize/' publishLocation: Container artifactName: Loc condition: ${{ parameters.condition }} \ No newline at end of file diff --git a/eng/common/core-templates/job/publish-build-assets.yml b/eng/common/core-templates/job/publish-build-assets.yml index 3d3356e31..a58c8a418 100644 --- a/eng/common/core-templates/job/publish-build-assets.yml +++ b/eng/common/core-templates/job/publish-build-assets.yml @@ -32,6 +32,10 @@ parameters: is1ESPipeline: '' + repositoryAlias: self + + officialBuildId: '' + jobs: - job: Asset_Registry_Publish @@ -54,6 +58,11 @@ jobs: value: false # unconditional - needed for logs publishing (redactor tool version) - template: /eng/common/core-templates/post-build/common-variables.yml + - name: OfficialBuildId + ${{ if ne(parameters.officialBuildId, '') }}: + value: ${{ parameters.officialBuildId }} + ${{ else }}: + value: $(Build.BuildNumber) pool: # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com) @@ -72,7 +81,7 @@ jobs: - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - checkout: self + - checkout: ${{ parameters.repositoryAlias }} fetchDepth: 3 clean: true @@ -93,12 +102,12 @@ jobs: azureSubscription: "Darc: Maestro Production" scriptType: ps scriptLocation: scriptPath - scriptPath: $(Build.SourcesDirectory)/eng/common/sdk-task.ps1 + scriptPath: $(System.DefaultWorkingDirectory)/eng/common/sdk-task.ps1 arguments: -task PublishBuildAssets -restore -msbuildEngine dotnet /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' /p:MaestroApiEndpoint=https://maestro.dot.net /p:PublishUsingPipelines=${{ parameters.publishUsingPipelines }} - /p:OfficialBuildId=$(Build.BuildNumber) + /p:OfficialBuildId=$(OfficialBuildId) condition: ${{ parameters.condition }} continueOnError: ${{ parameters.continueOnError }} @@ -113,7 +122,7 @@ jobs: Add-Content -Path $filePath -Value "$(DefaultChannels)" Add-Content -Path $filePath -Value $(IsStableBuild) - $symbolExclusionfile = "$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt" + $symbolExclusionfile = "$(System.DefaultWorkingDirectory)/eng/SymbolPublishingExclusionsFile.txt" if (Test-Path -Path $symbolExclusionfile) { Write-Host "SymbolExclusionFile exists" @@ -142,7 +151,7 @@ jobs: azureSubscription: "Darc: Maestro Production" scriptType: ps scriptLocation: scriptPath - scriptPath: $(Build.SourcesDirectory)/eng/common/post-build/publish-using-darc.ps1 + scriptPath: $(System.DefaultWorkingDirectory)/eng/common/post-build/publish-using-darc.ps1 arguments: > -BuildId $(BARBuildId) -PublishingInfraVersion 3 diff --git a/eng/common/core-templates/job/source-build.yml b/eng/common/core-templates/job/source-build.yml index c4713c8b6..5baedac1e 100644 --- a/eng/common/core-templates/job/source-build.yml +++ b/eng/common/core-templates/job/source-build.yml @@ -26,11 +26,16 @@ parameters: # Specifies the build script to invoke to perform the build in the repo. The default # './build.sh' should work for typical Arcade repositories, but this is customizable for # difficult situations. + # buildArguments: '' + # Specifies additional build arguments to pass to the build script. # jobProperties: {} # A list of job properties to inject at the top level, for potential extensibility beyond # container and pool. platform: {} + # Optional list of directories to ignore for component governance scans. + componentGovernanceIgnoreDirectories: [] + is1ESPipeline: '' # If set to true and running on a non-public project, @@ -91,3 +96,4 @@ jobs: parameters: is1ESPipeline: ${{ parameters.is1ESPipeline }} platform: ${{ parameters.platform }} + componentGovernanceIgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }} diff --git a/eng/common/core-templates/job/source-index-stage1.yml b/eng/common/core-templates/job/source-index-stage1.yml index 205fb5b3a..662b9fcce 100644 --- a/eng/common/core-templates/job/source-index-stage1.yml +++ b/eng/common/core-templates/job/source-index-stage1.yml @@ -1,7 +1,7 @@ parameters: runAsPublic: false - sourceIndexUploadPackageVersion: 2.0.0-20240522.1 - sourceIndexProcessBinlogPackageVersion: 1.0.1-20240522.1 + sourceIndexUploadPackageVersion: 2.0.0-20250425.2 + sourceIndexProcessBinlogPackageVersion: 1.0.1-20250425.2 sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci" preSteps: [] @@ -66,7 +66,7 @@ jobs: - script: ${{ parameters.sourceIndexBuildCommand }} displayName: Build Repository - - script: $(Agent.TempDirectory)/.source-index/tools/BinLogToSln -i $(BinlogPath) -r $(Build.SourcesDirectory) -n $(Build.Repository.Name) -o .source-index/stage1output + - script: $(Agent.TempDirectory)/.source-index/tools/BinLogToSln -i $(BinlogPath) -r $(System.DefaultWorkingDirectory) -n $(Build.Repository.Name) -o .source-index/stage1output displayName: Process Binlog into indexable sln - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: diff --git a/eng/common/core-templates/jobs/codeql-build.yml b/eng/common/core-templates/jobs/codeql-build.yml index f2144252c..4571a7864 100644 --- a/eng/common/core-templates/jobs/codeql-build.yml +++ b/eng/common/core-templates/jobs/codeql-build.yml @@ -25,7 +25,7 @@ jobs: - name: DefaultGuardianVersion value: 0.109.0 - name: GuardianPackagesConfigFile - value: $(Build.SourcesDirectory)\eng\common\sdl\packages.config + value: $(System.DefaultWorkingDirectory)\eng\common\sdl\packages.config - name: GuardianVersion value: ${{ coalesce(parameters.overrideGuardianVersion, '$(DefaultGuardianVersion)') }} diff --git a/eng/common/core-templates/jobs/jobs.yml b/eng/common/core-templates/jobs/jobs.yml index ea69be434..bf33cdc2c 100644 --- a/eng/common/core-templates/jobs/jobs.yml +++ b/eng/common/core-templates/jobs/jobs.yml @@ -43,6 +43,8 @@ parameters: artifacts: {} is1ESPipeline: '' + repositoryAlias: self + officialBuildId: '' # Internal resources (telemetry, microbuild) can only be accessed from non-public projects, # and some (Microbuild) should only be applied to non-PR cases for internal builds. @@ -117,3 +119,5 @@ jobs: enablePublishBuildArtifacts: ${{ parameters.enablePublishBuildArtifacts }} artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} signingValidationAdditionalParameters: ${{ parameters.signingValidationAdditionalParameters }} + repositoryAlias: ${{ parameters.repositoryAlias }} + officialBuildId: ${{ parameters.officialBuildId }} diff --git a/eng/common/core-templates/jobs/source-build.yml b/eng/common/core-templates/jobs/source-build.yml index a10ccfbee..0b408a67b 100644 --- a/eng/common/core-templates/jobs/source-build.yml +++ b/eng/common/core-templates/jobs/source-build.yml @@ -21,6 +21,9 @@ parameters: # one job runs on 'defaultManagedPlatform'. platforms: [] + # Optional list of directories to ignore for component governance scans. + componentGovernanceIgnoreDirectories: [] + is1ESPipeline: '' # If set to true and running on a non-public project, @@ -47,6 +50,7 @@ jobs: is1ESPipeline: ${{ parameters.is1ESPipeline }} jobNamePrefix: ${{ parameters.jobNamePrefix }} platform: ${{ platform }} + componentGovernanceIgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }} enableInternalSources: ${{ parameters.enableInternalSources }} - ${{ if eq(length(parameters.platforms), 0) }}: @@ -55,4 +59,5 @@ jobs: is1ESPipeline: ${{ parameters.is1ESPipeline }} jobNamePrefix: ${{ parameters.jobNamePrefix }} platform: ${{ parameters.defaultManagedPlatform }} + componentGovernanceIgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }} enableInternalSources: ${{ parameters.enableInternalSources }} diff --git a/eng/common/core-templates/post-build/post-build.yml b/eng/common/core-templates/post-build/post-build.yml index 454fd75c7..2ee8bbfff 100644 --- a/eng/common/core-templates/post-build/post-build.yml +++ b/eng/common/core-templates/post-build/post-build.yml @@ -44,6 +44,11 @@ parameters: displayName: Publish installers and checksums type: boolean default: true + + - name: requireDefaultChannels + displayName: Fail the build if there are no default channel(s) registrations for the current build + type: boolean + default: false - name: SDLValidationParameters type: object @@ -144,7 +149,7 @@ stages: - task: PowerShell@2 displayName: Validate inputs: - filePath: $(Build.SourcesDirectory)/eng/common/post-build/nuget-validation.ps1 + filePath: $(System.DefaultWorkingDirectory)/eng/common/post-build/nuget-validation.ps1 arguments: -PackagesPath $(Build.ArtifactStagingDirectory)/PackageArtifacts/ - job: @@ -201,7 +206,7 @@ stages: filePath: eng\common\sdk-task.ps1 arguments: -task SigningValidation -restore -msbuildEngine vs /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts' - /p:SignCheckExclusionsFile='$(Build.SourcesDirectory)/eng/SignCheckExclusionsFile.txt' + /p:SignCheckExclusionsFile='$(System.DefaultWorkingDirectory)/eng/SignCheckExclusionsFile.txt' ${{ parameters.signingValidationAdditionalParameters }} - template: /eng/common/core-templates/steps/publish-logs.yml @@ -251,7 +256,7 @@ stages: - task: PowerShell@2 displayName: Validate inputs: - filePath: $(Build.SourcesDirectory)/eng/common/post-build/sourcelink-validation.ps1 + filePath: $(System.DefaultWorkingDirectory)/eng/common/post-build/sourcelink-validation.ps1 arguments: -InputPath $(Build.ArtifactStagingDirectory)/BlobArtifacts/ -ExtractPath $(Agent.BuildDirectory)/Extract/ -GHRepoName $(Build.Repository.Name) @@ -306,11 +311,12 @@ stages: azureSubscription: "Darc: Maestro Production" scriptType: ps scriptLocation: scriptPath - scriptPath: $(Build.SourcesDirectory)/eng/common/post-build/publish-using-darc.ps1 + scriptPath: $(System.DefaultWorkingDirectory)/eng/common/post-build/publish-using-darc.ps1 arguments: > -BuildId $(BARBuildId) -PublishingInfraVersion ${{ parameters.publishingInfraVersion }} -AzdoToken '$(System.AccessToken)' -WaitPublishingFinish true + -RequireDefaultChannels ${{ parameters.requireDefaultChannels }} -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}' -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}' diff --git a/eng/common/core-templates/post-build/setup-maestro-vars.yml b/eng/common/core-templates/post-build/setup-maestro-vars.yml index f7602980d..a7abd58c4 100644 --- a/eng/common/core-templates/post-build/setup-maestro-vars.yml +++ b/eng/common/core-templates/post-build/setup-maestro-vars.yml @@ -36,7 +36,7 @@ steps: $AzureDevOpsBuildId = $Env:Build_BuildId } else { - . $(Build.SourcesDirectory)\eng\common\tools.ps1 + . $(System.DefaultWorkingDirectory)\eng\common\tools.ps1 $darc = Get-Darc $buildInfo = & $darc get-build ` --id ${{ parameters.BARBuildId }} ` diff --git a/eng/common/core-templates/steps/enable-internal-sources.yml b/eng/common/core-templates/steps/enable-internal-sources.yml index 64f881bff..4085512b6 100644 --- a/eng/common/core-templates/steps/enable-internal-sources.yml +++ b/eng/common/core-templates/steps/enable-internal-sources.yml @@ -17,8 +17,8 @@ steps: - task: PowerShell@2 displayName: Setup Internal Feeds inputs: - filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1 - arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $Env:Token + filePath: $(System.DefaultWorkingDirectory)/eng/common/SetupNugetSources.ps1 + arguments: -ConfigFile $(System.DefaultWorkingDirectory)/NuGet.config -Password $Env:Token env: Token: ${{ parameters.legacyCredential }} # If running on dnceng (internal project), just use the default behavior for NuGetAuthenticate. @@ -29,8 +29,8 @@ steps: - task: PowerShell@2 displayName: Setup Internal Feeds inputs: - filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1 - arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config + filePath: $(System.DefaultWorkingDirectory)/eng/common/SetupNugetSources.ps1 + arguments: -ConfigFile $(System.DefaultWorkingDirectory)/NuGet.config - ${{ else }}: - template: /eng/common/templates/steps/get-federated-access-token.yml parameters: @@ -39,8 +39,8 @@ steps: - task: PowerShell@2 displayName: Setup Internal Feeds inputs: - filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1 - arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $(dnceng-artifacts-feeds-read-access-token) + filePath: $(System.DefaultWorkingDirectory)/eng/common/SetupNugetSources.ps1 + arguments: -ConfigFile $(System.DefaultWorkingDirectory)/NuGet.config -Password $(dnceng-artifacts-feeds-read-access-token) # This is required in certain scenarios to install the ADO credential provider. # It installed by default in some msbuild invocations (e.g. VS msbuild), but needs to be installed for others # (e.g. dotnet msbuild). diff --git a/eng/common/core-templates/steps/generate-sbom.yml b/eng/common/core-templates/steps/generate-sbom.yml index d938b60e1..7f5b84c4c 100644 --- a/eng/common/core-templates/steps/generate-sbom.yml +++ b/eng/common/core-templates/steps/generate-sbom.yml @@ -6,7 +6,7 @@ parameters: PackageVersion: 9.0.0 - BuildDropPath: '$(Build.SourcesDirectory)/artifacts' + BuildDropPath: '$(System.DefaultWorkingDirectory)/artifacts' PackageName: '.NET' ManifestDirPath: $(Build.ArtifactStagingDirectory)/sbom IgnoreDirectories: '' @@ -38,7 +38,7 @@ steps: PackageName: ${{ parameters.packageName }} BuildDropPath: ${{ parameters.buildDropPath }} PackageVersion: ${{ parameters.packageVersion }} - ManifestDirPath: ${{ parameters.manifestDirPath }} + ManifestDirPath: ${{ parameters.manifestDirPath }}/$(ARTIFACT_NAME) ${{ if ne(parameters.IgnoreDirectories, '') }}: AdditionalComponentDetectorArgs: '--IgnoreDirectories ${{ parameters.IgnoreDirectories }}' diff --git a/eng/common/core-templates/steps/publish-logs.yml b/eng/common/core-templates/steps/publish-logs.yml index 80788c523..0623ac6e1 100644 --- a/eng/common/core-templates/steps/publish-logs.yml +++ b/eng/common/core-templates/steps/publish-logs.yml @@ -12,22 +12,22 @@ steps: inputs: targetType: inline script: | - New-Item -ItemType Directory $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ - Move-Item -Path $(Build.SourcesDirectory)/artifacts/log/Debug/* $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ + New-Item -ItemType Directory $(System.DefaultWorkingDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ + Move-Item -Path $(System.DefaultWorkingDirectory)/artifacts/log/Debug/* $(System.DefaultWorkingDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ continueOnError: true condition: always() - task: PowerShell@2 displayName: Redact Logs inputs: - filePath: $(Build.SourcesDirectory)/eng/common/post-build/redact-logs.ps1 + filePath: $(System.DefaultWorkingDirectory)/eng/common/post-build/redact-logs.ps1 # For now this needs to have explicit list of all sensitive data. Taken from eng/publishing/v3/publish.yml - # Sensitive data can as well be added to $(Build.SourcesDirectory)/eng/BinlogSecretsRedactionFile.txt' + # Sensitive data can as well be added to $(System.DefaultWorkingDirectory)/eng/BinlogSecretsRedactionFile.txt' # If the file exists - sensitive data for redaction will be sourced from it # (single entry per line, lines starting with '# ' are considered comments and skipped) - arguments: -InputPath '$(Build.SourcesDirectory)/PostBuildLogs' + arguments: -InputPath '$(System.DefaultWorkingDirectory)/PostBuildLogs' -BinlogToolVersion ${{parameters.BinlogToolVersion}} - -TokensFilePath '$(Build.SourcesDirectory)/eng/BinlogSecretsRedactionFile.txt' + -TokensFilePath '$(System.DefaultWorkingDirectory)/eng/BinlogSecretsRedactionFile.txt' '$(publishing-dnceng-devdiv-code-r-build-re)' '$(MaestroAccessToken)' '$(dn-bot-all-orgs-artifact-feeds-rw)' @@ -42,7 +42,7 @@ steps: - task: CopyFiles@2 displayName: Gather post build logs inputs: - SourceFolder: '$(Build.SourcesDirectory)/PostBuildLogs' + SourceFolder: '$(System.DefaultWorkingDirectory)/PostBuildLogs' Contents: '**' TargetFolder: '$(Build.ArtifactStagingDirectory)/PostBuildLogs' diff --git a/eng/common/core-templates/steps/source-build.yml b/eng/common/core-templates/steps/source-build.yml index 2915d29bb..0718e4ba9 100644 --- a/eng/common/core-templates/steps/source-build.yml +++ b/eng/common/core-templates/steps/source-build.yml @@ -11,6 +11,10 @@ parameters: # for details. The entire object is described in the 'job' template for simplicity, even though # the usage of the properties on this object is split between the 'job' and 'steps' templates. platform: {} + + # Optional list of directories to ignore for component governance scans. + componentGovernanceIgnoreDirectories: [] + is1ESPipeline: false steps: @@ -79,6 +83,7 @@ steps: ${{ coalesce(parameters.platform.buildScript, './build.sh') }} --ci \ --configuration $buildConfig \ --restore --build --pack $publishArgs -bl \ + ${{ parameters.platform.buildArguments }} \ $officialBuildArgs \ $internalRuntimeDownloadArgs \ $internalRestoreArgs \ @@ -96,7 +101,7 @@ steps: - task: CopyFiles@2 displayName: Prepare BuildLogs staging directory inputs: - SourceFolder: '$(Build.SourcesDirectory)' + SourceFolder: '$(System.DefaultWorkingDirectory)' Contents: | **/*.log **/*.binlog @@ -125,5 +130,8 @@ steps: parameters: displayName: Component Detection (Exclude upstream cache) is1ESPipeline: ${{ parameters.is1ESPipeline }} - componentGovernanceIgnoreDirectories: '$(Build.SourcesDirectory)/artifacts/sb/src/artifacts/obj/source-built-upstream-cache' + ${{ if eq(length(parameters.componentGovernanceIgnoreDirectories), 0) }}: + componentGovernanceIgnoreDirectories: '$(System.DefaultWorkingDirectory)/artifacts/sb/src/artifacts/obj/source-built-upstream-cache' + ${{ else }}: + componentGovernanceIgnoreDirectories: ${{ join(',', parameters.componentGovernanceIgnoreDirectories) }} disableComponentGovernance: ${{ eq(variables['System.TeamProject'], 'public') }} diff --git a/eng/common/generate-sbom-prep.ps1 b/eng/common/generate-sbom-prep.ps1 index 3e5c1c74a..a0c7d792a 100644 --- a/eng/common/generate-sbom-prep.ps1 +++ b/eng/common/generate-sbom-prep.ps1 @@ -4,18 +4,26 @@ Param( . $PSScriptRoot\pipeline-logging-functions.ps1 +# Normally - we'd listen to the manifest path given, but 1ES templates will overwrite if this level gets uploaded directly +# with their own overwriting ours. So we create it as a sub directory of the requested manifest path. +$ArtifactName = "${env:SYSTEM_STAGENAME}_${env:AGENT_JOBNAME}_SBOM" +$SafeArtifactName = $ArtifactName -replace '["/:<>\\|?@*"() ]', '_' +$SbomGenerationDir = Join-Path $ManifestDirPath $SafeArtifactName + +Write-Host "Artifact name before : $ArtifactName" +Write-Host "Artifact name after : $SafeArtifactName" + Write-Host "Creating dir $ManifestDirPath" + # create directory for sbom manifest to be placed -if (!(Test-Path -path $ManifestDirPath)) +if (!(Test-Path -path $SbomGenerationDir)) { - New-Item -ItemType Directory -path $ManifestDirPath - Write-Host "Successfully created directory $ManifestDirPath" + New-Item -ItemType Directory -path $SbomGenerationDir + Write-Host "Successfully created directory $SbomGenerationDir" } else{ Write-PipelineTelemetryError -category 'Build' "Unable to create sbom folder." } Write-Host "Updating artifact name" -$artifact_name = "${env:SYSTEM_STAGENAME}_${env:AGENT_JOBNAME}_SBOM" -replace '["/:<>\\|?@*"() ]', '_' -Write-Host "Artifact name $artifact_name" -Write-Host "##vso[task.setvariable variable=ARTIFACT_NAME]$artifact_name" +Write-Host "##vso[task.setvariable variable=ARTIFACT_NAME]$SafeArtifactName" diff --git a/eng/common/generate-sbom-prep.sh b/eng/common/generate-sbom-prep.sh index d5c76dc82..b8ecca72b 100755 --- a/eng/common/generate-sbom-prep.sh +++ b/eng/common/generate-sbom-prep.sh @@ -14,19 +14,24 @@ done scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" . $scriptroot/pipeline-logging-functions.sh + +# replace all special characters with _, some builds use special characters like : in Agent.Jobname, that is not a permissible name while uploading artifacts. +artifact_name=$SYSTEM_STAGENAME"_"$AGENT_JOBNAME"_SBOM" +safe_artifact_name="${artifact_name//["/:<>\\|?@*$" ]/_}" manifest_dir=$1 -if [ ! -d "$manifest_dir" ] ; then - mkdir -p "$manifest_dir" - echo "Sbom directory created." $manifest_dir +# Normally - we'd listen to the manifest path given, but 1ES templates will overwrite if this level gets uploaded directly +# with their own overwriting ours. So we create it as a sub directory of the requested manifest path. +sbom_generation_dir="$manifest_dir/$safe_artifact_name" + +if [ ! -d "$sbom_generation_dir" ] ; then + mkdir -p "$sbom_generation_dir" + echo "Sbom directory created." $sbom_generation_dir else Write-PipelineTelemetryError -category 'Build' "Unable to create sbom folder." fi -artifact_name=$SYSTEM_STAGENAME"_"$AGENT_JOBNAME"_SBOM" echo "Artifact name before : "$artifact_name -# replace all special characters with _, some builds use special characters like : in Agent.Jobname, that is not a permissible name while uploading artifacts. -safe_artifact_name="${artifact_name//["/:<>\\|?@*$" ]/_}" echo "Artifact name after : "$safe_artifact_name export ARTIFACT_NAME=$safe_artifact_name echo "##vso[task.setvariable variable=ARTIFACT_NAME]$safe_artifact_name" diff --git a/eng/common/internal/NuGet.config b/eng/common/internal/NuGet.config index 19d3d311b..f70261ed6 100644 --- a/eng/common/internal/NuGet.config +++ b/eng/common/internal/NuGet.config @@ -4,4 +4,7 @@ + + + diff --git a/eng/common/post-build/nuget-verification.ps1 b/eng/common/post-build/nuget-verification.ps1 index a365194a9..ac5c69ffc 100644 --- a/eng/common/post-build/nuget-verification.ps1 +++ b/eng/common/post-build/nuget-verification.ps1 @@ -30,7 +30,7 @@ [CmdletBinding(PositionalBinding = $false)] param( [string]$NuGetExePath, - [string]$PackageSource = "https://api.nuget.org/v3/index.json", + [string]$PackageSource = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json", [string]$DownloadPath, [Parameter(ValueFromRemainingArguments = $true)] [string[]]$args diff --git a/eng/common/post-build/publish-using-darc.ps1 b/eng/common/post-build/publish-using-darc.ps1 index 90b58e32a..a261517ef 100644 --- a/eng/common/post-build/publish-using-darc.ps1 +++ b/eng/common/post-build/publish-using-darc.ps1 @@ -5,7 +5,8 @@ param( [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro.dot.net/', [Parameter(Mandatory=$true)][string] $WaitPublishingFinish, [Parameter(Mandatory=$false)][string] $ArtifactsPublishingAdditionalParameters, - [Parameter(Mandatory=$false)][string] $SymbolPublishingAdditionalParameters + [Parameter(Mandatory=$false)][string] $SymbolPublishingAdditionalParameters, + [Parameter(Mandatory=$false)][string] $RequireDefaultChannels ) try { @@ -33,6 +34,10 @@ try { if ("false" -eq $WaitPublishingFinish) { $optionalParams.Add("--no-wait") | Out-Null } + + if ("true" -eq $RequireDefaultChannels) { + $optionalParams.Add("--default-channels-required") | Out-Null + } & $darc add-build-to-channel ` --id $buildId ` diff --git a/eng/common/template-guidance.md b/eng/common/template-guidance.md index 98bbc1ded..4bf4cf41b 100644 --- a/eng/common/template-guidance.md +++ b/eng/common/template-guidance.md @@ -50,7 +50,7 @@ extends: - task: CopyFiles@2 displayName: Gather build output inputs: - SourceFolder: '$(Build.SourcesDirectory)/artifacts/marvel' + SourceFolder: '$(System.DefaultWorkingDirectory)/artifacts/marvel' Contents: '**' TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/marvel' ``` diff --git a/eng/common/templates-official/job/job.yml b/eng/common/templates-official/job/job.yml index 605692d2f..81ea7a261 100644 --- a/eng/common/templates-official/job/job.yml +++ b/eng/common/templates-official/job/job.yml @@ -3,7 +3,7 @@ parameters: enableSbom: true runAsPublic: false PackageVersion: 9.0.0 - BuildDropPath: '$(Build.SourcesDirectory)/artifacts' + BuildDropPath: '$(System.DefaultWorkingDirectory)/artifacts' jobs: - template: /eng/common/core-templates/job/job.yml @@ -16,6 +16,7 @@ jobs: parameters: PackageVersion: ${{ parameters.packageVersion }} BuildDropPath: ${{ parameters.buildDropPath }} + ManifestDirPath: $(Build.ArtifactStagingDirectory)/sbom publishArtifacts: false # publish artifacts diff --git a/eng/common/templates-official/variables/sdl-variables.yml b/eng/common/templates-official/variables/sdl-variables.yml index dbdd66d4a..f1311bbb1 100644 --- a/eng/common/templates-official/variables/sdl-variables.yml +++ b/eng/common/templates-official/variables/sdl-variables.yml @@ -4,4 +4,4 @@ variables: - name: DefaultGuardianVersion value: 0.109.0 - name: GuardianPackagesConfigFile - value: $(Build.SourcesDirectory)\eng\common\sdl\packages.config \ No newline at end of file + value: $(System.DefaultWorkingDirectory)\eng\common\sdl\packages.config \ No newline at end of file diff --git a/eng/common/templates/job/job.yml b/eng/common/templates/job/job.yml index d1aeb92fc..5bdd3dd85 100644 --- a/eng/common/templates/job/job.yml +++ b/eng/common/templates/job/job.yml @@ -6,7 +6,7 @@ parameters: enableSbom: true runAsPublic: false PackageVersion: 9.0.0 - BuildDropPath: '$(Build.SourcesDirectory)/artifacts' + BuildDropPath: '$(System.DefaultWorkingDirectory)/artifacts' jobs: - template: /eng/common/core-templates/job/job.yml @@ -75,7 +75,7 @@ jobs: parameters: is1ESPipeline: false args: - targetPath: '$(Build.SourcesDirectory)\eng\common\BuildConfiguration' + targetPath: '$(System.DefaultWorkingDirectory)\eng\common\BuildConfiguration' artifactName: 'BuildConfiguration' displayName: 'Publish build retry configuration' continueOnError: true diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index a46b6deb7..9b3ad8840 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -42,7 +42,7 @@ [bool]$useInstalledDotNetCli = if (Test-Path variable:useInstalledDotNetCli) { $useInstalledDotNetCli } else { $true } # Enable repos to use a particular version of the on-line dotnet-install scripts. -# default URL: https://dotnet.microsoft.com/download/dotnet/scripts/v1/dotnet-install.ps1 +# default URL: https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.ps1 [string]$dotnetInstallScriptVersion = if (Test-Path variable:dotnetInstallScriptVersion) { $dotnetInstallScriptVersion } else { 'v1' } # True to use global NuGet cache instead of restoring packages to repository-local directory. @@ -262,7 +262,7 @@ function GetDotNetInstallScript([string] $dotnetRoot) { if (!(Test-Path $installScript)) { Create-Directory $dotnetRoot $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit - $uri = "https://dotnet.microsoft.com/download/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.ps1" + $uri = "https://builds.dotnet.microsoft.com/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.ps1" Retry({ Write-Host "GET $uri" @@ -416,7 +416,7 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = # Locate Visual Studio installation or download x-copy msbuild. $vsInfo = LocateVisualStudio $vsRequirements - if ($vsInfo -ne $null) { + if ($vsInfo -ne $null -and $env:ForceUseXCopyMSBuild -eq $null) { # Ensure vsInstallDir has a trailing slash $vsInstallDir = Join-Path $vsInfo.installationPath "\" $vsMajorVersion = $vsInfo.installationVersion.Split('.')[0] diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 1159726a1..01b09b657 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -54,7 +54,7 @@ warn_as_error=${warn_as_error:-true} use_installed_dotnet_cli=${use_installed_dotnet_cli:-true} # Enable repos to use a particular version of the on-line dotnet-install scripts. -# default URL: https://dotnet.microsoft.com/download/dotnet/scripts/v1/dotnet-install.sh +# default URL: https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh dotnetInstallScriptVersion=${dotnetInstallScriptVersion:-'v1'} # True to use global NuGet cache instead of restoring packages to repository-local directory. @@ -295,7 +295,7 @@ function with_retries { function GetDotNetInstallScript { local root=$1 local install_script="$root/dotnet-install.sh" - local install_script_url="https://dotnet.microsoft.com/download/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.sh" + local install_script_url="https://builds.dotnet.microsoft.com/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.sh" if [[ ! -a "$install_script" ]]; then mkdir -p "$root" diff --git a/eng/create-workload-drops.ps1 b/eng/create-workload-drops.ps1 deleted file mode 100644 index c98fd02aa..000000000 --- a/eng/create-workload-drops.ps1 +++ /dev/null @@ -1,91 +0,0 @@ -# Using the downloaded workloads, this creates the VS drops to upload for VS insertion. -# It builds the Microsoft.NET.Workloads.Vsman.vsmanproj per workload ZIP, which creates the appropriate VSMAN file. - -# $workloadPath: The path to the directory containing the workload ZIPs, usually the output path used by DARC in the download-workloads.ps1 script. -# - Example Value: "$(RepoRoot)artifacts\workloads" -# $msBuildToolsPath: The path to the MSBuild tools directory, generally $(MSBuildToolsPath) in MSBuild. -# - Example Value: 'C:\Program Files\Microsoft Visual Studio\2022\Preview\MSBuild\Current\Bin' - -param ([Parameter(Mandatory=$true)] [string] $workloadPath, [Parameter(Mandatory=$true)] [string] $msBuildToolsPath) - -# Extracts the workload drop zips. -$workloads = Get-ChildItem $workloadPath -Include 'Workload.VSDrop.*.zip' -Recurse -$workloadDropPath = (New-Item "$workloadPath\drops" -Type Container -Force).FullName -$null = $workloads | ForEach-Object { Expand-Archive -Path $_.FullName -DestinationPath "$workloadDropPath\$([IO.Path]::GetFileNameWithoutExtension($_.Name))" -Force } - -# Extracts the workload drop metadata from the drop name and builds the .vsmanproj project. -# - full: The full drop name, excluding the 'Workload.VSDrop.' prefix. -# - short: The short name of the drop. Only contains the first word after 'Workload.VSDrop.'. -# - type: Either 'pre.components', 'components', or 'packs'. -$dropInfoRegex = '^Workload\.VSDrop\.(?(?\w*)\..*?(?(pre\.)?components$|packs$))' -$primaryVSComponentJsonValues = '' -$secondaryVSComponentJsonValues = '' -Get-ChildItem -Path $workloadDropPath -Directory | ForEach-Object { - $null = $_.Name -match $dropInfoRegex - $assemblyName = "$($Matches.full)" - $dropDir = "$($_.FullName)\" - - # Hash the files within the drop folder to create a unique identifier that represents this workload drop. - # Example: 1E3EA4FE202394037253F57436A6EAD5DE1359792B618B9072014A98563A30FB - # See: https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/get-filehash#example-4-compute-the-hash-of-a-string - $contentStream = [System.IO.MemoryStream]::new() - $writer = [System.IO.StreamWriter]::new($contentStream) - $dropFiles = Get-ChildItem -Path $dropDir | Sort-Object - # Note: We're using ASCII because when testing between PS 5.1 and PS 7.5, this would result in the same hash. Other encodings arrived at different hashes. - $null = $dropFiles | Get-Content -Encoding ASCII -Raw | ForEach-Object { $writer.Write($_) } - $writer.Flush() - $contentStream.Position = 0 - $dropHash = (Get-FileHash -InputStream $contentStream).Hash - $writer.Close() - - $vsDropName = "Products/dotnet/workloads/$assemblyName/$dropHash" - # Reads the first line out of the .metadata file in the workload's output folder and sets it to the workload version. - $workloadVersion = Get-Content "$dropDir.metadata" -First 1 - # This requires building via MSBuild.exe as there are .NET Framework dependencies necessary for building the .vsmanproj. - # Additionally, even using the MSBuild task won't work as '/restore' must be used for it to restore properly when building the .vsmanproj. - & "$msBuildToolsPath\MSBuild.exe" Microsoft.NET.Workloads.Vsman.vsmanproj /restore /t:Build ` - /p:AssemblyName=$assemblyName ` - /p:VstsDropNames=$vsDropName ` - /p:VsixOutputPath=$dropDir ` - /p:WorkloadVersion=$workloadVersion - - # While in CI, set the variables necessary for uploading the VS drop. - if ($env:TF_BUILD) { - $shortName = "$($Matches.short)" - # Remove the '.' from 'pre.components' - $dropType = $Matches.type.Replace('.', '') - $dropUrl = "https://vsdrop.microsoft.com/file/v1/$vsDropName;$assemblyName.vsman" - - Write-Host "##vso[task.setvariable variable=$($shortName)_$($dropType)_name]$vsDropName" - Write-Host "##vso[task.setvariable variable=$($shortName)_$($dropType)_dir]$dropDir" - Write-Host "##vso[task.setvariable variable=$($shortName)_$($dropType)_url]$dropUrl" - - # Each vsman file is comma-separated. First .vsman is destination and the second is source. - $vsComponentValue = "$assemblyName.vsman{$workloadVersion}=$dropUrl," - # All VS components are added to the primary VS component JSON string. - $primaryVSComponentJsonValues += $vsComponentValue - - # Secondary VS components do not include (pre)components drop types. - if ($dropType -ne 'components' -and $dropType -ne 'precomponents') { - $secondaryVSComponentJsonValues += $vsComponentValue - } - } - - Write-Host '❗ After upload, your workload drop will be available at:' - Write-Host "https://devdiv.visualstudio.com/_apps/hub/ms-vscs-artifact.build-tasks.drop-hub-group-explorer-hub?name=$vsDropName" -} - -# Clean up intermediate build files in the workload drop folders. -$null = Get-ChildItem -Path $workloadDropPath -Include *.json, *.vsmand, files.txt -Recurse | Remove-Item - -# Write the primary and secondary component strings for the vsman files to a variable for the pipeline to use for the VS insertion step. -if ($primaryVSComponentJsonValues) { - # Remove the trailing comma. - $primaryVSComponentJsonValues = $primaryVSComponentJsonValues -replace '.$' - Write-Host "##vso[task.setvariable variable=PrimaryVSComponentJsonValues]$primaryVSComponentJsonValues" -} -if ($secondaryVSComponentJsonValues) { - # Remove the trailing comma. - $secondaryVSComponentJsonValues = $secondaryVSComponentJsonValues -replace '.$' - Write-Host "##vso[task.setvariable variable=SecondaryVSComponentJsonValues]$secondaryVSComponentJsonValues" -} \ No newline at end of file diff --git a/eng/download-workloads.ps1 b/eng/download-workloads.ps1 deleted file mode 100644 index eaa2779da..000000000 --- a/eng/download-workloads.ps1 +++ /dev/null @@ -1,88 +0,0 @@ -# This downloads the workloads using DARC. -# In CI, we need to pass PATs to this, so it runs in Azure Pipelines only (not through MSBuild). -# For local builds, some preconfiguration is necessary. Check the README.md for details. - -# $workloadPath: The path to the directory as output for the workload ZIPs. This is --output-dir in the DARC command. -# - Example Value: "$(RepoRoot)artifacts\workloads" -# $gitHubPat: The GitHub PAT to use for DARC (CI build only). See workload-build.yml for converting the PAT to SecureString. -# $azDOPat: The Azure DevOps PAT to use for DARC (CI build only). See workload-build.yml for converting the PAT to SecureString. -# $workloadListJson: The JSON string of the list of workload drop names to download. If not provided, all workloads found in Version.Details.xml will be downloaded. -# - See the workloadDropNames parameter in official.yml for the list generally passed to this script. -# - Example Value: '{["emsdk","mono"]}' -# $usePreComponents: -# - If $true, includes *pre.components.zip drops and excludes *components.zip drops. -# - If $false, excludes *pre.components.zip drops and includes *components.zip drops. - -param ([Parameter(Mandatory=$true)] [string] $workloadPath, [SecureString] $gitHubPat, [SecureString] $azDOPat, [string] $workloadListJson = '', [bool] $usePreComponents = $false) - -### Local Build ### -# Local build requires the installation of DARC. See: https://github.com/dotnet/arcade/blob/main/Documentation/Darc.md#setting-up-your-darc-client -$darc = 'darc' -$ciArguments = @() -$ci = $gitHubPat -and $azDOPat - -### CI Build ### -if ($ci) { - # Darc access copied from: eng/common/post-build/publish-using-darc.ps1 - $disableConfigureToolsetImport = $true - . $PSScriptRoot\common\tools.ps1 - - $darc = Get-Darc - $gitHubPatPlain = ConvertFrom-SecureString -SecureString $gitHubPat -AsPlainText - $azDOPatPlain = ConvertFrom-SecureString -SecureString $azDOPat -AsPlainText - $ciArguments = @( - '--ci' - '--github-pat' - $gitHubPatPlain - '--azdev-pat' - $azDOPatPlain - ) -} - -# Reads the Version.Details.xml file to get the workload builds. -$versionDetailsPath = (Get-Item "$PSScriptRoot\Version.Details.xml").FullName -$versionDetailsXml = [Xml.XmlDocument](Get-Content $versionDetailsPath) -$versionDetails = $versionDetailsXml.Dependencies.ProductDependencies.Dependency | Select-Object -Property Uri, Sha -Unique - -# Construct the asset filter to only download the required workload drops. -$workloadFilter = '' -if ($workloadListJson) { - $workloadList = ConvertFrom-Json -InputObject $workloadListJson - if ($workloadList.Count -ne 0) { - $workloadFilter = "($($workloadList | Join-String -Separator '|'))" - } -} -# Note: The $ at the end of these filters are required for the positive/negative lookbehinds to function. -# Exclude pre.components.zip. -$componentFilter = '(?- - eng/common/build.ps1 - -restore -build -pack -ci -msbuildEngine vs - -configuration $(_BuildConfig) - /p:DotNetSignType=$(_SignType) - /p:TeamName=$(_TeamName) - displayName: 🟣 Build solution \ No newline at end of file +- template: /eng/pipelines/templates/stages/workload-public-build.yml@eng \ No newline at end of file diff --git a/eng/pipelines/templates/jobs/workload-build.yml b/eng/pipelines/templates/jobs/workload-build.yml deleted file mode 100644 index 2954be136..000000000 --- a/eng/pipelines/templates/jobs/workload-build.yml +++ /dev/null @@ -1,121 +0,0 @@ -parameters: - # These types match the types handled in create-workload-drops.ps1. There is a RegEx in that script that parses the workload type out of the workload path. - # If this list needs to be updated, the RegEx in the script also needs to be updated. - # The hardcoded list here is necessary as these types need to be available during compilation of the pipeline. - # The workload types become separate variables in the create-workload-drops.ps1 and this list is looped over to create multiple drop tasks. - workloadDropTypes: - - components - - packs - - precomponents - -jobs: -# Note: jobs.yml automatically includes the Publish Assets job for pushing the artifacts to DARC. -- template: /eng/common/templates-official/jobs/jobs.yml - parameters: - enableMicrobuild: true - enablePublishBuildAssets: true - enableTelemetry: true - enablePublishUsingPipelines: true - publishAssetsImmediately: true - enableSbom: true - artifacts: - publish: - artifacts: true - logs: true - manifests: true - jobs: - - job: buildRepo - displayName: Build Repo - timeoutInMinutes: 120 - pool: - name: $(DncEngInternalBuildPool) - image: 1es-windows-2022 - os: windows - steps: - - ${{ if eq(parameters.createVSInsertion, true) }}: - - task: AzureCLI@2 - displayName: 🟣 Download workloads for VS insertion - inputs: - azureSubscription: DotNetStaging - scriptType: pscore - scriptPath: $(Build.SourcesDirectory)/eng/download-workloads.ps1 - # Note: The second $ for usePreComponents allows the value to resolve as `$true` or `$false`. - arguments: >- - -workloadPath '$(Build.SourcesDirectory)/artifacts/workloads' - -gitHubPat (ConvertTo-SecureString -String '$(BotAccount-dotnet-bot-repo-PAT)' -AsPlainText -Force) - -azDOPat (ConvertTo-SecureString -String '$(dn-bot-all-drop-rw-code-rw-release-all)' -AsPlainText -Force) - -workloadListJson '${{ convertToJson(parameters.workloadDropNames) }}' - -usePreComponents:$${{ parameters.usePreComponentsForVSInsertion }} - - # https://github.com/dotnet/arcade/blob/ccae251ef033746eb0213329953f5e3c1687693b/Documentation/CorePackages/Publishing.md#basic-onboarding-scenario-for-new-repositories-to-the-current-publishing-version-v3 - - powershell: >- - eng/common/build.ps1 - -restore -build -sign -pack -publish -ci -msbuildEngine vs - -configuration $(_BuildConfig) - /p:CreateVSInsertion=${{ parameters.createVSInsertion }} - /p:WorkloadDirectory=$(Build.SourcesDirectory)/artifacts/workloads - /p:DotNetSignType=$(_SignType) - /p:TeamName=$(_TeamName) - /p:DotNetPublishUsingPipelines=true - /p:OfficialBuildId=$(Build.BuildNumber) - /p:StabilizePackageVersion=${{ parameters.stabilizePackageVersion }} - displayName: 🟣 Build solution - - - ${{ if eq(parameters.publishToFeed, true) }}: - - task: 1ES.PublishNuget@1 - displayName: 🟣 Publish NuGet package - inputs: - useDotNetTask: true - packagesToPush: $(Build.SourcesDirectory)/artifacts/packages/**/*.nupkg - packageParentPath: $(Build.SourcesDirectory)/artifacts/packages - publishVstsFeed: ${{ parameters.feedForPublishing }} - nuGetFeedType: internal - allowPackageConflicts: false - publishPackageMetadata: true - - - ${{ if eq(parameters.createVSInsertion, true) }}: - # The variables comprised of workloadShortName and workloadType are set during create-workload-drops.ps1 in Microsoft.NET.Workloads.Vsman.csproj. - - ${{ each workloadShortName in parameters.workloadDropNames }}: - - ${{ each workloadType in parameters.workloadDropTypes }}: - # Only create the drop if the workload drop directory exists. - # Sets the PublishWorkloadDrop variable. See: https://stackoverflow.com/a/60630739/294804 - - pwsh: | - # If the drop folder doesn't exist (not downloaded via DARC), the drop cannot be published. - if (-not (Test-Path -Path '$(${{ workloadShortName }}_${{ workloadType }}_dir)')) { - Write-Host "##vso[task.setvariable variable=PublishWorkloadDrop]False" - Write-Host 'Drop "${{ workloadShortName }}_${{ workloadType }}" was not downloaded via DARC. Skipping VS drop publish...' - return - } - Write-Host "PublishWorkloadDrop: True" - Write-Host "##vso[task.setvariable variable=PublishWorkloadDrop]True" - displayName: 🟣 Check if ${{ workloadShortName }}_${{ workloadType }} needs published - - # Docs: https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/1es-pipeline-templates/features/outputs/microbuild-vsts-drop - # YAML reference (original task): https://dev.azure.com/devdiv/Engineering/_git/MicroBuild?path=/src/Tasks/UploadDrop/task.json - - task: 1ES.MicroBuildVstsDrop@1 - displayName: '🟣 Publish VS insertion drop: ${{ workloadShortName }}_${{ workloadType }}' - inputs: - dropFolder: $(${{ workloadShortName }}_${{ workloadType }}_dir) - dropName: $(${{ workloadShortName }}_${{ workloadType }}_name) - # See: https://dev.azure.com/devdiv/DevDiv/_wiki/wikis/DevDiv.wiki/35351/Retain-Drops - dropRetentionDays: 183 - accessToken: $(dn-bot-devdiv-drop-rw-code-rw) - skipUploadIfExists: true - condition: eq(variables['PublishWorkloadDrop'], 'True') - - - ${{ each primaryInsertionBranch in parameters.primaryVsInsertionBranches }}: - # One PR is created per branch defined at the top of this file in the primaryVsInsertionBranches parameter. - - template: /eng/pipelines/templates/steps/workload-insertion.yml@self - parameters: - targetBranch: ${{ primaryInsertionBranch }} - topicBranch: ${{ parameters.vsTopicBranch }} - # PrimaryVSComponentJsonValues variable is set during create-workload-drops.ps1 in Microsoft.NET.Workloads.Vsman.csproj. - componentJsonValues: $(PrimaryVSComponentJsonValues) - - ${{ each secondaryInsertionBranch in parameters.secondaryVsInsertionBranches }}: - # One PR is created per branch defined at the top of this file in the secondaryVsInsertionBranches parameter. - - template: /eng/pipelines/templates/steps/workload-insertion.yml@self - parameters: - targetBranch: ${{ secondaryInsertionBranch }} - topicBranch: ${{ parameters.vsTopicBranch }} - # SecondaryVSComponentJsonValues variable is set during create-workload-drops.ps1 in Microsoft.NET.Workloads.Vsman.csproj. - componentJsonValues: $(SecondaryVSComponentJsonValues) \ No newline at end of file diff --git a/eng/pipelines/templates/steps/workload-insertion.yml b/eng/pipelines/templates/steps/workload-insertion.yml deleted file mode 100644 index 4876a777a..000000000 --- a/eng/pipelines/templates/steps/workload-insertion.yml +++ /dev/null @@ -1,51 +0,0 @@ -parameters: - targetBranch: main - topicBranch: '' - componentJsonValues: '' - -steps: -# This allows setting the InsertionTopicBranch variable dynamically. -# |default| represents normal operation, set to: temp/{team}/{target}/yyyy-MM -# |temp| is only for pipeline testing, set to: temp/{team}/{target}/BuildNumber-JobAttempt -- pwsh: | - $topicBranch = '${{ parameters.topicBranch }}' - if ($topicBranch -eq '|default|') { - # Starting with 'temp' allows this branch to be cleaned up automatically by the VS repo branch policies. - $topicBranch = "temp/$(_TeamName)/${{ parameters.targetBranch }}/$((Get-Date).ToString('yyyy-MM'))" - } - # Loosely based on: - # https://devdiv.visualstudio.com/Engineering/_git/MicroBuild?path=/src/Tasks/InsertVsPayload/plugin.ps1&version=GCf10314b240d5f3d0899e80eb2feb5dc33b5f8c20&line=276&lineEnd=280&lineStartColumn=1&lineEndColumn=1&lineStyle=plain&_a=contents - if ($topicBranch -eq '|temp|') { - $topicBranch = 'temp/$(_TeamName)/${{ parameters.targetBranch }}/$(Build.BuildNumber)-$(System.JobAttempt)' - } - Write-Host "InsertionTopicBranch: $topicBranch" - Write-Host "##vso[task.setvariable variable=InsertionTopicBranch]$topicBranch" - displayName: 🟣 Set InsertionTopicBranch variable -# Creates VS insertion PRs using the VS drops containing the workloads and vsman files. -# Documentation: https://devdiv.visualstudio.com/DevDiv/_wiki/wikis/DevDiv.wiki/635/Overview?anchor=**build-pipeline** -# YAML reference: https://dev.azure.com/devdiv/Engineering/_git/MicroBuild?path=/src/Tasks/InsertVsPayload/task.json -- task: MicroBuildInsertVsPayload@5 - displayName: '🟣 Create VS insertion: ${{ parameters.targetBranch }}' - inputs: - # Connection: https://dnceng.visualstudio.com/internal/_settings/adminservices?resourceId=5708f1c1-8fb7-4722-a643-020cf89ee26f - # Docs: https://devdiv.visualstudio.com/DevDiv/_wiki/wikis/DevDiv.wiki/40477/Insert-with-a-WIF-Service-Connection - ConnectedServiceName: MicroBuildInsertionVS - TargetBranch: ${{ parameters.targetBranch }} - InsertionTopicBranch: $(InsertionTopicBranch) - TeamName: $(_TeamName) - TeamEmail: dotnetdevexcli@microsoft.com - InsertionPayloadName: 'DotNet-SDK-Workloads ($(Build.SourceBranchName):$(Build.BuildNumber))' - ComponentJsonValues: ${{ parameters.componentJsonValues }} - AllowTopicBranchUpdate: true - # This is the name of our DevDiv alias. - InsertionReviewers: Dotnet Core SDK and CLI - InsertionBuildPolicies: Request Perf DDRITs - # Documentation: https://devdiv.visualstudio.com/DevDiv/_wiki/wikis/DevDiv.wiki/631/Copy-Commit-Details-to-PR - AddCommitsToPR: true - # Documentation: https://devdiv.visualstudio.com/DevDiv/_wiki/wikis/DevDiv.wiki/634/Link-Work-Items-to-PR - LinkWorkItemsToPR: false - # Documentation: https://devdiv.visualstudio.com/DevDiv/_wiki/wikis/DevDiv.wiki/638/Set-AutoComplete-on-an-Insertion - InsertAutoComplete: true - env: - # This is required. See: https://devdiv.visualstudio.com/DevDiv/_wiki/wikis/DevDiv.wiki/40477/Insert-with-a-WIF-Service-Connection?anchor=steps-to-use-a-wif-service-connection-in-the-insert-vs-task - SYSTEM_ACCESSTOKEN: $(System.AccessToken) \ No newline at end of file diff --git a/global.json b/global.json index afecb397d..61115d92b 100644 --- a/global.json +++ b/global.json @@ -1,11 +1,11 @@ { "tools": { - "dotnet": "9.0.102" + "dotnet": "9.0.111" }, "msbuild-sdks": { "Microsoft.Build.NoTargets": "3.7.0", - "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.25077.4", - "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.23552.3" + "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.25515.2", + "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.23552.3", "Microsoft.VisualStudio.Internal.MicroBuild.Vsman": "2.0.174" } -} \ No newline at end of file +} diff --git a/src/GenerateTestWorkloadSets/GenerateTestWorkloadSets.csproj b/src/GenerateTestWorkloadSets/GenerateTestWorkloadSets.csproj deleted file mode 100644 index 246bc2d99..000000000 --- a/src/GenerateTestWorkloadSets/GenerateTestWorkloadSets.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - Exe - net9.0 - enable - annotations - - - - - - - diff --git a/src/GenerateTestWorkloadSets/Program.cs b/src/GenerateTestWorkloadSets/Program.cs deleted file mode 100644 index 9d394baff..000000000 --- a/src/GenerateTestWorkloadSets/Program.cs +++ /dev/null @@ -1,45 +0,0 @@ -// See https://aka.ms/new-console-template for more information -using GenerateTestWorkloadSets; -using System.Text; - -List workloadSetsToCreate = [ - new WorkloadSetInfo("9.0.100", ReleasedWorkloadVersions.Rollback9_0_100_preview7_24414_1), - new WorkloadSetInfo("9.0.101-servicing.preview.1", ReleasedWorkloadVersions.Rollback9_0_100_preview7_and_rc1), - new WorkloadSetInfo("9.0.101", ReleasedWorkloadVersions.Rollback9_0_100_rc1_24453_3) - ]; - -StringBuilder buildScript = new StringBuilder(); - -foreach (var workloadSetInfo in workloadSetsToCreate) -{ - ProcessWorkloadSet(workloadSetInfo, buildScript, Environment.CurrentDirectory); -} - -buildScript.AppendLine("@echo Done"); - -buildScript.AppendLine(); -buildScript.AppendLine(":End"); - - -var buildScriptPath = Path.GetFullPath("buildWorkloads.bat"); - -File.WriteAllText(buildScriptPath, buildScript.ToString()); - -Console.WriteLine("Build script path: " + buildScriptPath); - - -void ProcessWorkloadSet(WorkloadSetInfo workloadSetInfo, StringBuilder buildScript, string outputPath) -{ - string workloadsPropsOutput = Path.Combine(outputPath, $"workloads-{workloadSetInfo.WorkloadSetVersion}.props"); - File.WriteAllText(workloadsPropsOutput, workloadSetInfo.ToWorkloadsProps()); - - List buildArgs = [ - ..WorkloadSetProperties.CreateFromWorkloadSetVersion(workloadSetInfo.WorkloadSetVersion).CreateCommandLineArgs(), - $"/p:WorkloadsProps={workloadsPropsOutput}", - ]; - - buildScript.AppendLine("@echo Building workload set " + workloadSetInfo.WorkloadSetVersion); - buildScript.AppendLine("call build -bl " + string.Join(' ', buildArgs)); - buildScript.AppendLine("IF ERRORLEVEL 1 GOTO END"); - buildScript.AppendLine(); -} \ No newline at end of file diff --git a/src/GenerateTestWorkloadSets/ReleasedWorkloadVersions.cs b/src/GenerateTestWorkloadSets/ReleasedWorkloadVersions.cs deleted file mode 100644 index 846073835..000000000 --- a/src/GenerateTestWorkloadSets/ReleasedWorkloadVersions.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace GenerateTestWorkloadSets -{ - internal class ReleasedWorkloadVersions - { - public static string Rollback9_0_100_preview7_24414_1 = """ - { - "Microsoft.NET.Workload.Emscripten.Current": "9.0.0-preview.7.24373.5/9.0.100-preview.7", - "Microsoft.NET.Workload.Emscripten.net6": "9.0.0-preview.7.24373.5/9.0.100-preview.7", - "Microsoft.NET.Workload.Emscripten.net7": "9.0.0-preview.7.24373.5/9.0.100-preview.7", - "Microsoft.NET.Workload.Emscripten.net8": "9.0.0-preview.7.24373.5/9.0.100-preview.7", - "Microsoft.NET.Sdk.Android": "35.0.0-preview.7.41/9.0.100-preview.7", - "Microsoft.NET.Sdk.iOS": "17.5.9231-net9-p7/9.0.100-preview.7", - "Microsoft.NET.Sdk.MacCatalyst": "17.5.9231-net9-p7/9.0.100-preview.7", - "Microsoft.NET.Sdk.macOS": "14.5.9231-net9-p7/9.0.100-preview.7", - "Microsoft.NET.Sdk.Maui": "9.0.0-preview.7.24407.4/9.0.100-preview.7", - "Microsoft.NET.Sdk.tvOS": "17.5.9231-net9-p7/9.0.100-preview.7", - "Microsoft.NET.Workload.Mono.ToolChain.Current": "9.0.0-preview.7.24405.7/9.0.100-preview.7", - "Microsoft.NET.Workload.Mono.ToolChain.net6": "9.0.0-preview.7.24405.7/9.0.100-preview.7", - "Microsoft.NET.Workload.Mono.ToolChain.net7": "9.0.0-preview.7.24405.7/9.0.100-preview.7", - "Microsoft.NET.Workload.Mono.ToolChain.net8": "9.0.0-preview.7.24405.7/9.0.100-preview.7", - "Microsoft.NET.Sdk.Aspire": "8.1.0/8.0.100" - } - """; - - // A combination of preview 7 and rc1 manifest versions - public static string Rollback9_0_100_preview7_and_rc1 = """ - { - "Microsoft.NET.Workload.Emscripten.Current": "9.0.0-preview.7.24373.5/9.0.100-preview.7", - "Microsoft.NET.Workload.Emscripten.net6": "9.0.0-preview.7.24373.5/9.0.100-preview.7", - "Microsoft.NET.Workload.Emscripten.net7": "9.0.0-preview.7.24373.5/9.0.100-preview.7", - "Microsoft.NET.Workload.Emscripten.net8": "9.0.0-preview.7.24373.5/9.0.100-preview.7", - "Microsoft.NET.Sdk.Android": "35.0.0-preview.7.41/9.0.100-preview.7", - "Microsoft.NET.Sdk.iOS": "17.5.9231-net9-p7/9.0.100-preview.7", - "Microsoft.NET.Sdk.MacCatalyst": "17.5.9231-net9-p7/9.0.100-preview.7", - "Microsoft.NET.Sdk.macOS": "14.5.9231-net9-p7/9.0.100-preview.7", - "Microsoft.NET.Sdk.Maui": "9.0.0-preview.7.24407.4/9.0.100-preview.7", - "Microsoft.NET.Sdk.tvOS": "17.5.9231-net9-p7/9.0.100-preview.7", - "Microsoft.NET.Workload.Mono.ToolChain.Current": "9.0.0-preview.7.24405.7/9.0.100-preview.7", - "Microsoft.NET.Workload.Mono.ToolChain.net6": "9.0.0-preview.7.24405.7/9.0.100-preview.7", - "Microsoft.NET.Workload.Mono.ToolChain.net7": "9.0.0-preview.7.24405.7/9.0.100-preview.7", - "Microsoft.NET.Workload.Mono.ToolChain.net8": "9.0.0-preview.7.24405.7/9.0.100-preview.7", - "Microsoft.NET.Sdk.Aspire": "8.2.0/8.0.100" - } - """; - - public static string Rollback9_0_100_rc1_24453_3 = """ - { - "Microsoft.NET.Workload.Emscripten.Current": "9.0.0-rc.1.24430.3/9.0.100-rc.1", - "Microsoft.NET.Workload.Emscripten.net6": "9.0.0-rc.1.24430.3/9.0.100-rc.1", - "Microsoft.NET.Workload.Emscripten.net7": "9.0.0-rc.1.24430.3/9.0.100-rc.1", - "Microsoft.NET.Workload.Emscripten.net8": "9.0.0-rc.1.24430.3/9.0.100-rc.1", - "Microsoft.NET.Sdk.Android": "35.0.0-rc.1.80/9.0.100-rc.1", - "Microsoft.NET.Sdk.iOS": "17.5.9270-net9-rc1/9.0.100-rc.1", - "Microsoft.NET.Sdk.MacCatalyst": "17.5.9270-net9-rc1/9.0.100-rc.1", - "Microsoft.NET.Sdk.macOS": "14.5.9270-net9-rc1/9.0.100-rc.1", - "Microsoft.NET.Sdk.Maui": "9.0.0-rc.1.24453.9/9.0.100-rc.1", - "Microsoft.NET.Sdk.tvOS": "17.5.9270-net9-rc1/9.0.100-rc.1", - "Microsoft.NET.Workload.Mono.ToolChain.Current": "9.0.0-rc.1.24431.7/9.0.100-rc.1", - "Microsoft.NET.Workload.Mono.ToolChain.net6": "9.0.0-rc.1.24431.7/9.0.100-rc.1", - "Microsoft.NET.Workload.Mono.ToolChain.net7": "9.0.0-rc.1.24431.7/9.0.100-rc.1", - "Microsoft.NET.Workload.Mono.ToolChain.net8": "9.0.0-rc.1.24431.7/9.0.100-rc.1", - "Microsoft.NET.Sdk.Aspire": "8.2.0/8.0.100" - } - """; - } -} diff --git a/src/GenerateTestWorkloadSets/SdkFeatureBand.cs b/src/GenerateTestWorkloadSets/SdkFeatureBand.cs deleted file mode 100644 index 336f5d0f1..000000000 --- a/src/GenerateTestWorkloadSets/SdkFeatureBand.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Deployment.DotNet.Releases; - -namespace Microsoft.NET.Sdk.WorkloadManifestReader -{ - public struct SdkFeatureBand : IEquatable, IComparable - { - private ReleaseVersion _featureBand; - - public SdkFeatureBand(string? version) : this(new ReleaseVersion(version) ?? throw new ArgumentNullException(nameof(version))) { } - - public SdkFeatureBand(ReleaseVersion version) - { - var fullVersion = version ?? throw new ArgumentNullException(nameof(version)); - if (string.IsNullOrEmpty(version.Prerelease) || version.Prerelease.Contains("dev") || version.Prerelease.Contains("ci") || version.Prerelease.Contains("rtm")) - { - _featureBand = new ReleaseVersion(fullVersion.Major, fullVersion.Minor, fullVersion.SdkFeatureBand); - } - else - { - // Treat preview versions as their own feature bands - var prereleaseComponents = fullVersion.Prerelease.Split('.'); - var formattedPrerelease = prereleaseComponents.Length > 1 ? - $"{prereleaseComponents[0]}.{prereleaseComponents[1]}" - : prereleaseComponents[0]; - _featureBand = new ReleaseVersion(fullVersion.Major, fullVersion.Minor, fullVersion.SdkFeatureBand, formattedPrerelease); - } - } - - public int Major => _featureBand.Major; - public int Minor => _featureBand.Minor; - - public bool Equals(SdkFeatureBand other) - { - return _featureBand.Equals(other._featureBand); - } - - public int CompareTo(SdkFeatureBand other) - { - return _featureBand.CompareTo(other._featureBand); - } - - public override bool Equals(object? obj) - { - return obj is SdkFeatureBand featureBand && Equals(featureBand); - } - - public override int GetHashCode() - { - return _featureBand.GetHashCode(); - } - - public override string ToString() - { - return _featureBand.ToString(); - } - - public string ToStringWithoutPrerelease() - { - return new ReleaseVersion(_featureBand.Major, _featureBand.Minor, _featureBand.SdkFeatureBand).ToString(); - } - - public static bool operator >(SdkFeatureBand a, SdkFeatureBand b) => a.CompareTo(b) > 0; - - public static bool operator <(SdkFeatureBand a, SdkFeatureBand b) => a.CompareTo(b) < 0; - } -} diff --git a/src/GenerateTestWorkloadSets/WorkloadSetInfo.cs b/src/GenerateTestWorkloadSets/WorkloadSetInfo.cs deleted file mode 100644 index 5928db347..000000000 --- a/src/GenerateTestWorkloadSets/WorkloadSetInfo.cs +++ /dev/null @@ -1,129 +0,0 @@ -using Microsoft.DotNet.Workloads.Workload; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.Json; -using System.Threading.Tasks; - -namespace GenerateTestWorkloadSets -{ - internal class WorkloadSetInfo - { - - public string WorkloadSetVersion { get; set; } - - - public List Manifests { get; set; } = new(); - - public WorkloadSetInfo() - { - - } - - public WorkloadSetInfo(string workloadSetVersion, string rollbackJson) - { - WorkloadSetVersion = workloadSetVersion; - LoadManifests(rollbackJson); - } - - public void LoadManifests(string rollbackJson) - { - Manifests.Clear(); - - var jsonDictionary = JsonSerializer.Deserialize>(rollbackJson); - - foreach (var kvp in jsonDictionary) - { - string name = kvp.Key; - var valueParts = kvp.Value.Split('/'); - string version = valueParts[0]; - string featureBand = valueParts[1]; - - Manifests.Add(new WorkloadManifestInfo(name, featureBand, version)); - } - } - - public string ToWorkloadsProps() - { - StringBuilder sb = new StringBuilder(); - - sb.AppendLine(""); - sb.AppendLine(" "); - foreach (var manifest in Manifests) - { - sb.AppendLine($""" """); - } - sb.AppendLine(" "); - sb.AppendLine(""); - - return sb.ToString(); - } - } - - internal class WorkloadSetProperties - { - public string WorkloadSetVersion { get; set; } - public string VersionMajor { get; set; } - public string VersionMinor { get; set; } - public string VersionSdkMinor { get; set; } - public string VersionFeature { get; set; } - public string VersionPatch { get; set; } - public string SdkFeatureBand { get; set; } - - public string Version { get; set; } - - public static WorkloadSetProperties CreateFromWorkloadSetVersion(string workloadSetVersion) - { - WorkloadSetProperties ret = new WorkloadSetProperties(); - ret.WorkloadSetVersion = workloadSetVersion; - - string[] sections = workloadSetVersion.Split(new char[] { '-', '+' }, 2); - string versionCore = sections[0]; - string? preReleaseOrBuild = sections.Length > 1 ? sections[1] : null; - - string[] coreComponents = versionCore.Split('.'); - string major = coreComponents[0]; - string minor = coreComponents[1]; - string patch = coreComponents[2]; - - ret.VersionMajor = major; - ret.VersionMinor = minor; - ret.VersionSdkMinor = (int.Parse(patch) / 100).ToString(); - ret.VersionFeature = (int.Parse(patch) % 100).ToString("d2"); - - if (coreComponents.Length == 3) - { - ret.VersionPatch = "0"; - } - else - { - ret.VersionPatch = coreComponents[3]; - } - - ret.SdkFeatureBand = Microsoft.DotNet.Workloads.Workload.WorkloadSetVersion.GetFeatureBand(workloadSetVersion).ToString(); - ret.Version = Microsoft.DotNet.Workloads.Workload.WorkloadSetVersion.ToWorkloadSetPackageVersion(workloadSetVersion, out _); - - return ret; - } - - public string[] CreateCommandLineArgs() - { - return - [ - $"/p:VersionMajor={VersionMajor}", - $"/p:VersionMinor={VersionMinor}", - $"/p:VersionSdkMinor={VersionSdkMinor}", - $"/p:VersionFeature={VersionFeature}", - $"/p:VersionPatch={VersionPatch}", - $"/p:Version={Version}", - $"/p:SdkFeatureBand={SdkFeatureBand}", - $"/p:WorkloadsVersion={WorkloadSetVersion}", - ]; - } - - } - - internal record WorkloadManifestInfo(string Name, string FeatureBand, string Version); - -} diff --git a/src/GenerateTestWorkloadSets/WorkloadSetVersion.cs b/src/GenerateTestWorkloadSets/WorkloadSetVersion.cs deleted file mode 100644 index 2057b0620..000000000 --- a/src/GenerateTestWorkloadSets/WorkloadSetVersion.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Deployment.DotNet.Releases; -using Microsoft.NET.Sdk.WorkloadManifestReader; - -namespace Microsoft.DotNet.Workloads.Workload -{ - static class WorkloadSetVersion - { - public static string ToWorkloadSetPackageVersion(string workloadSetVersion, out SdkFeatureBand sdkFeatureBand) - { - string[] sections = workloadSetVersion.Split(new char[] { '-', '+' }, 2); - string versionCore = sections[0]; - string? preReleaseOrBuild = sections.Length > 1 ? sections[1] : null; - - string[] coreComponents = versionCore.Split('.'); - string major = coreComponents[0]; - string minor = coreComponents[1]; - string patch = coreComponents[2]; - - string packageVersion = $"{major}.{patch}."; - if (coreComponents.Length == 3) - { - // No workload set patch version - packageVersion += "0"; - - // Use preview specifier (if any) from workload set version as part of SDK feature band - sdkFeatureBand = new SdkFeatureBand(workloadSetVersion); - } - else - { - // Workload set version has workload patch version (ie 4 components) - packageVersion += coreComponents[3]; - - // Don't include any preview specifiers in SDK feature band - sdkFeatureBand = new SdkFeatureBand($"{major}.{minor}.{patch}"); - } - - if (preReleaseOrBuild != null) - { - // Figure out if we split on a '-' or '+' - char separator = workloadSetVersion[sections[0].Length]; - packageVersion += separator + preReleaseOrBuild; - } - - return packageVersion; - } - - public static SdkFeatureBand GetFeatureBand(string workloadSetVersion) - { - ToWorkloadSetPackageVersion(workloadSetVersion, out SdkFeatureBand sdkFeatureBand); - return sdkFeatureBand; - } - - public static string FromWorkloadSetPackageVersion(SdkFeatureBand sdkFeatureBand, string packageVersion) - { - var releaseVersion = new ReleaseVersion(packageVersion); - var patch = releaseVersion.Patch > 0 ? $".{releaseVersion.Patch}" : string.Empty; - var release = string.IsNullOrWhiteSpace(releaseVersion.Prerelease) ? string.Empty : $"-{releaseVersion.Prerelease}"; - return $"{sdkFeatureBand.Major}.{sdkFeatureBand.Minor}.{releaseVersion.Minor}{patch}{release}"; - } - } -} diff --git a/src/Microsoft.NET.Workloads.Vsman/Microsoft.NET.Workloads.Vsman.csproj b/src/Microsoft.NET.Workloads.Vsman/Microsoft.NET.Workloads.Vsman.csproj deleted file mode 100644 index b10244922..000000000 --- a/src/Microsoft.NET.Workloads.Vsman/Microsoft.NET.Workloads.Vsman.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - - - $(SdkTargetFramework) - - - - - - - $(ArtifactsDir)workloads\ - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.NET.Workloads.Vsman/Microsoft.NET.Workloads.Vsman.vsmanproj b/src/Microsoft.NET.Workloads.Vsman/Microsoft.NET.Workloads.Vsman.vsmanproj deleted file mode 100644 index b137e463a..000000000 --- a/src/Microsoft.NET.Workloads.Vsman/Microsoft.NET.Workloads.Vsman.vsmanproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - $(SdkTargetFramework) - - - - - - - - - - - $(WorkloadVersion) - - - - \ No newline at end of file diff --git a/src/Microsoft.NET.Workloads/Microsoft.NET.Workloads.csproj b/src/Microsoft.NET.Workloads/Microsoft.NET.Workloads.csproj deleted file mode 100644 index 73227f5d4..000000000 --- a/src/Microsoft.NET.Workloads/Microsoft.NET.Workloads.csproj +++ /dev/null @@ -1,162 +0,0 @@ - - - - - $(SdkTargetFramework) - - true - - - true - - - true - $(MSBuildProjectName).$(SDKFeatureBand) - - - README.md - $(IntermediateOutputPath)README.md - - - LGHT1105 - - - - - - - - - - - - - $(PkgMicrosoft_Signed_Wix)\tools - $(PkgMicrosoft_VisualStudioEng_MicroBuild_Plugins_SwixBuild) - $(SwixPluginPath)\build\Microsoft.VisualStudioEng.MicroBuild.Plugins.SwixBuild.targets - $(ArtifactsObjDir)workloads/ - $(ArtifactsBinDir)workloads/ - $(WorkloadIntermediateOutputPath)VS/ - - - - - - $(ArtifactsObjDir)/LightCommandPackages - - $(ArtifactsNonShippingPackagesDir) - - - - - - - - - - workloads.props - - - - - - - - - @(WorkloadManifest->'%20%20"%(Identity)": "%(Version)/%(FeatureBand)"', ',;') - - - - - - - 5 - - 1996-04-01 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_WixObj Include="$(_WixObjDir)\**\*.wixobj" /> - - - - - - - - diff --git a/src/Microsoft.NET.Workloads/README.md b/src/Microsoft.NET.Workloads/README.md deleted file mode 100644 index a2bba031b..000000000 --- a/src/Microsoft.NET.Workloads/README.md +++ /dev/null @@ -1,3 +0,0 @@ -## .NET SDK Workload Versions manifest - -This package contains .NET SDK Workloads version {SDKWVersion}. This package is not meant to be directly referenced but instead used with the .NET SDK CLI. \ No newline at end of file diff --git a/src/Microsoft.NET.Workloads/workloads.props b/src/Microsoft.NET.Workloads/workloads.props deleted file mode 100644 index 06bcf762d..000000000 --- a/src/Microsoft.NET.Workloads/workloads.props +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/workload-versions.sln b/workload-versions.sln deleted file mode 100644 index cd44f22f3..000000000 --- a/workload-versions.sln +++ /dev/null @@ -1,42 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.7.33920.267 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.NET.Workloads", "src\Microsoft.NET.Workloads\Microsoft.NET.Workloads.csproj", "{7EDB5924-188D-472F-B95B-C5BF6461DB41}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GenerateTestWorkloadSets", "src\GenerateTestWorkloadSets\GenerateTestWorkloadSets.csproj", "{55BC9CC1-37A9-4472-B1FE-6B4B94DAA363}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{BF919689-7AF6-4B39-B6C8-0D5ADFE3D484}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.NET.Workloads.Vsman", "src\Microsoft.NET.Workloads.Vsman\Microsoft.NET.Workloads.Vsman.csproj", "{083601A3-E571-454B-809C-7DCA8D535EFF}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7EDB5924-188D-472F-B95B-C5BF6461DB41}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7EDB5924-188D-472F-B95B-C5BF6461DB41}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7EDB5924-188D-472F-B95B-C5BF6461DB41}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7EDB5924-188D-472F-B95B-C5BF6461DB41}.Release|Any CPU.Build.0 = Release|Any CPU - {55BC9CC1-37A9-4472-B1FE-6B4B94DAA363}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {55BC9CC1-37A9-4472-B1FE-6B4B94DAA363}.Debug|Any CPU.Build.0 = Debug|Any CPU - {55BC9CC1-37A9-4472-B1FE-6B4B94DAA363}.Release|Any CPU.ActiveCfg = Release|Any CPU - {55BC9CC1-37A9-4472-B1FE-6B4B94DAA363}.Release|Any CPU.Build.0 = Release|Any CPU - {083601A3-E571-454B-809C-7DCA8D535EFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {083601A3-E571-454B-809C-7DCA8D535EFF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {083601A3-E571-454B-809C-7DCA8D535EFF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {083601A3-E571-454B-809C-7DCA8D535EFF}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {DAEFAB38-2A02-457B-A3D1-3575DF493CE1} - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {083601A3-E571-454B-809C-7DCA8D535EFF} = {BF919689-7AF6-4B39-B6C8-0D5ADFE3D484} - EndGlobalSection -EndGlobal