update arcade to 7.0.0-beta.22179.1 (#989)
This commit is contained in:
Родитель
117174304b
Коммит
f486e1ae0c
|
@ -302,6 +302,7 @@ stages:
|
|||
- ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
|
||||
- template: eng/common/templates/post-build/post-build.yml
|
||||
parameters:
|
||||
publishingInfraVersion: 3
|
||||
# Symbol validation is not entirely reliable as of yet, so should be turned off until https://github.com/dotnet/arcade/issues/2871 is resolved.
|
||||
enableSymbolValidation: false
|
||||
# SourceLink improperly looks for generated files. See https://github.com/dotnet/arcade/issues/3069
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<packageSources>
|
||||
<add key="dotnet-core" value="https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json" />
|
||||
</packageSources>
|
||||
<packageRestore>
|
||||
<add key="enabled" value="True" />
|
||||
<add key="automatic" value="True" />
|
||||
</packageRestore>
|
||||
</configuration>
|
|
@ -0,0 +1,5 @@
|
|||
<Project>
|
||||
<PropertyGroup>
|
||||
<PublishingVersion>3</PublishingVersion>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -3,9 +3,9 @@
|
|||
<ProductDependencies>
|
||||
</ProductDependencies>
|
||||
<ToolsetDependencies>
|
||||
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="1.0.0-beta.20570.10">
|
||||
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="7.0.0-beta.22179.1">
|
||||
<Uri>https://github.com/dotnet/arcade</Uri>
|
||||
<Sha>1ceac96c54fcf33eb745649c4e7b8d7507a9b730</Sha>
|
||||
<Sha>1527dc867ccb652def4c0f57fbd2ebbed3a94019</Sha>
|
||||
</Dependency>
|
||||
</ToolsetDependencies>
|
||||
</Dependencies>
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
@echo off
|
||||
@echo off
|
||||
powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0Build.ps1""" -restore -build -test -sign -pack -publish -ci %*"
|
|
@ -1,158 +0,0 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where NuGet packages to be checked are stored
|
||||
[Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation
|
||||
[Parameter(Mandatory=$true)][string] $SymbolToolPath # Full path to directory where dotnet symbol-tool was installed
|
||||
)
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
function FirstMatchingSymbolDescriptionOrDefault {
|
||||
param(
|
||||
[string] $FullPath, # Full path to the module that has to be checked
|
||||
[string] $TargetServerParam, # Parameter to pass to `Symbol Tool` indicating the server to lookup for symbols
|
||||
[string] $SymbolsPath
|
||||
)
|
||||
|
||||
$FileName = [System.IO.Path]::GetFileName($FullPath)
|
||||
$Extension = [System.IO.Path]::GetExtension($FullPath)
|
||||
|
||||
# Those below are potential symbol files that the `dotnet symbol` might
|
||||
# return. Which one will be returned depend on the type of file we are
|
||||
# checking and which type of file was uploaded.
|
||||
|
||||
# The file itself is returned
|
||||
$SymbolPath = $SymbolsPath + "\" + $FileName
|
||||
|
||||
# PDB file for the module
|
||||
$PdbPath = $SymbolPath.Replace($Extension, ".pdb")
|
||||
|
||||
# PDB file for R2R module (created by crossgen)
|
||||
$NGenPdb = $SymbolPath.Replace($Extension, ".ni.pdb")
|
||||
|
||||
# DBG file for a .so library
|
||||
$SODbg = $SymbolPath.Replace($Extension, ".so.dbg")
|
||||
|
||||
# DWARF file for a .dylib
|
||||
$DylibDwarf = $SymbolPath.Replace($Extension, ".dylib.dwarf")
|
||||
|
||||
.\dotnet-symbol.exe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath | Out-Null
|
||||
|
||||
if (Test-Path $PdbPath) {
|
||||
return "PDB"
|
||||
}
|
||||
elseif (Test-Path $NGenPdb) {
|
||||
return "NGen PDB"
|
||||
}
|
||||
elseif (Test-Path $SODbg) {
|
||||
return "DBG for SO"
|
||||
}
|
||||
elseif (Test-Path $DylibDwarf) {
|
||||
return "Dwarf for Dylib"
|
||||
}
|
||||
elseif (Test-Path $SymbolPath) {
|
||||
return "Module"
|
||||
}
|
||||
else {
|
||||
return $null
|
||||
}
|
||||
}
|
||||
|
||||
function CountMissingSymbols {
|
||||
param(
|
||||
[string] $PackagePath # Path to a NuGet package
|
||||
)
|
||||
|
||||
# Ensure input file exist
|
||||
if (!(Test-Path $PackagePath)) {
|
||||
throw "Input file does not exist: $PackagePath"
|
||||
}
|
||||
|
||||
# Extensions for which we'll look for symbols
|
||||
$RelevantExtensions = @(".dll", ".exe", ".so", ".dylib")
|
||||
|
||||
# How many files are missing symbol information
|
||||
$MissingSymbols = 0
|
||||
|
||||
$PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath)
|
||||
$PackageGuid = New-Guid
|
||||
$ExtractPath = Join-Path -Path $ExtractPath -ChildPath $PackageGuid
|
||||
$SymbolsPath = Join-Path -Path $ExtractPath -ChildPath "Symbols"
|
||||
|
||||
[System.IO.Compression.ZipFile]::ExtractToDirectory($PackagePath, $ExtractPath)
|
||||
|
||||
# Makes easier to reference `symbol tool`
|
||||
Push-Location $SymbolToolPath
|
||||
|
||||
Get-ChildItem -Recurse $ExtractPath |
|
||||
Where-Object {$RelevantExtensions -contains $_.Extension} |
|
||||
ForEach-Object {
|
||||
if ($_.FullName -Match "\\ref\\") {
|
||||
Write-Host "`t Ignoring reference assembly file" $_.FullName
|
||||
return
|
||||
}
|
||||
|
||||
$SymbolsOnMSDL = FirstMatchingSymbolDescriptionOrDefault $_.FullName "--microsoft-symbol-server" $SymbolsPath
|
||||
$SymbolsOnSymWeb = FirstMatchingSymbolDescriptionOrDefault $_.FullName "--internal-server" $SymbolsPath
|
||||
|
||||
Write-Host -NoNewLine "`t Checking file" $_.FullName "... "
|
||||
|
||||
if ($SymbolsOnMSDL -ne $null -and $SymbolsOnSymWeb -ne $null) {
|
||||
Write-Host "Symbols found on MSDL (" $SymbolsOnMSDL ") and SymWeb (" $SymbolsOnSymWeb ")"
|
||||
}
|
||||
else {
|
||||
$MissingSymbols++
|
||||
|
||||
if ($SymbolsOnMSDL -eq $null -and $SymbolsOnSymWeb -eq $null) {
|
||||
Write-Host "No symbols found on MSDL or SymWeb!"
|
||||
}
|
||||
else {
|
||||
if ($SymbolsOnMSDL -eq $null) {
|
||||
Write-Host "No symbols found on MSDL!"
|
||||
}
|
||||
else {
|
||||
Write-Host "No symbols found on SymWeb!"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Pop-Location
|
||||
|
||||
return $MissingSymbols
|
||||
}
|
||||
|
||||
function CheckSymbolsAvailable {
|
||||
if (Test-Path $ExtractPath) {
|
||||
Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
Get-ChildItem "$InputPath\*.nupkg" |
|
||||
ForEach-Object {
|
||||
$FileName = $_.Name
|
||||
|
||||
# These packages from Arcade-Services include some native libraries that
|
||||
# our current symbol uploader can't handle. Below is a workaround until
|
||||
# we get issue: https://github.com/dotnet/arcade/issues/2457 sorted.
|
||||
if ($FileName -Match "Microsoft\.DotNet\.Darc\.") {
|
||||
Write-Host "Ignoring Arcade-services file: $FileName"
|
||||
Write-Host
|
||||
return
|
||||
}
|
||||
elseif ($FileName -Match "Microsoft\.DotNet\.Maestro\.Tasks\.") {
|
||||
Write-Host "Ignoring Arcade-services file: $FileName"
|
||||
Write-Host
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host "Validating $FileName "
|
||||
$Status = CountMissingSymbols "$InputPath\$FileName"
|
||||
|
||||
if ($Status -ne 0) {
|
||||
Write-Error "Missing symbols for $Status modules in the package $FileName"
|
||||
}
|
||||
|
||||
Write-Host
|
||||
}
|
||||
}
|
||||
|
||||
CheckSymbolsAvailable
|
|
@ -1,11 +1,11 @@
|
|||
@{
|
||||
IncludeRules=@('PSAvoidUsingCmdletAliases',
|
||||
'PSAvoidUsingWMICmdlet',
|
||||
'PSAvoidUsingPositionalParameters',
|
||||
'PSAvoidUsingInvokeExpression',
|
||||
'PSUseDeclaredVarsMoreThanAssignments',
|
||||
'PSUseCmdletCorrectly',
|
||||
'PSStandardDSCFunctionsInResource',
|
||||
'PSUseIdenticalMandatoryParametersForDSC',
|
||||
'PSUseIdenticalParametersForDSC')
|
||||
@{
|
||||
IncludeRules=@('PSAvoidUsingCmdletAliases',
|
||||
'PSAvoidUsingWMICmdlet',
|
||||
'PSAvoidUsingPositionalParameters',
|
||||
'PSAvoidUsingInvokeExpression',
|
||||
'PSUseDeclaredVarsMoreThanAssignments',
|
||||
'PSUseCmdletCorrectly',
|
||||
'PSStandardDSCFunctionsInResource',
|
||||
'PSUseIdenticalMandatoryParametersForDSC',
|
||||
'PSUseIdenticalParametersForDSC')
|
||||
}
|
|
@ -1,83 +0,0 @@
|
|||
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE file in the project root for more information. -->
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<!--
|
||||
This MSBuild file is intended to be used as the body of the default
|
||||
publishing release pipeline. The release pipeline will use this file
|
||||
to invoke the PushToStaticFeed task that will read the build asset
|
||||
manifest and publish the assets described in the manifest to
|
||||
informed target feeds.
|
||||
-->
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<Import Project="$(MSBuildThisFileDirectory)DefaultVersions.props" Condition="Exists('$(MSBuildThisFileDirectory)DefaultVersions.props')" />
|
||||
|
||||
<!--
|
||||
This won't be necessary once we solve this issue:
|
||||
https://github.com/dotnet/arcade/issues/2266
|
||||
-->
|
||||
<Import Project="$(MSBuildThisFileDirectory)ArtifactsCategory.props" Condition="Exists('$(MSBuildThisFileDirectory)ArtifactsCategory.props')" />
|
||||
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.dotnet.build.tasks.feed\$(MicrosoftDotNetBuildTasksFeedVersion)\build\Microsoft.DotNet.Build.Tasks.Feed.targets" />
|
||||
|
||||
<Target Name="PublishToFeed">
|
||||
<Error Condition="'$(ArtifactsCategory)' == ''" Text="ArtifactsCategory: The artifacts' category produced by the build wasn't provided." />
|
||||
<Error Condition="'$(AccountKeyToStaticFeed)' == ''" Text="AccountKeyToStaticFeed: Account key for target feed wasn't provided." />
|
||||
<Error Condition="'$(ManifestsBasePath)' == ''" Text="Full path to asset manifests directory wasn't provided." />
|
||||
<Error Condition="'$(BlobBasePath)' == '' AND '$(PackageBasePath)' == ''" Text="A valid full path to BlobBasePath of PackageBasePath is required." />
|
||||
|
||||
<ItemGroup>
|
||||
<!-- Include all manifests found in the manifest folder. -->
|
||||
<ManifestFiles Include="$(ManifestsBasePath)*.xml" />
|
||||
</ItemGroup>
|
||||
|
||||
<Error Condition="'@(ManifestFiles)' == ''" Text="No manifest file was found in the provided path: $(ManifestsBasePath)" />
|
||||
|
||||
<!--
|
||||
For now the type of packages being published will be informed for the whole build.
|
||||
Eventually this will be specified on a per package basis:
|
||||
TODO: https://github.com/dotnet/arcade/issues/2266
|
||||
-->
|
||||
<PropertyGroup>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == '.NETCORE'">https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == '.NETCOREVALIDATION'">https://dotnetfeed.blob.core.windows.net/arcade-validation/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'ASPNETCORE'">https://dotnetfeed.blob.core.windows.net/aspnet-aspnetcore/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'ASPNETCORETOOLING'">https://dotnetfeed.blob.core.windows.net/aspnet-aspnetcore-tooling/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'ENTITYFRAMEWORKCORE'">https://dotnetfeed.blob.core.windows.net/aspnet-entityframeworkcore/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'ASPNETEXTENSIONS'">https://dotnetfeed.blob.core.windows.net/aspnet-extensions/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'CORECLR'">https://dotnetfeed.blob.core.windows.net/dotnet-coreclr/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'CORESDK'">https://dotnetfeed.blob.core.windows.net/dotnet-sdk/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'TOOLSINTERNAL'">https://dotnetfeed.blob.core.windows.net/dotnet-tools-internal/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'TOOLSET'">https://dotnetfeed.blob.core.windows.net/dotnet-toolset/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'WINDOWSDESKTOP'">https://dotnetfeed.blob.core.windows.net/dotnet-windowsdesktop/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'NUGETCLIENT'">https://dotnetfeed.blob.core.windows.net/nuget-nugetclient/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'ASPNETENTITYFRAMEWORK6'">https://dotnetfeed.blob.core.windows.net/aspnet-entityframework6/index.json</TargetStaticFeed>
|
||||
<TargetStaticFeed Condition="'$(ArtifactsCategory.ToUpper())' == 'ASPNETBLAZOR'">https://dotnetfeed.blob.core.windows.net/aspnet-blazor/index.json</TargetStaticFeed>
|
||||
</PropertyGroup>
|
||||
|
||||
<Error
|
||||
Condition="'$(TargetStaticFeed)' == ''"
|
||||
Text="'$(ArtifactsCategory)' wasn't recognized as a valid artifact category. Valid categories are: '.NetCore' and '.NetCoreValidation'" />
|
||||
|
||||
<!-- Iterate publishing assets from each manifest file. -->
|
||||
<PushArtifactsInManifestToFeed
|
||||
ExpectedFeedUrl="$(TargetStaticFeed)"
|
||||
AccountKey="$(AccountKeyToStaticFeed)"
|
||||
BARBuildId="$(BARBuildId)"
|
||||
MaestroApiEndpoint="$(MaestroApiEndpoint)"
|
||||
BuildAssetRegistryToken="$(BuildAssetRegistryToken)"
|
||||
Overwrite="$(OverrideAssetsWithSameName)"
|
||||
PassIfExistingItemIdentical="$(PassIfExistingItemIdentical)"
|
||||
MaxClients="$(MaxParallelUploads)"
|
||||
UploadTimeoutInMinutes="$(MaxUploadTimeoutInMinutes)"
|
||||
AssetManifestPath="%(ManifestFiles.Identity)"
|
||||
BlobAssetsBasePath="$(BlobBasePath)"
|
||||
PackageAssetsBasePath="$(PackageBasePath)"/>
|
||||
</Target>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.DotNet.Build.Tasks.Feed" Version="$(MicrosoftDotNetBuildTasksFeedVersion)" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,82 +0,0 @@
|
|||
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE file in the project root for more information. -->
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<!--
|
||||
This MSBuild file is intended to be used as the body of the default
|
||||
publishing release pipeline. The release pipeline will use this file
|
||||
to invoke the PublishSymbols tasks to publish symbols to MSDL and SymWeb.
|
||||
|
||||
Parameters:
|
||||
|
||||
- PDBArtifactsDirectory : Full path to directory containing PDB files to be published.
|
||||
- BlobBasePath : Full path containing *.symbols.nupkg packages to be published.
|
||||
- DotNetSymbolServerTokenMsdl : PAT to access MSDL.
|
||||
- DotNetSymbolServerTokenSymWeb : PAT to access SymWeb.
|
||||
- DotNetSymbolExpirationInDays : Expiration days for published packages. Default is 3650.
|
||||
-->
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.symboluploader.build.task\$(SymbolUploaderVersion)\build\PublishSymbols.targets" />
|
||||
|
||||
<Target Name="PublishSymbols">
|
||||
<ItemGroup>
|
||||
<FilesToPublishToSymbolServer Include="$(PDBArtifactsDirectory)\*.pdb"/>
|
||||
<PackagesToPublishToSymbolServer Include="$(BlobBasePath)\*.symbols.nupkg"/>
|
||||
|
||||
<!--
|
||||
These packages from Arcade-Services include some native libraries that
|
||||
our current symbol uploader can't handle. Below is a workaround until
|
||||
we get issue: https://github.com/dotnet/arcade/issues/2457 sorted.
|
||||
-->
|
||||
<PackagesToPublishToSymbolServer Remove="$(BlobBasePath)\Microsoft.DotNet.Darc.*" />
|
||||
<PackagesToPublishToSymbolServer Remove="$(BlobBasePath)\Microsoft.DotNet.Maestro.Tasks.*" />
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<DotNetSymbolExpirationInDays Condition="'$(DotNetSymbolExpirationInDays)' == ''">3650</DotNetSymbolExpirationInDays>
|
||||
<PublishToSymbolServer>true</PublishToSymbolServer>
|
||||
<PublishToSymbolServer Condition="'@(FilesToPublishToSymbolServer)' == '' and '@(PackagesToPublishToSymbolServer)' == ''">false</PublishToSymbolServer>
|
||||
</PropertyGroup>
|
||||
|
||||
<Message
|
||||
Importance="High"
|
||||
Text="No symbol package(s) were found to publish."
|
||||
Condition="$(PublishToSymbolServer) == false" />
|
||||
|
||||
<!-- Symbol Uploader: MSDL -->
|
||||
<Message Importance="High" Text="Publishing symbol packages to MSDL ..." Condition="$(PublishToSymbolServer)" />
|
||||
<PublishSymbols PackagesToPublish="@(PackagesToPublishToSymbolServer)"
|
||||
FilesToPublish="@(FilesToPublishToSymbolServer)"
|
||||
PersonalAccessToken="$(DotNetSymbolServerTokenMsdl)"
|
||||
SymbolServerPath="https://microsoftpublicsymbols.artifacts.visualstudio.com/DefaultCollection"
|
||||
ExpirationInDays="$(DotNetSymbolExpirationInDays)"
|
||||
VerboseLogging="true"
|
||||
DryRun="false"
|
||||
ConvertPortablePdbsToWindowsPdbs="false"
|
||||
PdbConversionTreatAsWarning=""
|
||||
Condition="$(PublishToSymbolServer)"/>
|
||||
|
||||
<!--
|
||||
Symbol Uploader: SymWeb
|
||||
Watson, VS insertion testings and the typical internal dev usage require SymWeb.
|
||||
Currently we need to call the task twice (https://github.com/dotnet/core-eng/issues/3489).
|
||||
-->
|
||||
<Message Importance="High" Text="Publishing symbol packages to SymWeb ..." Condition="$(PublishToSymbolServer)" />
|
||||
<PublishSymbols PackagesToPublish="@(PackagesToPublishToSymbolServer)"
|
||||
FilesToPublish="@(FilesToPublishToSymbolServer)"
|
||||
PersonalAccessToken="$(DotNetSymbolServerTokenSymWeb)"
|
||||
SymbolServerPath="https://microsoft.artifacts.visualstudio.com/DefaultCollection"
|
||||
ExpirationInDays="$(DotNetSymbolExpirationInDays)"
|
||||
VerboseLogging="true"
|
||||
DryRun="false"
|
||||
ConvertPortablePdbsToWindowsPdbs="false"
|
||||
PdbConversionTreatAsWarning=""
|
||||
Condition="$(PublishToSymbolServer)"/>
|
||||
</Target>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.SymbolUploader.Build.Task" Version="$(SymbolUploaderVersion)" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,28 +1,28 @@
|
|||
# Don't touch this folder
|
||||
|
||||
uuuuuuuuuuuuuuuuuuuu
|
||||
u" uuuuuuuuuuuuuuuuuu "u
|
||||
u" u$$$$$$$$$$$$$$$$$$$$u "u
|
||||
u" u$$$$$$$$$$$$$$$$$$$$$$$$u "u
|
||||
u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u
|
||||
u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u
|
||||
u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u
|
||||
$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $
|
||||
$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $
|
||||
$ $$$" ... "$... ...$" ... "$$$ ... "$$$ $
|
||||
$ $$$u `"$$$$$$$ $$$ $$$$$ $$ $$$ $$$ $
|
||||
$ $$$$$$uu "$$$$ $$$ $$$$$ $$ """ u$$$ $
|
||||
$ $$$""$$$ $$$$ $$$u "$$$" u$$ $$$$$$$$ $
|
||||
$ $$$$....,$$$$$..$$$$$....,$$$$..$$$$$$$$ $
|
||||
$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $
|
||||
"u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u"
|
||||
"u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u"
|
||||
"u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u"
|
||||
"u "$$$$$$$$$$$$$$$$$$$$$$$$" u"
|
||||
"u "$$$$$$$$$$$$$$$$$$$$" u"
|
||||
"u """""""""""""""""" u"
|
||||
""""""""""""""""""""
|
||||
|
||||
!!! Changes made in this directory are subject to being overwritten by automation !!!
|
||||
|
||||
The files in this directory are shared by all Arcade repos and managed by automation. If you need to make changes to these files, open an issue or submit a pull request to https://github.com/dotnet/arcade first.
|
||||
# Don't touch this folder
|
||||
|
||||
uuuuuuuuuuuuuuuuuuuu
|
||||
u" uuuuuuuuuuuuuuuuuu "u
|
||||
u" u$$$$$$$$$$$$$$$$$$$$u "u
|
||||
u" u$$$$$$$$$$$$$$$$$$$$$$$$u "u
|
||||
u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u
|
||||
u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u
|
||||
u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u
|
||||
$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $
|
||||
$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $
|
||||
$ $$$" ... "$... ...$" ... "$$$ ... "$$$ $
|
||||
$ $$$u `"$$$$$$$ $$$ $$$$$ $$ $$$ $$$ $
|
||||
$ $$$$$$uu "$$$$ $$$ $$$$$ $$ """ u$$$ $
|
||||
$ $$$""$$$ $$$$ $$$u "$$$" u$$ $$$$$$$$ $
|
||||
$ $$$$....,$$$$$..$$$$$....,$$$$..$$$$$$$$ $
|
||||
$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $
|
||||
"u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u"
|
||||
"u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u"
|
||||
"u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u"
|
||||
"u "$$$$$$$$$$$$$$$$$$$$$$$$" u"
|
||||
"u "$$$$$$$$$$$$$$$$$$$$" u"
|
||||
"u """""""""""""""""" u"
|
||||
""""""""""""""""""""
|
||||
|
||||
!!! Changes made in this directory are subject to being overwritten by automation !!!
|
||||
|
||||
The files in this directory are shared by all Arcade repos and managed by automation. If you need to make changes to these files, open an issue or submit a pull request to https://github.com/dotnet/arcade first.
|
||||
|
|
|
@ -1,161 +1,167 @@
|
|||
# This file is a temporary workaround for internal builds to be able to restore from private AzDO feeds.
|
||||
# This file should be removed as part of this issue: https://github.com/dotnet/arcade/issues/4080
|
||||
#
|
||||
# What the script does is iterate over all package sources in the pointed NuGet.config and add a credential entry
|
||||
# under <packageSourceCredentials> for each Maestro managed private feed. Two additional credential
|
||||
# entries are also added for the two private static internal feeds: dotnet3-internal and dotnet3-internal-transport.
|
||||
#
|
||||
# This script needs to be called in every job that will restore packages and which the base repo has
|
||||
# private AzDO feeds in the NuGet.config.
|
||||
#
|
||||
# See example YAML call for this script below. Note the use of the variable `$(dn-bot-dnceng-artifact-feeds-rw)`
|
||||
# from the AzureDevOps-Artifact-Feeds-Pats variable group.
|
||||
#
|
||||
# Any disabledPackageSources entries which start with "darc-int" will be re-enabled as part of this script executing
|
||||
#
|
||||
# - task: PowerShell@2
|
||||
# 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
|
||||
# env:
|
||||
# Token: $(dn-bot-dnceng-artifact-feeds-rw)
|
||||
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory = $true)][string]$ConfigFile,
|
||||
[Parameter(Mandatory = $true)][string]$Password
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
# Add source entry to PackageSources
|
||||
function AddPackageSource($sources, $SourceName, $SourceEndPoint, $creds, $Username, $Password) {
|
||||
$packageSource = $sources.SelectSingleNode("add[@key='$SourceName']")
|
||||
|
||||
if ($packageSource -eq $null)
|
||||
{
|
||||
$packageSource = $doc.CreateElement("add")
|
||||
$packageSource.SetAttribute("key", $SourceName)
|
||||
$packageSource.SetAttribute("value", $SourceEndPoint)
|
||||
$sources.AppendChild($packageSource) | Out-Null
|
||||
}
|
||||
else {
|
||||
Write-Host "Package source $SourceName already present."
|
||||
}
|
||||
|
||||
AddCredential -Creds $creds -Source $SourceName -Username $Username -Password $Password
|
||||
}
|
||||
|
||||
# Add a credential node for the specified source
|
||||
function AddCredential($creds, $source, $username, $password) {
|
||||
# Looks for credential configuration for the given SourceName. Create it if none is found.
|
||||
$sourceElement = $creds.SelectSingleNode($Source)
|
||||
if ($sourceElement -eq $null)
|
||||
{
|
||||
$sourceElement = $doc.CreateElement($Source)
|
||||
$creds.AppendChild($sourceElement) | Out-Null
|
||||
}
|
||||
|
||||
# Add the <Username> node to the credential if none is found.
|
||||
$usernameElement = $sourceElement.SelectSingleNode("add[@key='Username']")
|
||||
if ($usernameElement -eq $null)
|
||||
{
|
||||
$usernameElement = $doc.CreateElement("add")
|
||||
$usernameElement.SetAttribute("key", "Username")
|
||||
$sourceElement.AppendChild($usernameElement) | Out-Null
|
||||
}
|
||||
$usernameElement.SetAttribute("value", $Username)
|
||||
|
||||
# Add the <ClearTextPassword> to the credential if none is found.
|
||||
# Add it as a clear text because there is no support for encrypted ones in non-windows .Net SDKs.
|
||||
# -> https://github.com/NuGet/Home/issues/5526
|
||||
$passwordElement = $sourceElement.SelectSingleNode("add[@key='ClearTextPassword']")
|
||||
if ($passwordElement -eq $null)
|
||||
{
|
||||
$passwordElement = $doc.CreateElement("add")
|
||||
$passwordElement.SetAttribute("key", "ClearTextPassword")
|
||||
$sourceElement.AppendChild($passwordElement) | Out-Null
|
||||
}
|
||||
$passwordElement.SetAttribute("value", $Password)
|
||||
}
|
||||
|
||||
function InsertMaestroPrivateFeedCredentials($Sources, $Creds, $Username, $Password) {
|
||||
$maestroPrivateSources = $Sources.SelectNodes("add[contains(@key,'darc-int')]")
|
||||
|
||||
Write-Host "Inserting credentials for $($maestroPrivateSources.Count) Maestro's private feeds."
|
||||
|
||||
ForEach ($PackageSource in $maestroPrivateSources) {
|
||||
Write-Host "`tInserting credential for Maestro's feed:" $PackageSource.Key
|
||||
AddCredential -Creds $creds -Source $PackageSource.Key -Username $Username -Password $Password
|
||||
}
|
||||
}
|
||||
|
||||
function EnablePrivatePackageSources($DisabledPackageSources) {
|
||||
$maestroPrivateSources = $DisabledPackageSources.SelectNodes("add[contains(@key,'darc-int')]")
|
||||
ForEach ($DisabledPackageSource in $maestroPrivateSources) {
|
||||
Write-Host "`tEnsuring private source '$($DisabledPackageSource.key)' is enabled by deleting it from disabledPackageSource"
|
||||
# Due to https://github.com/NuGet/Home/issues/10291, we must actually remove the disabled entries
|
||||
$DisabledPackageSources.RemoveChild($DisabledPackageSource)
|
||||
}
|
||||
}
|
||||
|
||||
if (!(Test-Path $ConfigFile -PathType Leaf)) {
|
||||
Write-PipelineTelemetryError -Category 'Build' -Message "Eng/common/SetupNugetSources.ps1 returned a non-zero exit code. Couldn't find the NuGet config file: $ConfigFile"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
if (!$Password) {
|
||||
Write-PipelineTelemetryError -Category 'Build' -Message 'Eng/common/SetupNugetSources.ps1 returned a non-zero exit code. Please supply a valid PAT'
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
# Load NuGet.config
|
||||
$doc = New-Object System.Xml.XmlDocument
|
||||
$filename = (Get-Item $ConfigFile).FullName
|
||||
$doc.Load($filename)
|
||||
|
||||
# Get reference to <PackageSources> or create one if none exist already
|
||||
$sources = $doc.DocumentElement.SelectSingleNode("packageSources")
|
||||
if ($sources -eq $null) {
|
||||
$sources = $doc.CreateElement("packageSources")
|
||||
$doc.DocumentElement.AppendChild($sources) | Out-Null
|
||||
}
|
||||
|
||||
# Looks for a <PackageSourceCredentials> node. Create it if none is found.
|
||||
$creds = $doc.DocumentElement.SelectSingleNode("packageSourceCredentials")
|
||||
if ($creds -eq $null) {
|
||||
$creds = $doc.CreateElement("packageSourceCredentials")
|
||||
$doc.DocumentElement.AppendChild($creds) | Out-Null
|
||||
}
|
||||
|
||||
# Check for disabledPackageSources; we'll enable any darc-int ones we find there
|
||||
$disabledSources = $doc.DocumentElement.SelectSingleNode("disabledPackageSources")
|
||||
if ($disabledSources -ne $null) {
|
||||
Write-Host "Checking for any darc-int disabled package sources in the disabledPackageSources node"
|
||||
EnablePrivatePackageSources -DisabledPackageSources $disabledSources
|
||||
}
|
||||
|
||||
$userName = "dn-bot"
|
||||
|
||||
# Insert credential nodes for Maestro's private feeds
|
||||
InsertMaestroPrivateFeedCredentials -Sources $sources -Creds $creds -Username $userName -Password $Password
|
||||
|
||||
$dotnet3Source = $sources.SelectSingleNode("add[@key='dotnet3']")
|
||||
if ($dotnet3Source -ne $null) {
|
||||
AddPackageSource -Sources $sources -SourceName "dotnet3-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password
|
||||
AddPackageSource -Sources $sources -SourceName "dotnet3-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password
|
||||
}
|
||||
|
||||
$dotnet31Source = $sources.SelectSingleNode("add[@key='dotnet3.1']")
|
||||
if ($dotnet31Source -ne $null) {
|
||||
AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password
|
||||
AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password
|
||||
}
|
||||
|
||||
$doc.Save($filename)
|
||||
# This file is a temporary workaround for internal builds to be able to restore from private AzDO feeds.
|
||||
# This file should be removed as part of this issue: https://github.com/dotnet/arcade/issues/4080
|
||||
#
|
||||
# What the script does is iterate over all package sources in the pointed NuGet.config and add a credential entry
|
||||
# under <packageSourceCredentials> for each Maestro managed private feed. Two additional credential
|
||||
# entries are also added for the two private static internal feeds: dotnet3-internal and dotnet3-internal-transport.
|
||||
#
|
||||
# This script needs to be called in every job that will restore packages and which the base repo has
|
||||
# private AzDO feeds in the NuGet.config.
|
||||
#
|
||||
# See example YAML call for this script below. Note the use of the variable `$(dn-bot-dnceng-artifact-feeds-rw)`
|
||||
# from the AzureDevOps-Artifact-Feeds-Pats variable group.
|
||||
#
|
||||
# Any disabledPackageSources entries which start with "darc-int" will be re-enabled as part of this script executing
|
||||
#
|
||||
# - task: PowerShell@2
|
||||
# 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
|
||||
# env:
|
||||
# Token: $(dn-bot-dnceng-artifact-feeds-rw)
|
||||
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory = $true)][string]$ConfigFile,
|
||||
[Parameter(Mandatory = $true)][string]$Password
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
# Add source entry to PackageSources
|
||||
function AddPackageSource($sources, $SourceName, $SourceEndPoint, $creds, $Username, $Password) {
|
||||
$packageSource = $sources.SelectSingleNode("add[@key='$SourceName']")
|
||||
|
||||
if ($packageSource -eq $null)
|
||||
{
|
||||
$packageSource = $doc.CreateElement("add")
|
||||
$packageSource.SetAttribute("key", $SourceName)
|
||||
$packageSource.SetAttribute("value", $SourceEndPoint)
|
||||
$sources.AppendChild($packageSource) | Out-Null
|
||||
}
|
||||
else {
|
||||
Write-Host "Package source $SourceName already present."
|
||||
}
|
||||
|
||||
AddCredential -Creds $creds -Source $SourceName -Username $Username -Password $Password
|
||||
}
|
||||
|
||||
# Add a credential node for the specified source
|
||||
function AddCredential($creds, $source, $username, $password) {
|
||||
# Looks for credential configuration for the given SourceName. Create it if none is found.
|
||||
$sourceElement = $creds.SelectSingleNode($Source)
|
||||
if ($sourceElement -eq $null)
|
||||
{
|
||||
$sourceElement = $doc.CreateElement($Source)
|
||||
$creds.AppendChild($sourceElement) | Out-Null
|
||||
}
|
||||
|
||||
# Add the <Username> node to the credential if none is found.
|
||||
$usernameElement = $sourceElement.SelectSingleNode("add[@key='Username']")
|
||||
if ($usernameElement -eq $null)
|
||||
{
|
||||
$usernameElement = $doc.CreateElement("add")
|
||||
$usernameElement.SetAttribute("key", "Username")
|
||||
$sourceElement.AppendChild($usernameElement) | Out-Null
|
||||
}
|
||||
$usernameElement.SetAttribute("value", $Username)
|
||||
|
||||
# Add the <ClearTextPassword> to the credential if none is found.
|
||||
# Add it as a clear text because there is no support for encrypted ones in non-windows .Net SDKs.
|
||||
# -> https://github.com/NuGet/Home/issues/5526
|
||||
$passwordElement = $sourceElement.SelectSingleNode("add[@key='ClearTextPassword']")
|
||||
if ($passwordElement -eq $null)
|
||||
{
|
||||
$passwordElement = $doc.CreateElement("add")
|
||||
$passwordElement.SetAttribute("key", "ClearTextPassword")
|
||||
$sourceElement.AppendChild($passwordElement) | Out-Null
|
||||
}
|
||||
$passwordElement.SetAttribute("value", $Password)
|
||||
}
|
||||
|
||||
function InsertMaestroPrivateFeedCredentials($Sources, $Creds, $Username, $Password) {
|
||||
$maestroPrivateSources = $Sources.SelectNodes("add[contains(@key,'darc-int')]")
|
||||
|
||||
Write-Host "Inserting credentials for $($maestroPrivateSources.Count) Maestro's private feeds."
|
||||
|
||||
ForEach ($PackageSource in $maestroPrivateSources) {
|
||||
Write-Host "`tInserting credential for Maestro's feed:" $PackageSource.Key
|
||||
AddCredential -Creds $creds -Source $PackageSource.Key -Username $Username -Password $Password
|
||||
}
|
||||
}
|
||||
|
||||
function EnablePrivatePackageSources($DisabledPackageSources) {
|
||||
$maestroPrivateSources = $DisabledPackageSources.SelectNodes("add[contains(@key,'darc-int')]")
|
||||
ForEach ($DisabledPackageSource in $maestroPrivateSources) {
|
||||
Write-Host "`tEnsuring private source '$($DisabledPackageSource.key)' is enabled by deleting it from disabledPackageSource"
|
||||
# Due to https://github.com/NuGet/Home/issues/10291, we must actually remove the disabled entries
|
||||
$DisabledPackageSources.RemoveChild($DisabledPackageSource)
|
||||
}
|
||||
}
|
||||
|
||||
if (!(Test-Path $ConfigFile -PathType Leaf)) {
|
||||
Write-PipelineTelemetryError -Category 'Build' -Message "Eng/common/SetupNugetSources.ps1 returned a non-zero exit code. Couldn't find the NuGet config file: $ConfigFile"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
if (!$Password) {
|
||||
Write-PipelineTelemetryError -Category 'Build' -Message 'Eng/common/SetupNugetSources.ps1 returned a non-zero exit code. Please supply a valid PAT'
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
# Load NuGet.config
|
||||
$doc = New-Object System.Xml.XmlDocument
|
||||
$filename = (Get-Item $ConfigFile).FullName
|
||||
$doc.Load($filename)
|
||||
|
||||
# Get reference to <PackageSources> or create one if none exist already
|
||||
$sources = $doc.DocumentElement.SelectSingleNode("packageSources")
|
||||
if ($sources -eq $null) {
|
||||
$sources = $doc.CreateElement("packageSources")
|
||||
$doc.DocumentElement.AppendChild($sources) | Out-Null
|
||||
}
|
||||
|
||||
# Looks for a <PackageSourceCredentials> node. Create it if none is found.
|
||||
$creds = $doc.DocumentElement.SelectSingleNode("packageSourceCredentials")
|
||||
if ($creds -eq $null) {
|
||||
$creds = $doc.CreateElement("packageSourceCredentials")
|
||||
$doc.DocumentElement.AppendChild($creds) | Out-Null
|
||||
}
|
||||
|
||||
# Check for disabledPackageSources; we'll enable any darc-int ones we find there
|
||||
$disabledSources = $doc.DocumentElement.SelectSingleNode("disabledPackageSources")
|
||||
if ($disabledSources -ne $null) {
|
||||
Write-Host "Checking for any darc-int disabled package sources in the disabledPackageSources node"
|
||||
EnablePrivatePackageSources -DisabledPackageSources $disabledSources
|
||||
}
|
||||
|
||||
$userName = "dn-bot"
|
||||
|
||||
# Insert credential nodes for Maestro's private feeds
|
||||
InsertMaestroPrivateFeedCredentials -Sources $sources -Creds $creds -Username $userName -Password $Password
|
||||
|
||||
$dotnet31Source = $sources.SelectSingleNode("add[@key='dotnet3.1']")
|
||||
if ($dotnet31Source -ne $null) {
|
||||
AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password
|
||||
AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password
|
||||
}
|
||||
|
||||
$dotnet5Source = $sources.SelectSingleNode("add[@key='dotnet5']")
|
||||
if ($dotnet5Source -ne $null) {
|
||||
AddPackageSource -Sources $sources -SourceName "dotnet5-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password
|
||||
AddPackageSource -Sources $sources -SourceName "dotnet5-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password
|
||||
}
|
||||
|
||||
$dotnet6Source = $sources.SelectSingleNode("add[@key='dotnet6']")
|
||||
if ($dotnet6Source -ne $null) {
|
||||
AddPackageSource -Sources $sources -SourceName "dotnet6-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password
|
||||
AddPackageSource -Sources $sources -SourceName "dotnet6-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password
|
||||
}
|
||||
|
||||
$doc.Save($filename)
|
||||
|
|
|
@ -81,31 +81,6 @@ fi
|
|||
|
||||
PackageSources=()
|
||||
|
||||
# Ensure dotnet3-internal and dotnet3-internal-transport are in the packageSources if the public dotnet3 feeds are present
|
||||
grep -i "<add key=\"dotnet3\"" $ConfigFile
|
||||
|
||||
if [ "$?" == "0" ]; then
|
||||
grep -i "<add key=\"dotnet3-internal\">" $ConfigFile
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "Adding dotnet3-internal to the packageSources."
|
||||
PackageSourcesNodeFooter="</packageSources>"
|
||||
PackageSourceTemplate="${TB}<add key=\"dotnet3-internal\" value=\"https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3-internal/nuget/v2\" />"
|
||||
|
||||
sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
|
||||
fi
|
||||
PackageSources+=('dotnet3-internal')
|
||||
|
||||
grep -i "<add key=\"dotnet3-internal-transport\"" $ConfigFile
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "Adding dotnet3-internal-transport to the packageSources."
|
||||
PackageSourcesNodeFooter="</packageSources>"
|
||||
PackageSourceTemplate="${TB}<add key=\"dotnet3-internal-transport\" value=\"https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3-internal-transport/nuget/v2\" />"
|
||||
|
||||
sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
|
||||
fi
|
||||
PackageSources+=('dotnet3-internal-transport')
|
||||
fi
|
||||
|
||||
# Ensure dotnet3.1-internal and dotnet3.1-internal-transport are in the packageSources if the public dotnet3.1 feeds are present
|
||||
grep -i "<add key=\"dotnet3.1\"" $ConfigFile
|
||||
if [ "$?" == "0" ]; then
|
||||
|
@ -130,6 +105,54 @@ if [ "$?" == "0" ]; then
|
|||
PackageSources+=('dotnet3.1-internal-transport')
|
||||
fi
|
||||
|
||||
# Ensure dotnet5-internal and dotnet5-internal-transport are in the packageSources if the public dotnet5 feeds are present
|
||||
grep -i "<add key=\"dotnet5\"" $ConfigFile
|
||||
if [ "$?" == "0" ]; then
|
||||
grep -i "<add key=\"dotnet5-internal\"" $ConfigFile
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "Adding dotnet5-internal to the packageSources."
|
||||
PackageSourcesNodeFooter="</packageSources>"
|
||||
PackageSourceTemplate="${TB}<add key=\"dotnet5-internal\" value=\"https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal/nuget/v2\" />"
|
||||
|
||||
sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
|
||||
fi
|
||||
PackageSources+=('dotnet5-internal')
|
||||
|
||||
grep -i "<add key=\"dotnet5-internal-transport\">" $ConfigFile
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "Adding dotnet5-internal-transport to the packageSources."
|
||||
PackageSourcesNodeFooter="</packageSources>"
|
||||
PackageSourceTemplate="${TB}<add key=\"dotnet5-internal-transport\" value=\"https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-transport/nuget/v2\" />"
|
||||
|
||||
sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
|
||||
fi
|
||||
PackageSources+=('dotnet5-internal-transport')
|
||||
fi
|
||||
|
||||
# Ensure dotnet6-internal and dotnet6-internal-transport are in the packageSources if the public dotnet6 feeds are present
|
||||
grep -i "<add key=\"dotnet6\"" $ConfigFile
|
||||
if [ "$?" == "0" ]; then
|
||||
grep -i "<add key=\"dotnet6-internal\"" $ConfigFile
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "Adding dotnet6-internal to the packageSources."
|
||||
PackageSourcesNodeFooter="</packageSources>"
|
||||
PackageSourceTemplate="${TB}<add key=\"dotnet6-internal\" value=\"https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal/nuget/v2\" />"
|
||||
|
||||
sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
|
||||
fi
|
||||
PackageSources+=('dotnet6-internal')
|
||||
|
||||
grep -i "<add key=\"dotnet6-internal-transport\">" $ConfigFile
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "Adding dotnet6-internal-transport to the packageSources."
|
||||
PackageSourcesNodeFooter="</packageSources>"
|
||||
PackageSourceTemplate="${TB}<add key=\"dotnet6-internal-transport\" value=\"https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal-transport/nuget/v2\" />"
|
||||
|
||||
sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
|
||||
fi
|
||||
PackageSources+=('dotnet6-internal-transport')
|
||||
fi
|
||||
|
||||
# I want things split line by line
|
||||
PrevIFS=$IFS
|
||||
IFS=$'\n'
|
||||
|
@ -165,4 +188,4 @@ if [ "$?" == "0" ]; then
|
|||
echo "Neutralized disablePackageSources entry for '$DisabledSourceName'"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
|
|
@ -1,83 +0,0 @@
|
|||
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE file in the project root for more information. -->
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<!--
|
||||
This MSBuild file is intended to be used as the body of the default
|
||||
publishing release pipeline. The release pipeline will use this file
|
||||
to invoke the SignCheck tool to validate that packages about to
|
||||
be published are correctly signed.
|
||||
|
||||
Parameters:
|
||||
|
||||
- PackageBasePath : Directory containing all files that need to be validated.
|
||||
- SignCheckVersion : Version of SignCheck package to be used.
|
||||
- SignValidationExclusionList : ItemGroup containing exclusion list to be forwarded to SignCheck.
|
||||
- EnableJarSigningCheck : Whether .jar files should be validated.
|
||||
- EnableStrongNameCheck : Whether strong name check should be performed.
|
||||
-->
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<!--
|
||||
From 'Signing.props' we import $(SignValidationExclusionList)
|
||||
-->
|
||||
<Import Project="$(MSBuildThisFileDirectory)Signing.props" Condition="Exists('$(MSBuildThisFileDirectory)Signing.props')" />
|
||||
|
||||
<Target Name="ValidateSigning">
|
||||
<PropertyGroup>
|
||||
<SignCheckToolPath>$(NuGetPackageRoot)Microsoft.DotNet.SignCheck\$(SignCheckVersion)\tools\Microsoft.DotNet.SignCheck.exe</SignCheckToolPath>
|
||||
|
||||
<SignCheckInputDir>$(PackageBasePath)</SignCheckInputDir>
|
||||
<SignCheckLog>signcheck.log</SignCheckLog>
|
||||
<SignCheckErrorLog>signcheck.errors.log</SignCheckErrorLog>
|
||||
<SignCheckExclusionsFile>signcheck.exclusions.txt</SignCheckExclusionsFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!--
|
||||
Documentation for these arguments is available here:
|
||||
https://github.com/dotnet/arcade/tree/master/src/SignCheck
|
||||
-->
|
||||
<SignCheckArgs Include="--recursive" />
|
||||
<SignCheckArgs Include="--traverse-subfolders" />
|
||||
<SignCheckArgs Include="--file-status AllFiles" />
|
||||
<SignCheckArgs Include="--log-file $(SignCheckLog)" />
|
||||
<SignCheckArgs Include="--error-log-file $(SignCheckErrorLog)" />
|
||||
<SignCheckArgs Include="--input-files $(SignCheckInputDir)" />
|
||||
|
||||
<SignCheckArgs Include="--exclusions-file $(SignCheckExclusionsFile)" Condition="'@(SignValidationExclusionList)' != ''" />
|
||||
<SignCheckArgs Include="--verify-jar" Condition="'$(EnableJarSigningCheck)' == 'true'" />
|
||||
<SignCheckArgs Include="--verify-strongname" Condition="'$(EnableStrongNameCheck)' == 'true'" />
|
||||
</ItemGroup>
|
||||
|
||||
<WriteLinesToFile
|
||||
File="$(SignCheckExclusionsFile)"
|
||||
Lines="@(SignValidationExclusionList)"
|
||||
Condition="'@(SignValidationExclusionList)' != ''"
|
||||
Overwrite="true"
|
||||
Encoding="Unicode"/>
|
||||
|
||||
<!--
|
||||
IgnoreExitCode='true' because the tool doesn't return '0' on success.
|
||||
-->
|
||||
<Exec
|
||||
Command=""$(SignCheckToolPath)" @(SignCheckArgs, ' ')"
|
||||
IgnoreExitCode='true'
|
||||
ConsoleToMsBuild="false"
|
||||
StandardErrorImportance="high" />
|
||||
|
||||
<Error
|
||||
Text="Signing validation failed. Check $(SignCheckErrorLog) for more information."
|
||||
Condition="Exists($(SignCheckErrorLog)) and '$([System.IO.File]::ReadAllText($(SignCheckErrorLog)))' != ''" />
|
||||
|
||||
<Message
|
||||
Text="##vso[artifact.upload containerfolder=LogFiles;artifactname=LogFiles]{SignCheckErrorLog}"
|
||||
Condition="Exists($(SignCheckErrorLog)) and '$([System.IO.File]::ReadAllText($(SignCheckErrorLog)))' != ''" />
|
||||
|
||||
</Target>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.DotNet.SignCheck" Version="$(SignCheckVersion)" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,184 +0,0 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where Symbols.NuGet packages to be checked are stored
|
||||
[Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation
|
||||
[Parameter(Mandatory=$true)][string] $SourceLinkToolPath, # Full path to directory where dotnet SourceLink CLI was installed
|
||||
[Parameter(Mandatory=$true)][string] $GHRepoName, # GitHub name of the repo including the Org. E.g., dotnet/arcade
|
||||
[Parameter(Mandatory=$true)][string] $GHCommit # GitHub commit SHA used to build the packages
|
||||
)
|
||||
|
||||
# Cache/HashMap (File -> Exist flag) used to consult whether a file exist
|
||||
# in the repository at a specific commit point. This is populated by inserting
|
||||
# all files present in the repo at a specific commit point.
|
||||
$global:RepoFiles = @{}
|
||||
|
||||
$ValidatePackage = {
|
||||
param(
|
||||
[string] $PackagePath # Full path to a Symbols.NuGet package
|
||||
)
|
||||
|
||||
# Ensure input file exist
|
||||
if (!(Test-Path $PackagePath)) {
|
||||
throw "Input file does not exist: $PackagePath"
|
||||
}
|
||||
|
||||
# Extensions for which we'll look for SourceLink information
|
||||
# For now we'll only care about Portable & Embedded PDBs
|
||||
$RelevantExtensions = @(".dll", ".exe", ".pdb")
|
||||
|
||||
Write-Host -NoNewLine "Validating" ([System.IO.Path]::GetFileName($PackagePath)) "... "
|
||||
|
||||
$PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath)
|
||||
$ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageId
|
||||
$FailedFiles = 0
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
[System.IO.Directory]::CreateDirectory($ExtractPath);
|
||||
|
||||
$zip = [System.IO.Compression.ZipFile]::OpenRead($PackagePath)
|
||||
|
||||
$zip.Entries |
|
||||
Where-Object {$RelevantExtensions -contains [System.IO.Path]::GetExtension($_.Name)} |
|
||||
ForEach-Object {
|
||||
$FileName = $_.FullName
|
||||
$Extension = [System.IO.Path]::GetExtension($_.Name)
|
||||
$FakeName = -Join((New-Guid), $Extension)
|
||||
$TargetFile = Join-Path -Path $ExtractPath -ChildPath $FakeName
|
||||
|
||||
# We ignore resource DLLs
|
||||
if ($FileName.EndsWith(".resources.dll")) {
|
||||
return
|
||||
}
|
||||
|
||||
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile, $true)
|
||||
|
||||
$ValidateFile = {
|
||||
param(
|
||||
[string] $FullPath, # Full path to the module that has to be checked
|
||||
[string] $RealPath,
|
||||
[ref] $FailedFiles
|
||||
)
|
||||
|
||||
# Makes easier to reference `sourcelink cli`
|
||||
Push-Location $using:SourceLinkToolPath
|
||||
|
||||
$SourceLinkInfos = .\sourcelink.exe print-urls $FullPath | Out-String
|
||||
|
||||
if ($LASTEXITCODE -eq 0 -and -not ([string]::IsNullOrEmpty($SourceLinkInfos))) {
|
||||
$NumFailedLinks = 0
|
||||
|
||||
# We only care about Http addresses
|
||||
$Matches = (Select-String '(http[s]?)(:\/\/)([^\s,]+)' -Input $SourceLinkInfos -AllMatches).Matches
|
||||
|
||||
if ($Matches.Count -ne 0) {
|
||||
$Matches.Value |
|
||||
ForEach-Object {
|
||||
$Link = $_
|
||||
$CommitUrl = -Join("https://raw.githubusercontent.com/", $using:GHRepoName, "/", $using:GHCommit, "/")
|
||||
$FilePath = $Link.Replace($CommitUrl, "")
|
||||
$Status = 200
|
||||
$Cache = $using:RepoFiles
|
||||
|
||||
if ( !($Cache.ContainsKey($FilePath)) ) {
|
||||
try {
|
||||
$Uri = $Link -as [System.URI]
|
||||
|
||||
# Only GitHub links are valid
|
||||
if ($Uri.AbsoluteURI -ne $null -and $Uri.Host -match "github") {
|
||||
$Status = (Invoke-WebRequest -Uri $Link -UseBasicParsing -Method HEAD -TimeoutSec 5).StatusCode
|
||||
}
|
||||
else {
|
||||
$Status = 0
|
||||
}
|
||||
}
|
||||
catch {
|
||||
$Status = 0
|
||||
}
|
||||
}
|
||||
|
||||
if ($Status -ne 200) {
|
||||
if ($NumFailedLinks -eq 0) {
|
||||
if ($FailedFiles.Value -eq 0) {
|
||||
Write-Host
|
||||
}
|
||||
|
||||
Write-Host "`tFile $RealPath has broken links:"
|
||||
}
|
||||
|
||||
Write-Host "`t`tFailed to retrieve $Link"
|
||||
|
||||
$NumFailedLinks++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($NumFailedLinks -ne 0) {
|
||||
$FailedFiles.value++
|
||||
$global:LASTEXITCODE = 1
|
||||
}
|
||||
}
|
||||
|
||||
Pop-Location
|
||||
}
|
||||
|
||||
&$ValidateFile $TargetFile $FileName ([ref]$FailedFiles)
|
||||
}
|
||||
|
||||
$zip.Dispose()
|
||||
|
||||
if ($FailedFiles -eq 0) {
|
||||
Write-Host "Passed."
|
||||
}
|
||||
}
|
||||
|
||||
function ValidateSourceLinkLinks {
|
||||
if (!($GHRepoName -Match "^[^\s\/]+/[^\s\/]+$")) {
|
||||
Write-Host "GHRepoName should be in the format <org>/<repo>"
|
||||
$global:LASTEXITCODE = 1
|
||||
return
|
||||
}
|
||||
|
||||
if (!($GHCommit -Match "^[0-9a-fA-F]{40}$")) {
|
||||
Write-Host "GHCommit should be a 40 chars hexadecimal string"
|
||||
$global:LASTEXITCODE = 1
|
||||
return
|
||||
}
|
||||
|
||||
$RepoTreeURL = -Join("https://api.github.com/repos/", $GHRepoName, "/git/trees/", $GHCommit, "?recursive=1")
|
||||
$CodeExtensions = @(".cs", ".vb", ".fs", ".fsi", ".fsx", ".fsscript")
|
||||
|
||||
try {
|
||||
# Retrieve the list of files in the repo at that particular commit point and store them in the RepoFiles hash
|
||||
$Data = Invoke-WebRequest $RepoTreeURL | ConvertFrom-Json | Select-Object -ExpandProperty tree
|
||||
|
||||
foreach ($file in $Data) {
|
||||
$Extension = [System.IO.Path]::GetExtension($file.path)
|
||||
|
||||
if ($CodeExtensions.Contains($Extension)) {
|
||||
$RepoFiles[$file.path] = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host "Problems downloading the list of files from the repo. Url used: $RepoTreeURL"
|
||||
$global:LASTEXITCODE = 1
|
||||
return
|
||||
}
|
||||
|
||||
if (Test-Path $ExtractPath) {
|
||||
Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
# Process each NuGet package in parallel
|
||||
$Jobs = @()
|
||||
Get-ChildItem "$InputPath\*.symbols.nupkg" |
|
||||
ForEach-Object {
|
||||
$Jobs += Start-Job -ScriptBlock $ValidatePackage -ArgumentList $_.FullName
|
||||
}
|
||||
|
||||
foreach ($Job in $Jobs) {
|
||||
Wait-Job -Id $Job.Id | Receive-Job
|
||||
}
|
||||
}
|
||||
|
||||
Measure-Command { ValidateSourceLinkLinks }
|
|
@ -1,145 +1,161 @@
|
|||
[CmdletBinding(PositionalBinding=$false)]
|
||||
Param(
|
||||
[string][Alias('c')]$configuration = "Debug",
|
||||
[string]$platform = $null,
|
||||
[string] $projects,
|
||||
[string][Alias('v')]$verbosity = "minimal",
|
||||
[string] $msbuildEngine = $null,
|
||||
[bool] $warnAsError = $true,
|
||||
[bool] $nodeReuse = $true,
|
||||
[switch][Alias('r')]$restore,
|
||||
[switch] $deployDeps,
|
||||
[switch][Alias('b')]$build,
|
||||
[switch] $rebuild,
|
||||
[switch] $deploy,
|
||||
[switch][Alias('t')]$test,
|
||||
[switch] $integrationTest,
|
||||
[switch] $performanceTest,
|
||||
[switch] $sign,
|
||||
[switch] $pack,
|
||||
[switch] $publish,
|
||||
[switch][Alias('bl')]$binaryLog,
|
||||
[switch] $ci,
|
||||
[switch] $prepareMachine,
|
||||
[switch] $help,
|
||||
[Parameter(ValueFromRemainingArguments=$true)][String[]]$properties
|
||||
)
|
||||
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
function Print-Usage() {
|
||||
Write-Host "Common settings:"
|
||||
Write-Host " -configuration <value> Build configuration: 'Debug' or 'Release' (short: -c)"
|
||||
Write-Host " -platform <value> Platform configuration: 'x86', 'x64' or any valid Platform value to pass to msbuild"
|
||||
Write-Host " -verbosity <value> Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)"
|
||||
Write-Host " -binaryLog Output binary log (short: -bl)"
|
||||
Write-Host " -help Print help and exit"
|
||||
Write-Host ""
|
||||
|
||||
Write-Host "Actions:"
|
||||
Write-Host " -restore Restore dependencies (short: -r)"
|
||||
Write-Host " -build Build solution (short: -b)"
|
||||
Write-Host " -rebuild Rebuild solution"
|
||||
Write-Host " -deploy Deploy built VSIXes"
|
||||
Write-Host " -deployDeps Deploy dependencies (e.g. VSIXes for integration tests)"
|
||||
Write-Host " -test Run all unit tests in the solution (short: -t)"
|
||||
Write-Host " -integrationTest Run all integration tests in the solution"
|
||||
Write-Host " -performanceTest Run all performance tests in the solution"
|
||||
Write-Host " -pack Package build outputs into NuGet packages and Willow components"
|
||||
Write-Host " -sign Sign build outputs"
|
||||
Write-Host " -publish Publish artifacts (e.g. symbols)"
|
||||
Write-Host ""
|
||||
|
||||
Write-Host "Advanced settings:"
|
||||
Write-Host " -projects <value> Semi-colon delimited list of sln/proj's to build. Globbing is supported (*.sln)"
|
||||
Write-Host " -ci Set when running on CI server"
|
||||
Write-Host " -prepareMachine Prepare machine for CI run, clean up processes after build"
|
||||
Write-Host " -warnAsError <value> Sets warnaserror msbuild parameter ('true' or 'false')"
|
||||
Write-Host " -msbuildEngine <value> Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)."
|
||||
Write-Host ""
|
||||
|
||||
Write-Host "Command line arguments not listed above are passed thru to msbuild."
|
||||
Write-Host "The above arguments can be shortened as much as to be unambiguous (e.g. -co for configuration, -t for test, etc.)."
|
||||
}
|
||||
|
||||
function InitializeCustomToolset {
|
||||
if (-not $restore) {
|
||||
return
|
||||
}
|
||||
|
||||
$script = Join-Path $EngRoot "restore-toolset.ps1"
|
||||
|
||||
if (Test-Path $script) {
|
||||
. $script
|
||||
}
|
||||
}
|
||||
|
||||
function Build {
|
||||
$toolsetBuildProj = InitializeToolset
|
||||
InitializeCustomToolset
|
||||
|
||||
$bl = if ($binaryLog) { "/bl:" + (Join-Path $LogDir "Build.binlog") } else { "" }
|
||||
$platformArg = if ($platform) { "/p:Platform=$platform" } else { "" }
|
||||
|
||||
if ($projects) {
|
||||
# Re-assign properties to a new variable because PowerShell doesn't let us append properties directly for unclear reasons.
|
||||
# Explicitly set the type as string[] because otherwise PowerShell would make this char[] if $properties is empty.
|
||||
[string[]] $msbuildArgs = $properties
|
||||
|
||||
# Resolve relative project paths into full paths
|
||||
$projects = ($projects.Split(';').ForEach({Resolve-Path $_}) -join ';')
|
||||
|
||||
$msbuildArgs += "/p:Projects=$projects"
|
||||
$properties = $msbuildArgs
|
||||
}
|
||||
|
||||
MSBuild $toolsetBuildProj `
|
||||
$bl `
|
||||
$platformArg `
|
||||
/p:Configuration=$configuration `
|
||||
/p:RepoRoot=$RepoRoot `
|
||||
/p:Restore=$restore `
|
||||
/p:DeployDeps=$deployDeps `
|
||||
/p:Build=$build `
|
||||
/p:Rebuild=$rebuild `
|
||||
/p:Deploy=$deploy `
|
||||
/p:Test=$test `
|
||||
/p:Pack=$pack `
|
||||
/p:IntegrationTest=$integrationTest `
|
||||
/p:PerformanceTest=$performanceTest `
|
||||
/p:Sign=$sign `
|
||||
/p:Publish=$publish `
|
||||
@properties
|
||||
}
|
||||
|
||||
try {
|
||||
if ($help -or (($null -ne $properties) -and ($properties.Contains("/help") -or $properties.Contains("/?")))) {
|
||||
Print-Usage
|
||||
exit 0
|
||||
}
|
||||
|
||||
if ($ci) {
|
||||
$binaryLog = $true
|
||||
$nodeReuse = $false
|
||||
}
|
||||
|
||||
# Import custom tools configuration, if present in the repo.
|
||||
# Note: Import in global scope so that the script set top-level variables without qualification.
|
||||
$configureToolsetScript = Join-Path $EngRoot "configure-toolset.ps1"
|
||||
if (Test-Path $configureToolsetScript) {
|
||||
. $configureToolsetScript
|
||||
}
|
||||
|
||||
if (($restore) -and ($null -eq $env:DisableNativeToolsetInstalls)) {
|
||||
InitializeNativeTools
|
||||
}
|
||||
|
||||
Build
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category "InitializeToolset" -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
ExitWithExitCode 0
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
Param(
|
||||
[string][Alias('c')]$configuration = "Debug",
|
||||
[string]$platform = $null,
|
||||
[string] $projects,
|
||||
[string][Alias('v')]$verbosity = "minimal",
|
||||
[string] $msbuildEngine = $null,
|
||||
[bool] $warnAsError = $true,
|
||||
[bool] $nodeReuse = $true,
|
||||
[switch][Alias('r')]$restore,
|
||||
[switch] $deployDeps,
|
||||
[switch][Alias('b')]$build,
|
||||
[switch] $rebuild,
|
||||
[switch] $deploy,
|
||||
[switch][Alias('t')]$test,
|
||||
[switch] $integrationTest,
|
||||
[switch] $performanceTest,
|
||||
[switch] $sign,
|
||||
[switch] $pack,
|
||||
[switch] $publish,
|
||||
[switch] $clean,
|
||||
[switch][Alias('bl')]$binaryLog,
|
||||
[switch][Alias('nobl')]$excludeCIBinarylog,
|
||||
[switch] $ci,
|
||||
[switch] $prepareMachine,
|
||||
[string] $runtimeSourceFeed = '',
|
||||
[string] $runtimeSourceFeedKey = '',
|
||||
[switch] $excludePrereleaseVS,
|
||||
[switch] $help,
|
||||
[Parameter(ValueFromRemainingArguments=$true)][String[]]$properties
|
||||
)
|
||||
|
||||
# Unset 'Platform' environment variable to avoid unwanted collision in InstallDotNetCore.targets file
|
||||
# some computer has this env var defined (e.g. Some HP)
|
||||
if($env:Platform) {
|
||||
$env:Platform=""
|
||||
}
|
||||
function Print-Usage() {
|
||||
Write-Host "Common settings:"
|
||||
Write-Host " -configuration <value> Build configuration: 'Debug' or 'Release' (short: -c)"
|
||||
Write-Host " -platform <value> Platform configuration: 'x86', 'x64' or any valid Platform value to pass to msbuild"
|
||||
Write-Host " -verbosity <value> Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)"
|
||||
Write-Host " -binaryLog Output binary log (short: -bl)"
|
||||
Write-Host " -help Print help and exit"
|
||||
Write-Host ""
|
||||
|
||||
Write-Host "Actions:"
|
||||
Write-Host " -restore Restore dependencies (short: -r)"
|
||||
Write-Host " -build Build solution (short: -b)"
|
||||
Write-Host " -rebuild Rebuild solution"
|
||||
Write-Host " -deploy Deploy built VSIXes"
|
||||
Write-Host " -deployDeps Deploy dependencies (e.g. VSIXes for integration tests)"
|
||||
Write-Host " -test Run all unit tests in the solution (short: -t)"
|
||||
Write-Host " -integrationTest Run all integration tests in the solution"
|
||||
Write-Host " -performanceTest Run all performance tests in the solution"
|
||||
Write-Host " -pack Package build outputs into NuGet packages and Willow components"
|
||||
Write-Host " -sign Sign build outputs"
|
||||
Write-Host " -publish Publish artifacts (e.g. symbols)"
|
||||
Write-Host " -clean Clean the solution"
|
||||
Write-Host ""
|
||||
|
||||
Write-Host "Advanced settings:"
|
||||
Write-Host " -projects <value> Semi-colon delimited list of sln/proj's to build. Globbing is supported (*.sln)"
|
||||
Write-Host " -ci Set when running on CI server"
|
||||
Write-Host " -excludeCIBinarylog Don't output binary log (short: -nobl)"
|
||||
Write-Host " -prepareMachine Prepare machine for CI run, clean up processes after build"
|
||||
Write-Host " -warnAsError <value> Sets warnaserror msbuild parameter ('true' or 'false')"
|
||||
Write-Host " -msbuildEngine <value> Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)."
|
||||
Write-Host " -excludePrereleaseVS Set to exclude build engines in prerelease versions of Visual Studio"
|
||||
Write-Host ""
|
||||
|
||||
Write-Host "Command line arguments not listed above are passed thru to msbuild."
|
||||
Write-Host "The above arguments can be shortened as much as to be unambiguous (e.g. -co for configuration, -t for test, etc.)."
|
||||
}
|
||||
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
function InitializeCustomToolset {
|
||||
if (-not $restore) {
|
||||
return
|
||||
}
|
||||
|
||||
$script = Join-Path $EngRoot 'restore-toolset.ps1'
|
||||
|
||||
if (Test-Path $script) {
|
||||
. $script
|
||||
}
|
||||
}
|
||||
|
||||
function Build {
|
||||
$toolsetBuildProj = InitializeToolset
|
||||
InitializeCustomToolset
|
||||
|
||||
$bl = if ($binaryLog) { '/bl:' + (Join-Path $LogDir 'Build.binlog') } else { '' }
|
||||
$platformArg = if ($platform) { "/p:Platform=$platform" } else { '' }
|
||||
|
||||
if ($projects) {
|
||||
# Re-assign properties to a new variable because PowerShell doesn't let us append properties directly for unclear reasons.
|
||||
# Explicitly set the type as string[] because otherwise PowerShell would make this char[] if $properties is empty.
|
||||
[string[]] $msbuildArgs = $properties
|
||||
|
||||
# Resolve relative project paths into full paths
|
||||
$projects = ($projects.Split(';').ForEach({Resolve-Path $_}) -join ';')
|
||||
|
||||
$msbuildArgs += "/p:Projects=$projects"
|
||||
$properties = $msbuildArgs
|
||||
}
|
||||
|
||||
MSBuild $toolsetBuildProj `
|
||||
$bl `
|
||||
$platformArg `
|
||||
/p:Configuration=$configuration `
|
||||
/p:RepoRoot=$RepoRoot `
|
||||
/p:Restore=$restore `
|
||||
/p:DeployDeps=$deployDeps `
|
||||
/p:Build=$build `
|
||||
/p:Rebuild=$rebuild `
|
||||
/p:Deploy=$deploy `
|
||||
/p:Test=$test `
|
||||
/p:Pack=$pack `
|
||||
/p:IntegrationTest=$integrationTest `
|
||||
/p:PerformanceTest=$performanceTest `
|
||||
/p:Sign=$sign `
|
||||
/p:Publish=$publish `
|
||||
@properties
|
||||
}
|
||||
|
||||
try {
|
||||
if ($clean) {
|
||||
if (Test-Path $ArtifactsDir) {
|
||||
Remove-Item -Recurse -Force $ArtifactsDir
|
||||
Write-Host 'Artifacts directory deleted.'
|
||||
}
|
||||
exit 0
|
||||
}
|
||||
|
||||
if ($help -or (($null -ne $properties) -and ($properties.Contains('/help') -or $properties.Contains('/?')))) {
|
||||
Print-Usage
|
||||
exit 0
|
||||
}
|
||||
|
||||
if ($ci) {
|
||||
if (-not $excludeCIBinarylog) {
|
||||
$binaryLog = $true
|
||||
}
|
||||
$nodeReuse = $false
|
||||
}
|
||||
|
||||
if ($restore) {
|
||||
InitializeNativeTools
|
||||
}
|
||||
|
||||
Build
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'InitializeToolset' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
ExitWithExitCode 0
|
||||
|
|
|
@ -26,11 +26,13 @@ usage()
|
|||
echo " --pack Package build outputs into NuGet packages and Willow components"
|
||||
echo " --sign Sign build outputs"
|
||||
echo " --publish Publish artifacts (e.g. symbols)"
|
||||
echo " --clean Clean the solution"
|
||||
echo ""
|
||||
|
||||
echo "Advanced settings:"
|
||||
echo " --projects <value> Project or solution file(s) to build"
|
||||
echo " --ci Set when running on CI server"
|
||||
echo " --excludeCIBinarylog Don't output binary log (short: -nobl)"
|
||||
echo " --prepareMachine Prepare machine for CI run, clean up processes after build"
|
||||
echo " --nodeReuse <value> Sets nodereuse msbuild parameter ('true' or 'false')"
|
||||
echo " --warnAsError <value> Sets warnaserror msbuild parameter ('true' or 'false')"
|
||||
|
@ -62,26 +64,32 @@ publish=false
|
|||
sign=false
|
||||
public=false
|
||||
ci=false
|
||||
clean=false
|
||||
|
||||
warn_as_error=true
|
||||
node_reuse=true
|
||||
binary_log=false
|
||||
exclude_ci_binary_log=false
|
||||
pipelines_log=false
|
||||
|
||||
projects=''
|
||||
configuration='Debug'
|
||||
prepare_machine=false
|
||||
verbosity='minimal'
|
||||
runtime_source_feed=''
|
||||
runtime_source_feed_key=''
|
||||
|
||||
properties=''
|
||||
|
||||
while [[ $# > 0 ]]; do
|
||||
opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')"
|
||||
opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")"
|
||||
case "$opt" in
|
||||
-help|-h)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
-clean)
|
||||
clean=true
|
||||
;;
|
||||
-configuration|-c)
|
||||
configuration=$2
|
||||
shift
|
||||
|
@ -93,6 +101,9 @@ while [[ $# > 0 ]]; do
|
|||
-binarylog|-bl)
|
||||
binary_log=true
|
||||
;;
|
||||
-excludeCIBinarylog|-nobl)
|
||||
exclude_ci_binary_log=true
|
||||
;;
|
||||
-pipelineslog|-pl)
|
||||
pipelines_log=true
|
||||
;;
|
||||
|
@ -141,6 +152,14 @@ while [[ $# > 0 ]]; do
|
|||
node_reuse=$2
|
||||
shift
|
||||
;;
|
||||
-runtimesourcefeed)
|
||||
runtime_source_feed=$2
|
||||
shift
|
||||
;;
|
||||
-runtimesourcefeedkey)
|
||||
runtime_source_feed_key=$2
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
properties="$properties $1"
|
||||
;;
|
||||
|
@ -151,8 +170,10 @@ done
|
|||
|
||||
if [[ "$ci" == true ]]; then
|
||||
pipelines_log=true
|
||||
binary_log=true
|
||||
node_reuse=false
|
||||
if [[ "$exclude_ci_binary_log" == false ]]; then
|
||||
binary_log=true
|
||||
fi
|
||||
fi
|
||||
|
||||
. "$scriptroot/tools.sh"
|
||||
|
@ -196,20 +217,15 @@ function Build {
|
|||
ExitWithExitCode 0
|
||||
}
|
||||
|
||||
# Import custom tools configuration, if present in the repo.
|
||||
configure_toolset_script="$eng_root/configure-toolset.sh"
|
||||
if [[ -a "$configure_toolset_script" ]]; then
|
||||
. "$configure_toolset_script"
|
||||
if [[ "$clean" == true ]]; then
|
||||
if [ -d "$artifacts_dir" ]; then
|
||||
rm -rf $artifacts_dir
|
||||
echo "Artifacts directory deleted."
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# TODO: https://github.com/dotnet/arcade/issues/1468
|
||||
# Temporary workaround to avoid breaking change.
|
||||
# Remove once repos are updated.
|
||||
if [[ -n "${useInstalledDotNetCli:-}" ]]; then
|
||||
use_installed_dotnet_cli="$useInstalledDotNetCli"
|
||||
fi
|
||||
|
||||
if [[ "$restore" == true && -z ${DisableNativeToolsetInstalls:-} ]]; then
|
||||
if [[ "$restore" == true ]]; then
|
||||
InitializeNativeTools
|
||||
fi
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
# Debian (sid) # UNSTABLE
|
||||
deb http://ftp.debian.org/debian/ sid main contrib non-free
|
||||
deb-src http://ftp.debian.org/debian/ sid main contrib non-free
|
||||
# Debian (sid) # UNSTABLE
|
||||
deb http://ftp.debian.org/debian/ sid main contrib non-free
|
||||
deb-src http://ftp.debian.org/debian/ sid main contrib non-free
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
deb http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse
|
|
@ -1,11 +1,11 @@
|
|||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse
|
|
@ -1,11 +1,11 @@
|
|||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
From e72c9d7ead60e3317bd6d1fade995c07021c947b Mon Sep 17 00:00:00 2001
|
||||
From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
|
||||
Date: Thu, 7 May 2015 13:25:04 -0400
|
||||
Subject: [PATCH] Fix: building probe providers with C++ compiler
|
||||
|
||||
Robert Daniels wrote:
|
||||
> > I'm attempting to use lttng userspace tracing with a C++ application
|
||||
> > on an ARM platform. I'm using GCC 4.8.4 on Linux 3.14 with the 2.6
|
||||
> > release of lttng. I've compiled lttng-modules, lttng-ust, and
|
||||
> > lttng-tools and have been able to get a simple test working with C
|
||||
> > code. When I attempt to run the hello.cxx test on my target it will
|
||||
> > segfault.
|
||||
>
|
||||
>
|
||||
> I spent a little time digging into this issue and finally discovered the
|
||||
> cause of my segfault with ARM C++ tracepoints.
|
||||
>
|
||||
> There is a struct called 'lttng_event' in ust-events.h which contains an
|
||||
> empty union 'u'. This was the cause of my issue. Under C, this empty union
|
||||
> compiles to a zero byte member while under C++ it compiles to a one byte
|
||||
> member, and in my case was four-byte aligned which caused my C++ code to
|
||||
> have the 'cds_list_head node' offset incorrectly by four bytes. This lead
|
||||
> to an incorrect linked list structure which caused my issue.
|
||||
>
|
||||
> Since this union is empty, I simply removed it from the struct and everything
|
||||
> worked correctly.
|
||||
>
|
||||
> I don't know the history or purpose behind this empty union so I'd like to
|
||||
> know if this is a safe fix. If it is I can submit a patch with the union
|
||||
> removed.
|
||||
|
||||
That's a very nice catch!
|
||||
|
||||
We do not support building tracepoint probe provider with
|
||||
g++ yet, as stated in lttng-ust(3):
|
||||
|
||||
"- Note for C++ support: although an application instrumented with
|
||||
tracepoints can be compiled with g++, tracepoint probes should be
|
||||
compiled with gcc (only tested with gcc so far)."
|
||||
|
||||
However, if it works fine with this fix, then I'm tempted to take it,
|
||||
especially because removing the empty union does not appear to affect
|
||||
the layout of struct lttng_event as seen from liblttng-ust, which must
|
||||
be compiled with a C compiler, and from probe providers compiled with
|
||||
a C compiler. So all we are changing is the layout of a probe provider
|
||||
compiled with a C++ compiler, which is anyway buggy at the moment,
|
||||
because it is not compatible with the layout expected by liblttng-ust
|
||||
compiled with a C compiler.
|
||||
|
||||
Reported-by: Robert Daniels <robert.daniels@vantagecontrols.com>
|
||||
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
|
||||
---
|
||||
include/lttng/ust-events.h | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/usr/include/lttng/ust-events.h b/usr/include/lttng/ust-events.h
|
||||
index 328a875..3d7a274 100644
|
||||
--- a/usr/include/lttng/ust-events.h
|
||||
+++ b/usr/include/lttng/ust-events.h
|
||||
@@ -407,8 +407,6 @@ struct lttng_event {
|
||||
void *_deprecated1;
|
||||
struct lttng_ctx *ctx;
|
||||
enum lttng_ust_instrumentation instrumentation;
|
||||
- union {
|
||||
- } u;
|
||||
struct cds_list_head node; /* Event list in session */
|
||||
struct cds_list_head _deprecated2;
|
||||
void *_deprecated3;
|
||||
--
|
||||
2.7.4
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
diff -u -r a/usr/include/urcu/uatomic/generic.h b/usr/include/urcu/uatomic/generic.h
|
||||
--- a/usr/include/urcu/uatomic/generic.h 2014-03-28 06:04:42.000000000 +0900
|
||||
+++ b/usr/include/urcu/uatomic/generic.h 2017-02-13 10:35:21.189927116 +0900
|
||||
@@ -65,17 +65,17 @@
|
||||
switch (len) {
|
||||
#ifdef UATOMIC_HAS_ATOMIC_BYTE
|
||||
case 1:
|
||||
- return __sync_val_compare_and_swap_1(addr, old, _new);
|
||||
+ return __sync_val_compare_and_swap_1((uint8_t *) addr, old, _new);
|
||||
#endif
|
||||
#ifdef UATOMIC_HAS_ATOMIC_SHORT
|
||||
case 2:
|
||||
- return __sync_val_compare_and_swap_2(addr, old, _new);
|
||||
+ return __sync_val_compare_and_swap_2((uint16_t *) addr, old, _new);
|
||||
#endif
|
||||
case 4:
|
||||
- return __sync_val_compare_and_swap_4(addr, old, _new);
|
||||
+ return __sync_val_compare_and_swap_4((uint32_t *) addr, old, _new);
|
||||
#if (CAA_BITS_PER_LONG == 64)
|
||||
case 8:
|
||||
- return __sync_val_compare_and_swap_8(addr, old, _new);
|
||||
+ return __sync_val_compare_and_swap_8((uint64_t *) addr, old, _new);
|
||||
#endif
|
||||
}
|
||||
_uatomic_link_error();
|
||||
@@ -100,20 +100,20 @@
|
||||
switch (len) {
|
||||
#ifdef UATOMIC_HAS_ATOMIC_BYTE
|
||||
case 1:
|
||||
- __sync_and_and_fetch_1(addr, val);
|
||||
+ __sync_and_and_fetch_1((uint8_t *) addr, val);
|
||||
return;
|
||||
#endif
|
||||
#ifdef UATOMIC_HAS_ATOMIC_SHORT
|
||||
case 2:
|
||||
- __sync_and_and_fetch_2(addr, val);
|
||||
+ __sync_and_and_fetch_2((uint16_t *) addr, val);
|
||||
return;
|
||||
#endif
|
||||
case 4:
|
||||
- __sync_and_and_fetch_4(addr, val);
|
||||
+ __sync_and_and_fetch_4((uint32_t *) addr, val);
|
||||
return;
|
||||
#if (CAA_BITS_PER_LONG == 64)
|
||||
case 8:
|
||||
- __sync_and_and_fetch_8(addr, val);
|
||||
+ __sync_and_and_fetch_8((uint64_t *) addr, val);
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
@@ -139,20 +139,20 @@
|
||||
switch (len) {
|
||||
#ifdef UATOMIC_HAS_ATOMIC_BYTE
|
||||
case 1:
|
||||
- __sync_or_and_fetch_1(addr, val);
|
||||
+ __sync_or_and_fetch_1((uint8_t *) addr, val);
|
||||
return;
|
||||
#endif
|
||||
#ifdef UATOMIC_HAS_ATOMIC_SHORT
|
||||
case 2:
|
||||
- __sync_or_and_fetch_2(addr, val);
|
||||
+ __sync_or_and_fetch_2((uint16_t *) addr, val);
|
||||
return;
|
||||
#endif
|
||||
case 4:
|
||||
- __sync_or_and_fetch_4(addr, val);
|
||||
+ __sync_or_and_fetch_4((uint32_t *) addr, val);
|
||||
return;
|
||||
#if (CAA_BITS_PER_LONG == 64)
|
||||
case 8:
|
||||
- __sync_or_and_fetch_8(addr, val);
|
||||
+ __sync_or_and_fetch_8((uint64_t *) addr, val);
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
@@ -180,17 +180,17 @@
|
||||
switch (len) {
|
||||
#ifdef UATOMIC_HAS_ATOMIC_BYTE
|
||||
case 1:
|
||||
- return __sync_add_and_fetch_1(addr, val);
|
||||
+ return __sync_add_and_fetch_1((uint8_t *) addr, val);
|
||||
#endif
|
||||
#ifdef UATOMIC_HAS_ATOMIC_SHORT
|
||||
case 2:
|
||||
- return __sync_add_and_fetch_2(addr, val);
|
||||
+ return __sync_add_and_fetch_2((uint16_t *) addr, val);
|
||||
#endif
|
||||
case 4:
|
||||
- return __sync_add_and_fetch_4(addr, val);
|
||||
+ return __sync_add_and_fetch_4((uint32_t *) addr, val);
|
||||
#if (CAA_BITS_PER_LONG == 64)
|
||||
case 8:
|
||||
- return __sync_add_and_fetch_8(addr, val);
|
||||
+ return __sync_add_and_fetch_8((uint64_t *) addr, val);
|
||||
#endif
|
||||
}
|
||||
_uatomic_link_error();
|
|
@ -1,11 +1,11 @@
|
|||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
deb http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse
|
|
@ -1,11 +1,11 @@
|
|||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse
|
|
@ -1,11 +1,11 @@
|
|||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
diff -u -r a/usr/include/urcu/uatomic/generic.h b/usr/include/urcu/uatomic/generic.h
|
||||
--- a/usr/include/urcu/uatomic/generic.h 2014-10-22 15:00:58.000000000 -0700
|
||||
+++ b/usr/include/urcu/uatomic/generic.h 2020-10-30 21:38:28.550000000 -0700
|
||||
@@ -69,10 +69,10 @@
|
||||
#endif
|
||||
#ifdef UATOMIC_HAS_ATOMIC_SHORT
|
||||
case 2:
|
||||
- return __sync_val_compare_and_swap_2(addr, old, _new);
|
||||
+ return __sync_val_compare_and_swap_2((uint16_t*) addr, old, _new);
|
||||
#endif
|
||||
case 4:
|
||||
- return __sync_val_compare_and_swap_4(addr, old, _new);
|
||||
+ return __sync_val_compare_and_swap_4((uint32_t*) addr, old, _new);
|
||||
#if (CAA_BITS_PER_LONG == 64)
|
||||
case 8:
|
||||
return __sync_val_compare_and_swap_8(addr, old, _new);
|
||||
@@ -109,7 +109,7 @@
|
||||
return;
|
||||
#endif
|
||||
case 4:
|
||||
- __sync_and_and_fetch_4(addr, val);
|
||||
+ __sync_and_and_fetch_4((uint32_t*) addr, val);
|
||||
return;
|
||||
#if (CAA_BITS_PER_LONG == 64)
|
||||
case 8:
|
||||
@@ -148,7 +148,7 @@
|
||||
return;
|
||||
#endif
|
||||
case 4:
|
||||
- __sync_or_and_fetch_4(addr, val);
|
||||
+ __sync_or_and_fetch_4((uint32_t*) addr, val);
|
||||
return;
|
||||
#if (CAA_BITS_PER_LONG == 64)
|
||||
case 8:
|
||||
@@ -187,7 +187,7 @@
|
||||
return __sync_add_and_fetch_2(addr, val);
|
||||
#endif
|
||||
case 4:
|
||||
- return __sync_add_and_fetch_4(addr, val);
|
||||
+ return __sync_add_and_fetch_4((uint32_t*) addr, val);
|
||||
#if (CAA_BITS_PER_LONG == 64)
|
||||
case 8:
|
||||
return __sync_add_and_fetch_8(addr, val);
|
|
@ -1,3 +1,3 @@
|
|||
# Debian (jessie) # Stable
|
||||
deb http://ftp.debian.org/debian/ jessie main contrib non-free
|
||||
deb-src http://ftp.debian.org/debian/ jessie main contrib non-free
|
||||
# Debian (jessie) # Stable
|
||||
deb http://ftp.debian.org/debian/ jessie main contrib non-free
|
||||
deb-src http://ftp.debian.org/debian/ jessie main contrib non-free
|
||||
|
|
|
@ -9,13 +9,6 @@ if [[ -z "$ROOTFS_DIR" ]]; then
|
|||
exit 1;
|
||||
fi
|
||||
|
||||
# Clean-up (TODO-Cleanup: We may already delete $ROOTFS_DIR at ./cross/build-rootfs.sh.)
|
||||
# hk0110
|
||||
if [ -d "$ROOTFS_DIR" ]; then
|
||||
umount $ROOTFS_DIR/*
|
||||
rm -rf $ROOTFS_DIR
|
||||
fi
|
||||
|
||||
TIZEN_TMP_DIR=$ROOTFS_DIR/tizen_tmp
|
||||
mkdir -p $TIZEN_TMP_DIR
|
||||
|
||||
|
@ -37,8 +30,6 @@ rm -rf $TIZEN_TMP_DIR
|
|||
|
||||
# Configure Tizen rootfs
|
||||
echo ">>Start configuring Tizen rootfs"
|
||||
rm ./usr/lib/libunwind.so
|
||||
ln -s libunwind.so.8 ./usr/lib/libunwind.so
|
||||
ln -sfn asm-arm ./usr/include/asm
|
||||
patch -p1 < $__TIZEN_CROSSDIR/tizen.patch
|
||||
echo "<<Finish configuring Tizen rootfs"
|
||||
|
|
|
@ -51,7 +51,7 @@ if [ ! -d $TMPDIR ]; then
|
|||
mkdir -p $TMPDIR
|
||||
fi
|
||||
|
||||
TIZEN_URL=http://download.tizen.org/releases/milestone/tizen
|
||||
TIZEN_URL=http://download.tizen.org/snapshots/tizen
|
||||
BUILD_XML=build.xml
|
||||
REPOMD_XML=repomd.xml
|
||||
PRIMARY_XML=primary.xml
|
||||
|
@ -157,12 +157,11 @@ fetch_tizen_pkgs()
|
|||
Inform "Initialize arm base"
|
||||
fetch_tizen_pkgs_init standard base
|
||||
Inform "fetch common packages"
|
||||
fetch_tizen_pkgs armv7l gcc glibc glibc-devel libicu libicu-devel libatomic
|
||||
fetch_tizen_pkgs noarch linux-glibc-devel
|
||||
fetch_tizen_pkgs armv7l gcc gcc-devel-static glibc glibc-devel libicu libicu-devel libatomic linux-glibc-devel keyutils keyutils-devel libkeyutils
|
||||
Inform "fetch coreclr packages"
|
||||
fetch_tizen_pkgs armv7l lldb lldb-devel libgcc libstdc++ libstdc++-devel libunwind libunwind-devel lttng-ust-devel lttng-ust userspace-rcu-devel userspace-rcu
|
||||
Inform "fetch corefx packages"
|
||||
fetch_tizen_pkgs armv7l libcom_err libcom_err-devel zlib zlib-devel libopenssl libopenssl-devel krb5 krb5-devel libcurl libcurl-devel
|
||||
fetch_tizen_pkgs armv7l libcom_err libcom_err-devel zlib zlib-devel libopenssl11 libopenssl1.1-devel krb5 krb5-devel
|
||||
|
||||
Inform "Initialize standard unified"
|
||||
fetch_tizen_pkgs_init standard unified
|
||||
|
|
|
@ -1,50 +1,50 @@
|
|||
lang en_US.UTF-8
|
||||
keyboard us
|
||||
timezone --utc Asia/Seoul
|
||||
|
||||
part / --fstype="ext4" --size=3500 --ondisk=mmcblk0 --label rootfs --fsoptions=defaults,noatime
|
||||
|
||||
rootpw tizen
|
||||
desktop --autologinuser=root
|
||||
user --name root --groups audio,video --password 'tizen'
|
||||
|
||||
repo --name=standard --baseurl=http://download.tizen.org/releases/milestone/tizen/unified/latest/repos/standard/packages/ --ssl_verify=no
|
||||
repo --name=base --baseurl=http://download.tizen.org/releases/milestone/tizen/base/latest/repos/standard/packages/ --ssl_verify=no
|
||||
|
||||
%packages
|
||||
tar
|
||||
gzip
|
||||
|
||||
sed
|
||||
grep
|
||||
gawk
|
||||
perl
|
||||
|
||||
binutils
|
||||
findutils
|
||||
util-linux
|
||||
lttng-ust
|
||||
userspace-rcu
|
||||
procps-ng
|
||||
tzdata
|
||||
ca-certificates
|
||||
|
||||
|
||||
### Core FX
|
||||
libicu
|
||||
libunwind
|
||||
iputils
|
||||
zlib
|
||||
krb5
|
||||
libcurl
|
||||
libopenssl
|
||||
|
||||
%end
|
||||
|
||||
%post
|
||||
|
||||
### Update /tmp privilege
|
||||
chmod 777 /tmp
|
||||
####################################
|
||||
|
||||
%end
|
||||
lang en_US.UTF-8
|
||||
keyboard us
|
||||
timezone --utc Asia/Seoul
|
||||
|
||||
part / --fstype="ext4" --size=3500 --ondisk=mmcblk0 --label rootfs --fsoptions=defaults,noatime
|
||||
|
||||
rootpw tizen
|
||||
desktop --autologinuser=root
|
||||
user --name root --groups audio,video --password 'tizen'
|
||||
|
||||
repo --name=standard --baseurl=http://download.tizen.org/releases/milestone/tizen/unified/latest/repos/standard/packages/ --ssl_verify=no
|
||||
repo --name=base --baseurl=http://download.tizen.org/releases/milestone/tizen/base/latest/repos/standard/packages/ --ssl_verify=no
|
||||
|
||||
%packages
|
||||
tar
|
||||
gzip
|
||||
|
||||
sed
|
||||
grep
|
||||
gawk
|
||||
perl
|
||||
|
||||
binutils
|
||||
findutils
|
||||
util-linux
|
||||
lttng-ust
|
||||
userspace-rcu
|
||||
procps-ng
|
||||
tzdata
|
||||
ca-certificates
|
||||
|
||||
|
||||
### Core FX
|
||||
libicu
|
||||
libunwind
|
||||
iputils
|
||||
zlib
|
||||
krb5
|
||||
libcurl
|
||||
libopenssl
|
||||
|
||||
%end
|
||||
|
||||
%post
|
||||
|
||||
### Update /tmp privilege
|
||||
chmod 777 /tmp
|
||||
####################################
|
||||
|
||||
%end
|
||||
|
|
|
@ -1,18 +1,9 @@
|
|||
diff -u -r a/usr/lib/libc.so b/usr/lib/libc.so
|
||||
--- a/usr/lib/libc.so 2016-12-30 23:00:08.284951863 +0900
|
||||
+++ b/usr/lib/libc.so 2016-12-30 23:00:32.140951815 +0900
|
||||
@@ -2,4 +2,4 @@
|
||||
Use the shared library, but some functions are only in
|
||||
the static library, so try that secondarily. */
|
||||
OUTPUT_FORMAT(elf32-littlearm)
|
||||
-GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.3 ) )
|
||||
+GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.3 ) )
|
||||
diff -u -r a/usr/lib/libpthread.so b/usr/lib/libpthread.so
|
||||
--- a/usr/lib/libpthread.so 2016-12-30 23:00:19.408951841 +0900
|
||||
+++ b/usr/lib/libpthread.so 2016-12-30 23:00:39.068951801 +0900
|
||||
@@ -2,4 +2,4 @@
|
||||
Use the shared library, but some functions are only in
|
||||
the static library, so try that secondarily. */
|
||||
OUTPUT_FORMAT(elf32-littlearm)
|
||||
-GROUP ( /lib/libpthread.so.0 /usr/lib/libpthread_nonshared.a )
|
||||
+GROUP ( libpthread.so.0 libpthread_nonshared.a )
|
||||
diff -u -r a/usr/lib/libc.so b/usr/lib/libc.so
|
||||
--- a/usr/lib/libc.so 2016-12-30 23:00:08.284951863 +0900
|
||||
+++ b/usr/lib/libc.so 2016-12-30 23:00:32.140951815 +0900
|
||||
@@ -2,4 +2,4 @@
|
||||
Use the shared library, but some functions are only in
|
||||
the static library, so try that secondarily. */
|
||||
OUTPUT_FORMAT(elf32-littlearm)
|
||||
-GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.3 ) )
|
||||
+GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.3 ) )
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
|
||||
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
|
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
__NDK_Version=r14
|
||||
__NDK_Version=r21
|
||||
|
||||
usage()
|
||||
{
|
||||
|
@ -16,18 +16,18 @@ usage()
|
|||
echo.
|
||||
echo "By default, the NDK will be downloaded into the cross/android-rootfs/android-ndk-$__NDK_Version directory. If you already have an NDK installation,"
|
||||
echo "you can set the NDK_DIR environment variable to have this script use that installation of the NDK."
|
||||
echo "By default, this script will generate a file, android_platform, in the root of the ROOTFS_DIR directory that contains the RID for the supported and tested Android build: android.21-arm64. This file is to replace '/etc/os-release', which is not available for Android."
|
||||
echo "By default, this script will generate a file, android_platform, in the root of the ROOTFS_DIR directory that contains the RID for the supported and tested Android build: android.28-arm64. This file is to replace '/etc/os-release', which is not available for Android."
|
||||
exit 1
|
||||
}
|
||||
|
||||
__ApiLevel=21 # The minimum platform for arm64 is API level 21
|
||||
__ApiLevel=28 # The minimum platform for arm64 is API level 21 but the minimum version that support glob(3) is 28. See $ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/glob.h
|
||||
__BuildArch=arm64
|
||||
__AndroidArch=aarch64
|
||||
__AndroidToolchain=aarch64-linux-android
|
||||
|
||||
for i in "$@"
|
||||
do
|
||||
lowerI="$(echo $i | awk '{print tolower($0)}')"
|
||||
lowerI="$(echo $i | tr "[:upper:]" "[:lower:]")"
|
||||
case $lowerI in
|
||||
-?|-h|--help)
|
||||
usage
|
||||
|
@ -53,13 +53,20 @@ for i in "$@"
|
|||
done
|
||||
|
||||
# Obtain the location of the bash script to figure out where the root of the repo is.
|
||||
__CrossDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
__ScriptBaseDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
__Android_Cross_Dir="$__CrossDir/android-rootfs"
|
||||
__NDK_Dir="$__Android_Cross_Dir/android-ndk-$__NDK_Version"
|
||||
__libunwind_Dir="$__Android_Cross_Dir/libunwind"
|
||||
__lldb_Dir="$__Android_Cross_Dir/lldb"
|
||||
__ToolchainDir="$__Android_Cross_Dir/toolchain/$__BuildArch"
|
||||
__CrossDir="$__ScriptBaseDir/../../../.tools/android-rootfs"
|
||||
|
||||
if [[ ! -f "$__CrossDir" ]]; then
|
||||
mkdir -p "$__CrossDir"
|
||||
fi
|
||||
|
||||
# Resolve absolute path to avoid `../` in build logs
|
||||
__CrossDir="$( cd "$__CrossDir" && pwd )"
|
||||
|
||||
__NDK_Dir="$__CrossDir/android-ndk-$__NDK_Version"
|
||||
__lldb_Dir="$__CrossDir/lldb"
|
||||
__ToolchainDir="$__CrossDir/android-ndk-$__NDK_Version"
|
||||
|
||||
if [[ -n "$TOOLCHAIN_DIR" ]]; then
|
||||
__ToolchainDir=$TOOLCHAIN_DIR
|
||||
|
@ -78,60 +85,47 @@ echo "Target Toolchain location: $__ToolchainDir"
|
|||
if [ ! -d $__NDK_Dir ]; then
|
||||
echo Downloading the NDK into $__NDK_Dir
|
||||
mkdir -p $__NDK_Dir
|
||||
wget -nv -nc --show-progress https://dl.google.com/android/repository/android-ndk-$__NDK_Version-linux-x86_64.zip -O $__Android_Cross_Dir/android-ndk-$__NDK_Version-linux-x86_64.zip
|
||||
unzip -q $__Android_Cross_Dir/android-ndk-$__NDK_Version-linux-x86_64.zip -d $__Android_Cross_Dir
|
||||
wget -q --progress=bar:force:noscroll --show-progress https://dl.google.com/android/repository/android-ndk-$__NDK_Version-linux-x86_64.zip -O $__CrossDir/android-ndk-$__NDK_Version-linux-x86_64.zip
|
||||
unzip -q $__CrossDir/android-ndk-$__NDK_Version-linux-x86_64.zip -d $__CrossDir
|
||||
fi
|
||||
|
||||
if [ ! -d $__lldb_Dir ]; then
|
||||
mkdir -p $__lldb_Dir
|
||||
echo Downloading LLDB into $__lldb_Dir
|
||||
wget -nv -nc --show-progress https://dl.google.com/android/repository/lldb-2.3.3614996-linux-x86_64.zip -O $__Android_Cross_Dir/lldb-2.3.3614996-linux-x86_64.zip
|
||||
unzip -q $__Android_Cross_Dir/lldb-2.3.3614996-linux-x86_64.zip -d $__lldb_Dir
|
||||
wget -q --progress=bar:force:noscroll --show-progress https://dl.google.com/android/repository/lldb-2.3.3614996-linux-x86_64.zip -O $__CrossDir/lldb-2.3.3614996-linux-x86_64.zip
|
||||
unzip -q $__CrossDir/lldb-2.3.3614996-linux-x86_64.zip -d $__lldb_Dir
|
||||
fi
|
||||
|
||||
# Create the RootFS for both arm64 as well as aarch
|
||||
rm -rf $__Android_Cross_Dir/toolchain
|
||||
echo "Download dependencies..."
|
||||
__TmpDir=$__CrossDir/tmp/$__BuildArch/
|
||||
mkdir -p "$__TmpDir"
|
||||
|
||||
echo Generating the $__BuildArch toolchain
|
||||
$__NDK_Dir/build/tools/make_standalone_toolchain.py --arch $__BuildArch --api $__ApiLevel --install-dir $__ToolchainDir
|
||||
# combined dependencies for coreclr, installer and libraries
|
||||
__AndroidPackages="libicu"
|
||||
__AndroidPackages+=" libandroid-glob"
|
||||
__AndroidPackages+=" liblzma"
|
||||
__AndroidPackages+=" krb5"
|
||||
__AndroidPackages+=" openssl"
|
||||
|
||||
# Install the required packages into the toolchain
|
||||
# TODO: Add logic to get latest pkg version instead of specific version number
|
||||
rm -rf $__Android_Cross_Dir/deb/
|
||||
rm -rf $__Android_Cross_Dir/tmp
|
||||
for path in $(wget -qO- http://termux.net/dists/stable/main/binary-$__AndroidArch/Packages |\
|
||||
grep -A15 "Package: \(${__AndroidPackages// /\\|}\)" | grep -v "static\|tool" | grep Filename); do
|
||||
|
||||
mkdir -p $__Android_Cross_Dir/deb/
|
||||
mkdir -p $__Android_Cross_Dir/tmp/$arch/
|
||||
wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libicu_60.2_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libicu_60.2_$__AndroidArch.deb
|
||||
wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libicu-dev_60.2_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libicu-dev_60.2_$__AndroidArch.deb
|
||||
if [[ "$path" != "Filename:" ]]; then
|
||||
echo "Working on: $path"
|
||||
wget -qO- http://termux.net/$path | dpkg -x - "$__TmpDir"
|
||||
fi
|
||||
done
|
||||
|
||||
wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-glob-dev_0.4_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-glob-dev_0.4_$__AndroidArch.deb
|
||||
wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-glob_0.4_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-glob_0.4_$__AndroidArch.deb
|
||||
wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-support-dev_22_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-support-dev_22_$__AndroidArch.deb
|
||||
wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-support_22_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-support_22_$__AndroidArch.deb
|
||||
wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/liblzma-dev_5.2.3_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/liblzma-dev_5.2.3_$__AndroidArch.deb
|
||||
wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/liblzma_5.2.3_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/liblzma_5.2.3_$__AndroidArch.deb
|
||||
wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libunwind-dev_1.2.20170304_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libunwind-dev_1.2.20170304_$__AndroidArch.deb
|
||||
wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libunwind_1.2.20170304_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libunwind_1.2.20170304_$__AndroidArch.deb
|
||||
|
||||
echo Unpacking Termux packages
|
||||
dpkg -x $__Android_Cross_Dir/deb/libicu_60.2_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/
|
||||
dpkg -x $__Android_Cross_Dir/deb/libicu-dev_60.2_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/
|
||||
dpkg -x $__Android_Cross_Dir/deb/libandroid-glob-dev_0.4_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/
|
||||
dpkg -x $__Android_Cross_Dir/deb/libandroid-glob_0.4_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/
|
||||
dpkg -x $__Android_Cross_Dir/deb/libandroid-support-dev_22_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/
|
||||
dpkg -x $__Android_Cross_Dir/deb/libandroid-support_22_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/
|
||||
dpkg -x $__Android_Cross_Dir/deb/liblzma-dev_5.2.3_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/
|
||||
dpkg -x $__Android_Cross_Dir/deb/liblzma_5.2.3_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/
|
||||
dpkg -x $__Android_Cross_Dir/deb/libunwind-dev_1.2.20170304_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/
|
||||
dpkg -x $__Android_Cross_Dir/deb/libunwind_1.2.20170304_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/
|
||||
|
||||
cp -R $__Android_Cross_Dir/tmp/$__AndroidArch/data/data/com.termux/files/usr/* $__ToolchainDir/sysroot/usr/
|
||||
cp -R "$__TmpDir/data/data/com.termux/files/usr/"* "$__ToolchainDir/sysroot/usr/"
|
||||
|
||||
# Generate platform file for build.sh script to assign to __DistroRid
|
||||
echo "Generating platform file..."
|
||||
echo "RID=android.${__ApiLevel}-${__BuildArch}" > $__ToolchainDir/sysroot/android_platform
|
||||
|
||||
echo "RID=android.21-arm64" > $__ToolchainDir/sysroot/android_platform
|
||||
echo Now run:
|
||||
echo CONFIG_DIR=\`realpath cross/android/$__BuildArch\` ROOTFS_DIR=\`realpath $__ToolchainDir/sysroot\` ./build.sh cross $__BuildArch skipgenerateversion skipnuget cmakeargs -DENABLE_LLDBPLUGIN=0
|
||||
|
||||
echo "Now to build coreclr, libraries and installers; run:"
|
||||
echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \
|
||||
--subsetCategory coreclr
|
||||
echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \
|
||||
--subsetCategory libraries
|
||||
echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \
|
||||
--subsetCategory installer
|
||||
|
|
|
@ -1,19 +1,26 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
usage()
|
||||
{
|
||||
echo "Usage: $0 [BuildArch] [LinuxCodeName] [lldbx.y] [--skipunmount] --rootfsdir <directory>]"
|
||||
echo "Usage: $0 [BuildArch] [CodeName] [lldbx.y] [--skipunmount] --rootfsdir <directory>]"
|
||||
echo "BuildArch can be: arm(default), armel, arm64, x86"
|
||||
echo "LinuxCodeName - optional, Code name for Linux, can be: trusty, xenial(default), zesty, bionic, alpine. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen."
|
||||
echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine"
|
||||
echo "CodeName - optional, Code name for Linux, can be: xenial(default), zesty, bionic, alpine, alpine3.13 or alpine3.14. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen."
|
||||
echo " for FreeBSD can be: freebsd12, freebsd13"
|
||||
echo " for illumos can be: illumos."
|
||||
echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine and FreeBSD"
|
||||
echo "--skipunmount - optional, will skip the unmount of rootfs folder."
|
||||
echo "--use-mirror - optional, use mirror URL to fetch resources, when available."
|
||||
exit 1
|
||||
}
|
||||
|
||||
__LinuxCodeName=xenial
|
||||
__CodeName=xenial
|
||||
__CrossDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
__InitialDir=$PWD
|
||||
__BuildArch=arm
|
||||
__AlpineArch=armv7
|
||||
__QEMUArch=arm
|
||||
__UbuntuArch=armhf
|
||||
__UbuntuRepo="http://ports.ubuntu.com/"
|
||||
__LLDB_Package="liblldb-3.9-dev"
|
||||
|
@ -26,7 +33,8 @@ __AlpinePackages="alpine-base"
|
|||
__AlpinePackages+=" build-base"
|
||||
__AlpinePackages+=" linux-headers"
|
||||
__AlpinePackages+=" lldb-dev"
|
||||
__AlpinePackages+=" llvm-dev"
|
||||
__AlpinePackages+=" python3"
|
||||
__AlpinePackages+=" libedit"
|
||||
|
||||
# symlinks fixer
|
||||
__UbuntuPackages+=" symlinks"
|
||||
|
@ -52,13 +60,34 @@ __AlpinePackages+=" krb5-dev"
|
|||
__AlpinePackages+=" openssl-dev"
|
||||
__AlpinePackages+=" zlib-dev"
|
||||
|
||||
__FreeBSDBase="12.3-RELEASE"
|
||||
__FreeBSDPkg="1.17.0"
|
||||
__FreeBSDABI="12"
|
||||
__FreeBSDPackages="libunwind"
|
||||
__FreeBSDPackages+=" icu"
|
||||
__FreeBSDPackages+=" libinotify"
|
||||
__FreeBSDPackages+=" openssl"
|
||||
__FreeBSDPackages+=" krb5"
|
||||
__FreeBSDPackages+=" terminfo-db"
|
||||
|
||||
__IllumosPackages="icu-64.2nb2"
|
||||
__IllumosPackages+=" mit-krb5-1.16.2nb4"
|
||||
__IllumosPackages+=" openssl-1.1.1e"
|
||||
__IllumosPackages+=" zlib-1.2.11"
|
||||
|
||||
# ML.NET dependencies
|
||||
__UbuntuPackages+=" libomp5"
|
||||
__UbuntuPackages+=" libomp-dev"
|
||||
|
||||
__UseMirror=0
|
||||
|
||||
__UnprocessedBuildArgs=
|
||||
while :; do
|
||||
if [ $# -le 0 ]; then
|
||||
break
|
||||
fi
|
||||
|
||||
lowerI="$(echo $1 | awk '{print tolower($0)}')"
|
||||
lowerI="$(echo $1 | tr "[:upper:]" "[:lower:]")"
|
||||
case $lowerI in
|
||||
-?|-h|--help)
|
||||
usage
|
||||
|
@ -67,9 +96,18 @@ while :; do
|
|||
arm)
|
||||
__BuildArch=arm
|
||||
__UbuntuArch=armhf
|
||||
__AlpineArch=armhf
|
||||
__AlpineArch=armv7
|
||||
__QEMUArch=arm
|
||||
;;
|
||||
armv6)
|
||||
__BuildArch=armv6
|
||||
__UbuntuArch=armhf
|
||||
__QEMUArch=arm
|
||||
__UbuntuRepo="http://raspbian.raspberrypi.org/raspbian/"
|
||||
__CodeName=buster
|
||||
__LLDB_Package="liblldb-6.0-dev"
|
||||
__Keyring="/usr/share/keyrings/raspbian-archive-keyring.gpg"
|
||||
;;
|
||||
arm64)
|
||||
__BuildArch=arm64
|
||||
__UbuntuArch=arm64
|
||||
|
@ -80,7 +118,25 @@ while :; do
|
|||
__BuildArch=armel
|
||||
__UbuntuArch=armel
|
||||
__UbuntuRepo="http://ftp.debian.org/debian/"
|
||||
__LinuxCodeName=jessie
|
||||
__CodeName=jessie
|
||||
;;
|
||||
ppc64le)
|
||||
__BuildArch=ppc64le
|
||||
__UbuntuArch=ppc64el
|
||||
__UbuntuRepo="http://ports.ubuntu.com/ubuntu-ports/"
|
||||
__UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libunwind8-dev//')
|
||||
__UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libomp-dev//')
|
||||
__UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libomp5//')
|
||||
unset __LLDB_Package
|
||||
;;
|
||||
s390x)
|
||||
__BuildArch=s390x
|
||||
__UbuntuArch=s390x
|
||||
__UbuntuRepo="http://ports.ubuntu.com/ubuntu-ports/"
|
||||
__UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libunwind8-dev//')
|
||||
__UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libomp-dev//')
|
||||
__UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libomp5//')
|
||||
unset __LLDB_Package
|
||||
;;
|
||||
x86)
|
||||
__BuildArch=x86
|
||||
|
@ -108,53 +164,73 @@ while :; do
|
|||
no-lldb)
|
||||
unset __LLDB_Package
|
||||
;;
|
||||
trusty) # Ubuntu 14.04
|
||||
if [ "$__LinuxCodeName" != "jessie" ]; then
|
||||
__LinuxCodeName=trusty
|
||||
fi
|
||||
;;
|
||||
xenial) # Ubuntu 16.04
|
||||
if [ "$__LinuxCodeName" != "jessie" ]; then
|
||||
__LinuxCodeName=xenial
|
||||
if [ "$__CodeName" != "jessie" ]; then
|
||||
__CodeName=xenial
|
||||
fi
|
||||
;;
|
||||
zesty) # Ubuntu 17.04
|
||||
if [ "$__LinuxCodeName" != "jessie" ]; then
|
||||
__LinuxCodeName=zesty
|
||||
if [ "$__CodeName" != "jessie" ]; then
|
||||
__CodeName=zesty
|
||||
fi
|
||||
;;
|
||||
bionic) # Ubuntu 18.04
|
||||
if [ "$__LinuxCodeName" != "jessie" ]; then
|
||||
__LinuxCodeName=bionic
|
||||
if [ "$__CodeName" != "jessie" ]; then
|
||||
__CodeName=bionic
|
||||
fi
|
||||
;;
|
||||
jessie) # Debian 8
|
||||
__LinuxCodeName=jessie
|
||||
__CodeName=jessie
|
||||
__UbuntuRepo="http://ftp.debian.org/debian/"
|
||||
;;
|
||||
stretch) # Debian 9
|
||||
__LinuxCodeName=stretch
|
||||
__CodeName=stretch
|
||||
__UbuntuRepo="http://ftp.debian.org/debian/"
|
||||
__LLDB_Package="liblldb-6.0-dev"
|
||||
;;
|
||||
buster) # Debian 10
|
||||
__LinuxCodeName=buster
|
||||
__CodeName=buster
|
||||
__UbuntuRepo="http://ftp.debian.org/debian/"
|
||||
__LLDB_Package="liblldb-6.0-dev"
|
||||
;;
|
||||
tizen)
|
||||
if [ "$__BuildArch" != "armel" ]; then
|
||||
echo "Tizen is available only for armel."
|
||||
if [ "$__BuildArch" != "arm" ] && [ "$__BuildArch" != "armel" ] && [ "$__BuildArch" != "arm64" ] && [ "$__BuildArch" != "x86" ] ; then
|
||||
echo "Tizen is available only for arm, armel, arm64 and x86."
|
||||
usage;
|
||||
exit 1;
|
||||
fi
|
||||
__LinuxCodeName=
|
||||
__CodeName=
|
||||
__UbuntuRepo=
|
||||
__Tizen=tizen
|
||||
;;
|
||||
alpine)
|
||||
__LinuxCodeName=alpine
|
||||
alpine|alpine3.13)
|
||||
__CodeName=alpine
|
||||
__UbuntuRepo=
|
||||
__AlpineVersion=3.13
|
||||
__AlpinePackages+=" llvm10-libs"
|
||||
;;
|
||||
alpine3.14)
|
||||
__CodeName=alpine
|
||||
__UbuntuRepo=
|
||||
__AlpineVersion=3.14
|
||||
__AlpinePackages+=" llvm11-libs"
|
||||
;;
|
||||
freebsd12)
|
||||
__CodeName=freebsd
|
||||
__BuildArch=x64
|
||||
__SkipUnmount=1
|
||||
;;
|
||||
freebsd13)
|
||||
__CodeName=freebsd
|
||||
__FreeBSDBase="13.0-RELEASE"
|
||||
__FreeBSDABI="13"
|
||||
__BuildArch=x64
|
||||
__SkipUnmount=1
|
||||
;;
|
||||
illumos)
|
||||
__CodeName=illumos
|
||||
__BuildArch=x64
|
||||
__SkipUnmount=1
|
||||
;;
|
||||
--skipunmount)
|
||||
__SkipUnmount=1
|
||||
|
@ -163,6 +239,9 @@ while :; do
|
|||
shift
|
||||
__RootfsDir=$1
|
||||
;;
|
||||
--use-mirror)
|
||||
__UseMirror=1
|
||||
;;
|
||||
*)
|
||||
__UnprocessedBuildArgs="$__UnprocessedBuildArgs $1"
|
||||
;;
|
||||
|
@ -171,6 +250,12 @@ while :; do
|
|||
shift
|
||||
done
|
||||
|
||||
if [ -e "$__Keyring" ]; then
|
||||
__Keyring="--keyring=$__Keyring"
|
||||
else
|
||||
__Keyring=""
|
||||
fi
|
||||
|
||||
if [ "$__BuildArch" == "armel" ]; then
|
||||
__LLDB_Package="lldb-3.5-dev"
|
||||
fi
|
||||
|
@ -186,46 +271,110 @@ fi
|
|||
|
||||
if [ -d "$__RootfsDir" ]; then
|
||||
if [ $__SkipUnmount == 0 ]; then
|
||||
umount $__RootfsDir/*
|
||||
umount $__RootfsDir/* || true
|
||||
fi
|
||||
rm -rf $__RootfsDir
|
||||
fi
|
||||
|
||||
if [[ "$__LinuxCodeName" == "alpine" ]]; then
|
||||
mkdir -p $__RootfsDir
|
||||
__RootfsDir="$( cd "$__RootfsDir" && pwd )"
|
||||
|
||||
if [[ "$__CodeName" == "alpine" ]]; then
|
||||
__ApkToolsVersion=2.9.1
|
||||
__AlpineVersion=3.7
|
||||
__ApkToolsDir=$(mktemp -d)
|
||||
wget https://github.com/alpinelinux/apk-tools/releases/download/v$__ApkToolsVersion/apk-tools-$__ApkToolsVersion-x86_64-linux.tar.gz -P $__ApkToolsDir
|
||||
tar -xf $__ApkToolsDir/apk-tools-$__ApkToolsVersion-x86_64-linux.tar.gz -C $__ApkToolsDir
|
||||
mkdir -p $__RootfsDir/usr/bin
|
||||
cp -v /usr/bin/qemu-$__QEMUArch-static $__RootfsDir/usr/bin
|
||||
|
||||
$__ApkToolsDir/apk-tools-$__ApkToolsVersion/apk \
|
||||
-X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/main \
|
||||
-X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/community \
|
||||
-X http://dl-cdn.alpinelinux.org/alpine/edge/testing \
|
||||
-X http://dl-cdn.alpinelinux.org/alpine/edge/main \
|
||||
-U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \
|
||||
add $__AlpinePackages
|
||||
|
||||
rm -r $__ApkToolsDir
|
||||
elif [[ -n $__LinuxCodeName ]]; then
|
||||
qemu-debootstrap --arch $__UbuntuArch $__LinuxCodeName $__RootfsDir $__UbuntuRepo
|
||||
cp $__CrossDir/$__BuildArch/sources.list.$__LinuxCodeName $__RootfsDir/etc/apt/sources.list
|
||||
elif [[ "$__CodeName" == "freebsd" ]]; then
|
||||
mkdir -p $__RootfsDir/usr/local/etc
|
||||
JOBS="$(getconf _NPROCESSORS_ONLN)"
|
||||
wget -O - https://download.freebsd.org/ftp/releases/amd64/${__FreeBSDBase}/base.txz | tar -C $__RootfsDir -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version
|
||||
echo "ABI = \"FreeBSD:${__FreeBSDABI}:amd64\"; FINGERPRINTS = \"${__RootfsDir}/usr/share/keys\"; REPOS_DIR = [\"${__RootfsDir}/etc/pkg\"]; REPO_AUTOUPDATE = NO; RUN_SCRIPTS = NO;" > ${__RootfsDir}/usr/local/etc/pkg.conf
|
||||
echo "FreeBSD: { url: "pkg+http://pkg.FreeBSD.org/\${ABI}/quarterly", mirror_type: \"srv\", signature_type: \"fingerprints\", fingerprints: \"${__RootfsDir}/usr/share/keys/pkg\", enabled: yes }" > ${__RootfsDir}/etc/pkg/FreeBSD.conf
|
||||
mkdir -p $__RootfsDir/tmp
|
||||
# get and build package manager
|
||||
wget -O - https://github.com/freebsd/pkg/archive/${__FreeBSDPkg}.tar.gz | tar -C $__RootfsDir/tmp -zxf -
|
||||
cd $__RootfsDir/tmp/pkg-${__FreeBSDPkg}
|
||||
# needed for install to succeed
|
||||
mkdir -p $__RootfsDir/host/etc
|
||||
./autogen.sh && ./configure --prefix=$__RootfsDir/host && make -j "$JOBS" && make install
|
||||
rm -rf $__RootfsDir/tmp/pkg-${__FreeBSDPkg}
|
||||
# install packages we need.
|
||||
INSTALL_AS_USER=$(whoami) $__RootfsDir/host/sbin/pkg -r $__RootfsDir -C $__RootfsDir/usr/local/etc/pkg.conf update
|
||||
INSTALL_AS_USER=$(whoami) $__RootfsDir/host/sbin/pkg -r $__RootfsDir -C $__RootfsDir/usr/local/etc/pkg.conf install --yes $__FreeBSDPackages
|
||||
elif [[ "$__CodeName" == "illumos" ]]; then
|
||||
mkdir "$__RootfsDir/tmp"
|
||||
pushd "$__RootfsDir/tmp"
|
||||
JOBS="$(getconf _NPROCESSORS_ONLN)"
|
||||
echo "Downloading sysroot."
|
||||
wget -O - https://github.com/illumos/sysroot/releases/download/20181213-de6af22ae73b-v1/illumos-sysroot-i386-20181213-de6af22ae73b-v1.tar.gz | tar -C "$__RootfsDir" -xzf -
|
||||
echo "Building binutils. Please wait.."
|
||||
wget -O - https://ftp.gnu.org/gnu/binutils/binutils-2.33.1.tar.bz2 | tar -xjf -
|
||||
mkdir build-binutils && cd build-binutils
|
||||
../binutils-2.33.1/configure --prefix="$__RootfsDir" --target="x86_64-sun-solaris2.10" --program-prefix="x86_64-illumos-" --with-sysroot="$__RootfsDir"
|
||||
make -j "$JOBS" && make install && cd ..
|
||||
echo "Building gcc. Please wait.."
|
||||
wget -O - https://ftp.gnu.org/gnu/gcc/gcc-8.4.0/gcc-8.4.0.tar.xz | tar -xJf -
|
||||
CFLAGS="-fPIC"
|
||||
CXXFLAGS="-fPIC"
|
||||
CXXFLAGS_FOR_TARGET="-fPIC"
|
||||
CFLAGS_FOR_TARGET="-fPIC"
|
||||
export CFLAGS CXXFLAGS CXXFLAGS_FOR_TARGET CFLAGS_FOR_TARGET
|
||||
mkdir build-gcc && cd build-gcc
|
||||
../gcc-8.4.0/configure --prefix="$__RootfsDir" --target="x86_64-sun-solaris2.10" --program-prefix="x86_64-illumos-" --with-sysroot="$__RootfsDir" --with-gnu-as \
|
||||
--with-gnu-ld --disable-nls --disable-libgomp --disable-libquadmath --disable-libssp --disable-libvtv --disable-libcilkrts --disable-libada --disable-libsanitizer \
|
||||
--disable-libquadmath-support --disable-shared --enable-tls
|
||||
make -j "$JOBS" && make install && cd ..
|
||||
BaseUrl=https://pkgsrc.joyent.com
|
||||
if [[ "$__UseMirror" == 1 ]]; then
|
||||
BaseUrl=http://pkgsrc.smartos.skylime.net
|
||||
fi
|
||||
BaseUrl="$BaseUrl"/packages/SmartOS/2020Q1/x86_64/All
|
||||
echo "Downloading dependencies."
|
||||
read -ra array <<<"$__IllumosPackages"
|
||||
for package in "${array[@]}"; do
|
||||
echo "Installing $package..."
|
||||
wget "$BaseUrl"/"$package".tgz
|
||||
ar -x "$package".tgz
|
||||
tar --skip-old-files -xzf "$package".tmp.tgz -C "$__RootfsDir" 2>/dev/null
|
||||
done
|
||||
echo "Cleaning up temporary files."
|
||||
popd
|
||||
rm -rf "$__RootfsDir"/{tmp,+*}
|
||||
mkdir -p "$__RootfsDir"/usr/include/net
|
||||
mkdir -p "$__RootfsDir"/usr/include/netpacket
|
||||
wget -P "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/bpf.h
|
||||
wget -P "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/dlt.h
|
||||
wget -P "$__RootfsDir"/usr/include/netpacket https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/inet/sockmods/netpacket/packet.h
|
||||
wget -P "$__RootfsDir"/usr/include/sys https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/sys/sdt.h
|
||||
elif [[ -n $__CodeName ]]; then
|
||||
qemu-debootstrap $__Keyring --arch $__UbuntuArch $__CodeName $__RootfsDir $__UbuntuRepo
|
||||
cp $__CrossDir/$__BuildArch/sources.list.$__CodeName $__RootfsDir/etc/apt/sources.list
|
||||
chroot $__RootfsDir apt-get update
|
||||
chroot $__RootfsDir apt-get -f -y install
|
||||
chroot $__RootfsDir apt-get -y install $__UbuntuPackages
|
||||
chroot $__RootfsDir symlinks -cr /usr
|
||||
chroot $__RootfsDir apt-get clean
|
||||
|
||||
if [ $__SkipUnmount == 0 ]; then
|
||||
umount $__RootfsDir/*
|
||||
umount $__RootfsDir/* || true
|
||||
fi
|
||||
|
||||
if [[ "$__BuildArch" == "arm" && "$__LinuxCodeName" == "trusty" ]]; then
|
||||
if [[ "$__BuildArch" == "armel" && "$__CodeName" == "jessie" ]]; then
|
||||
pushd $__RootfsDir
|
||||
patch -p1 < $__CrossDir/$__BuildArch/trusty.patch
|
||||
patch -p1 < $__CrossDir/$__BuildArch/trusty-lttng-2.4.patch
|
||||
patch -p1 < $__CrossDir/$__BuildArch/armel.jessie.patch
|
||||
popd
|
||||
fi
|
||||
elif [ "$__Tizen" == "tizen" ]; then
|
||||
elif [[ "$__Tizen" == "tizen" ]]; then
|
||||
ROOTFS_DIR=$__RootfsDir $__CrossDir/$__BuildArch/tizen-build-rootfs.sh
|
||||
else
|
||||
echo "Unsupported target platform."
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
|
@ -0,0 +1,11 @@
|
|||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
|
||||
|
||||
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
||||
deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
|
|
@ -1,17 +1,44 @@
|
|||
set(CROSS_ROOTFS $ENV{ROOTFS_DIR})
|
||||
|
||||
set(TARGET_ARCH_NAME $ENV{TARGET_BUILD_ARCH})
|
||||
set(CMAKE_SYSTEM_NAME Linux)
|
||||
if(EXISTS ${CROSS_ROOTFS}/bin/freebsd-version)
|
||||
set(CMAKE_SYSTEM_NAME FreeBSD)
|
||||
set(FREEBSD 1)
|
||||
elseif(EXISTS ${CROSS_ROOTFS}/usr/platform/i86pc)
|
||||
set(CMAKE_SYSTEM_NAME SunOS)
|
||||
set(ILLUMOS 1)
|
||||
else()
|
||||
set(CMAKE_SYSTEM_NAME Linux)
|
||||
set(LINUX 1)
|
||||
endif()
|
||||
set(CMAKE_SYSTEM_VERSION 1)
|
||||
|
||||
if(EXISTS ${CROSS_ROOTFS}/etc/tizen-release)
|
||||
set(TIZEN 1)
|
||||
elseif(EXISTS ${CROSS_ROOTFS}/android_platform)
|
||||
set(ANDROID 1)
|
||||
endif()
|
||||
|
||||
if(TARGET_ARCH_NAME STREQUAL "armel")
|
||||
set(CMAKE_SYSTEM_PROCESSOR armv7l)
|
||||
set(TOOLCHAIN "arm-linux-gnueabi")
|
||||
if("$ENV{__DistroRid}" MATCHES "tizen.*")
|
||||
set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/6.2.1")
|
||||
if(TIZEN)
|
||||
set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/9.2.0")
|
||||
endif()
|
||||
elseif(TARGET_ARCH_NAME STREQUAL "arm")
|
||||
set(CMAKE_SYSTEM_PROCESSOR armv7l)
|
||||
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv7-alpine-linux-musleabihf)
|
||||
set(TOOLCHAIN "armv7-alpine-linux-musleabihf")
|
||||
elseif(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf)
|
||||
set(TOOLCHAIN "armv6-alpine-linux-musleabihf")
|
||||
else()
|
||||
set(TOOLCHAIN "arm-linux-gnueabihf")
|
||||
endif()
|
||||
if(TIZEN)
|
||||
set(TIZEN_TOOLCHAIN "armv7hl-tizen-linux-gnueabihf/9.2.0")
|
||||
endif()
|
||||
elseif(TARGET_ARCH_NAME STREQUAL "armv6")
|
||||
set(CMAKE_SYSTEM_PROCESSOR armv6l)
|
||||
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf)
|
||||
set(TOOLCHAIN "armv6-alpine-linux-musleabihf")
|
||||
else()
|
||||
|
@ -24,65 +51,174 @@ elseif(TARGET_ARCH_NAME STREQUAL "arm64")
|
|||
else()
|
||||
set(TOOLCHAIN "aarch64-linux-gnu")
|
||||
endif()
|
||||
if(TIZEN)
|
||||
set(TIZEN_TOOLCHAIN "aarch64-tizen-linux-gnu/9.2.0")
|
||||
endif()
|
||||
elseif(TARGET_ARCH_NAME STREQUAL "ppc64le")
|
||||
set(CMAKE_SYSTEM_PROCESSOR ppc64le)
|
||||
set(TOOLCHAIN "powerpc64le-linux-gnu")
|
||||
elseif(TARGET_ARCH_NAME STREQUAL "s390x")
|
||||
set(CMAKE_SYSTEM_PROCESSOR s390x)
|
||||
set(TOOLCHAIN "s390x-linux-gnu")
|
||||
elseif(TARGET_ARCH_NAME STREQUAL "x86")
|
||||
set(CMAKE_SYSTEM_PROCESSOR i686)
|
||||
set(TOOLCHAIN "i686-linux-gnu")
|
||||
if(TIZEN)
|
||||
set(TIZEN_TOOLCHAIN "i586-tizen-linux-gnu/9.2.0")
|
||||
endif()
|
||||
elseif (FREEBSD)
|
||||
set(CMAKE_SYSTEM_PROCESSOR "x86_64")
|
||||
set(triple "x86_64-unknown-freebsd12")
|
||||
elseif (ILLUMOS)
|
||||
set(CMAKE_SYSTEM_PROCESSOR "x86_64")
|
||||
set(TOOLCHAIN "x86_64-illumos")
|
||||
else()
|
||||
message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only armel, arm, arm64 and x86 are supported!")
|
||||
message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only armel, arm, armv6, arm64, ppc64le, s390x and x86 are supported!")
|
||||
endif()
|
||||
|
||||
if(DEFINED ENV{TOOLCHAIN})
|
||||
set(TOOLCHAIN $ENV{TOOLCHAIN})
|
||||
endif()
|
||||
|
||||
# Specify include paths
|
||||
if(TARGET_ARCH_NAME STREQUAL "armel")
|
||||
if(DEFINED TIZEN_TOOLCHAIN)
|
||||
if(TIZEN)
|
||||
if(TARGET_ARCH_NAME STREQUAL "arm")
|
||||
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
|
||||
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7hl-tizen-linux-gnueabihf)
|
||||
endif()
|
||||
if(TARGET_ARCH_NAME STREQUAL "armel")
|
||||
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
|
||||
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7l-tizen-linux-gnueabi)
|
||||
endif()
|
||||
if(TARGET_ARCH_NAME STREQUAL "arm64")
|
||||
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
|
||||
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/aarch64-tizen-linux-gnu)
|
||||
endif()
|
||||
if(TARGET_ARCH_NAME STREQUAL "x86")
|
||||
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
|
||||
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/i586-tizen-linux-gnu)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# add_compile_param - adds only new options without duplicates.
|
||||
# arg0 - list with result options, arg1 - list with new options.
|
||||
# arg2 - optional argument, quick summary string for optional using CACHE FORCE mode.
|
||||
macro(add_compile_param)
|
||||
if(NOT ${ARGC} MATCHES "^(2|3)$")
|
||||
message(FATAL_ERROR "Wrong using add_compile_param! Two or three parameters must be given! See add_compile_param description.")
|
||||
endif()
|
||||
foreach(OPTION ${ARGV1})
|
||||
if(NOT ${ARGV0} MATCHES "${OPTION}($| )")
|
||||
set(${ARGV0} "${${ARGV0}} ${OPTION}")
|
||||
if(${ARGC} EQUAL "3") # CACHE FORCE mode
|
||||
set(${ARGV0} "${${ARGV0}}" CACHE STRING "${ARGV2}" FORCE)
|
||||
endif()
|
||||
if(ANDROID)
|
||||
if(TARGET_ARCH_NAME STREQUAL "arm")
|
||||
set(ANDROID_ABI armeabi-v7a)
|
||||
elseif(TARGET_ARCH_NAME STREQUAL "arm64")
|
||||
set(ANDROID_ABI arm64-v8a)
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
# extract platform number required by the NDK's toolchain
|
||||
file(READ "${CROSS_ROOTFS}/android_platform" RID_FILE_CONTENTS)
|
||||
string(REPLACE "RID=" "" ANDROID_RID "${RID_FILE_CONTENTS}")
|
||||
string(REGEX REPLACE ".*\\.([0-9]+)-.*" "\\1" ANDROID_PLATFORM "${ANDROID_RID}")
|
||||
|
||||
set(ANDROID_TOOLCHAIN clang)
|
||||
set(FEATURE_EVENT_TRACE 0) # disable event trace as there is no lttng-ust package in termux repository
|
||||
set(CMAKE_SYSTEM_LIBRARY_PATH "${CROSS_ROOTFS}/usr/lib")
|
||||
set(CMAKE_SYSTEM_INCLUDE_PATH "${CROSS_ROOTFS}/usr/include")
|
||||
|
||||
# include official NDK toolchain script
|
||||
include(${CROSS_ROOTFS}/../build/cmake/android.toolchain.cmake)
|
||||
elseif(FREEBSD)
|
||||
# we cross-compile by instructing clang
|
||||
set(CMAKE_C_COMPILER_TARGET ${triple})
|
||||
set(CMAKE_CXX_COMPILER_TARGET ${triple})
|
||||
set(CMAKE_ASM_COMPILER_TARGET ${triple})
|
||||
set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=lld")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fuse-ld=lld")
|
||||
elseif(ILLUMOS)
|
||||
set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
|
||||
|
||||
include_directories(SYSTEM ${CROSS_ROOTFS}/include)
|
||||
|
||||
set(TOOLSET_PREFIX ${TOOLCHAIN}-)
|
||||
function(locate_toolchain_exec exec var)
|
||||
string(TOUPPER ${exec} EXEC_UPPERCASE)
|
||||
if(NOT "$ENV{CLR_${EXEC_UPPERCASE}}" STREQUAL "")
|
||||
set(${var} "$ENV{CLR_${EXEC_UPPERCASE}}" PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
|
||||
find_program(EXEC_LOCATION_${exec}
|
||||
NAMES
|
||||
"${TOOLSET_PREFIX}${exec}${CLR_CMAKE_COMPILER_FILE_NAME_VERSION}"
|
||||
"${TOOLSET_PREFIX}${exec}")
|
||||
|
||||
if (EXEC_LOCATION_${exec} STREQUAL "EXEC_LOCATION_${exec}-NOTFOUND")
|
||||
message(FATAL_ERROR "Unable to find toolchain executable. Name: ${exec}, Prefix: ${TOOLSET_PREFIX}.")
|
||||
endif()
|
||||
set(${var} ${EXEC_LOCATION_${exec}} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}")
|
||||
|
||||
locate_toolchain_exec(gcc CMAKE_C_COMPILER)
|
||||
locate_toolchain_exec(g++ CMAKE_CXX_COMPILER)
|
||||
|
||||
set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp")
|
||||
set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp")
|
||||
else()
|
||||
set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
|
||||
|
||||
set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr")
|
||||
set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr")
|
||||
set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr")
|
||||
endif()
|
||||
|
||||
# Specify link flags
|
||||
add_compile_param(CROSS_LINK_FLAGS "--sysroot=${CROSS_ROOTFS}")
|
||||
add_compile_param(CROSS_LINK_FLAGS "--gcc-toolchain=${CROSS_ROOTFS}/usr")
|
||||
add_compile_param(CROSS_LINK_FLAGS "--target=${TOOLCHAIN}")
|
||||
add_compile_param(CROSS_LINK_FLAGS "-fuse-ld=gold")
|
||||
|
||||
if(TARGET_ARCH_NAME STREQUAL "armel")
|
||||
if(DEFINED TIZEN_TOOLCHAIN) # For Tizen only
|
||||
add_compile_param(CROSS_LINK_FLAGS "-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
|
||||
add_compile_param(CROSS_LINK_FLAGS "-L${CROSS_ROOTFS}/lib")
|
||||
add_compile_param(CROSS_LINK_FLAGS "-L${CROSS_ROOTFS}/usr/lib")
|
||||
add_compile_param(CROSS_LINK_FLAGS "-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
|
||||
function(add_toolchain_linker_flag Flag)
|
||||
set(Config "${ARGV1}")
|
||||
set(CONFIG_SUFFIX "")
|
||||
if (NOT Config STREQUAL "")
|
||||
set(CONFIG_SUFFIX "_${Config}")
|
||||
endif()
|
||||
elseif(TARGET_ARCH_NAME STREQUAL "x86")
|
||||
add_compile_param(CROSS_LINK_FLAGS "-m32")
|
||||
set("CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}_INIT" "${CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}_INIT} ${Flag}" PARENT_SCOPE)
|
||||
set("CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}_INIT" "${CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}_INIT} ${Flag}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
if(LINUX)
|
||||
add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/lib/${TOOLCHAIN}")
|
||||
add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib/${TOOLCHAIN}")
|
||||
endif()
|
||||
|
||||
add_compile_param(CMAKE_EXE_LINKER_FLAGS "${CROSS_LINK_FLAGS}" "TOOLCHAIN_EXE_LINKER_FLAGS")
|
||||
add_compile_param(CMAKE_SHARED_LINKER_FLAGS "${CROSS_LINK_FLAGS}" "TOOLCHAIN_EXE_LINKER_FLAGS")
|
||||
add_compile_param(CMAKE_MODULE_LINKER_FLAGS "${CROSS_LINK_FLAGS}" "TOOLCHAIN_EXE_LINKER_FLAGS")
|
||||
if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$")
|
||||
if(TIZEN)
|
||||
add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
|
||||
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib")
|
||||
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib")
|
||||
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
|
||||
endif()
|
||||
elseif(TARGET_ARCH_NAME STREQUAL "arm64")
|
||||
if(TIZEN)
|
||||
add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}")
|
||||
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib64")
|
||||
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib64")
|
||||
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}")
|
||||
|
||||
add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/lib64")
|
||||
add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib64")
|
||||
add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}")
|
||||
endif()
|
||||
elseif(TARGET_ARCH_NAME STREQUAL "x86")
|
||||
add_toolchain_linker_flag(-m32)
|
||||
|
||||
if(TIZEN)
|
||||
add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
|
||||
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib")
|
||||
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib")
|
||||
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
|
||||
endif()
|
||||
elseif(ILLUMOS)
|
||||
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib/amd64")
|
||||
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/amd64/lib")
|
||||
endif()
|
||||
|
||||
# Specify compile options
|
||||
add_compile_options("--sysroot=${CROSS_ROOTFS}")
|
||||
add_compile_options("--target=${TOOLCHAIN}")
|
||||
add_compile_options("--gcc-toolchain=${CROSS_ROOTFS}/usr")
|
||||
|
||||
if(TARGET_ARCH_NAME MATCHES "^(arm|armel|arm64)$")
|
||||
if((TARGET_ARCH_NAME MATCHES "^(arm|armv6|armel|arm64|ppc64le|s390x)$" AND NOT ANDROID) OR ILLUMOS)
|
||||
set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN})
|
||||
set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN})
|
||||
set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN})
|
||||
|
@ -90,20 +226,33 @@ endif()
|
|||
|
||||
if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$")
|
||||
add_compile_options(-mthumb)
|
||||
add_compile_options(-mfpu=vfpv3)
|
||||
if (NOT DEFINED CLR_ARM_FPU_TYPE)
|
||||
set (CLR_ARM_FPU_TYPE vfpv3)
|
||||
endif (NOT DEFINED CLR_ARM_FPU_TYPE)
|
||||
|
||||
add_compile_options (-mfpu=${CLR_ARM_FPU_TYPE})
|
||||
if (NOT DEFINED CLR_ARM_FPU_CAPABILITY)
|
||||
set (CLR_ARM_FPU_CAPABILITY 0x7)
|
||||
endif (NOT DEFINED CLR_ARM_FPU_CAPABILITY)
|
||||
|
||||
add_definitions (-DCLR_ARM_FPU_CAPABILITY=${CLR_ARM_FPU_CAPABILITY})
|
||||
|
||||
if(TARGET_ARCH_NAME STREQUAL "armel")
|
||||
add_compile_options(-mfloat-abi=softfp)
|
||||
if(DEFINED TIZEN_TOOLCHAIN)
|
||||
add_compile_options(-Wno-deprecated-declarations) # compile-time option
|
||||
add_compile_options(-D__extern_always_inline=inline) # compile-time option
|
||||
endif()
|
||||
endif()
|
||||
elseif(TARGET_ARCH_NAME STREQUAL "x86")
|
||||
add_compile_options(-m32)
|
||||
add_compile_options(-Wno-error=unused-command-line-argument)
|
||||
endif()
|
||||
|
||||
# Set LLDB include and library paths
|
||||
if(TIZEN)
|
||||
if(TARGET_ARCH_NAME MATCHES "^(arm|armel|arm64|x86)$")
|
||||
add_compile_options(-Wno-deprecated-declarations) # compile-time option
|
||||
add_compile_options(-D__extern_always_inline=inline) # compile-time option
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Set LLDB include and library paths for builds that need lldb.
|
||||
if(TARGET_ARCH_NAME MATCHES "^(arm|armel|x86)$")
|
||||
if(TARGET_ARCH_NAME STREQUAL "x86")
|
||||
set(LLVM_CROSS_DIR "$ENV{LLVM_CROSS_HOME}")
|
||||
|
@ -131,7 +280,6 @@ if(TARGET_ARCH_NAME MATCHES "^(arm|armel|x86)$")
|
|||
endif()
|
||||
endif()
|
||||
|
||||
set(CMAKE_FIND_ROOT_PATH "${CROSS_ROOTFS}")
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
deb http://archive.ubuntu.com/ubuntu/ bionic main restricted universe
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ bionic main restricted universe
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse
|
||||
deb http://archive.ubuntu.com/ubuntu/ bionic main restricted universe
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ bionic main restricted universe
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ trusty main restricted universe
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse
|
|
@ -1,11 +1,11 @@
|
|||
deb http://archive.ubuntu.com/ubuntu/ xenial main restricted universe
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ xenial main restricted universe
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
|
||||
deb http://archive.ubuntu.com/ubuntu/ xenial main restricted universe
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ xenial main restricted universe
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted
|
||||
|
||||
deb http://archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
|
||||
|
|
|
@ -1,47 +1,47 @@
|
|||
param (
|
||||
$darcVersion = $null,
|
||||
$versionEndpoint = 'https://maestro-prod.westus2.cloudapp.azure.com/api/assets/darc-version?api-version=2019-01-16',
|
||||
$verbosity = 'minimal',
|
||||
$toolpath = $null
|
||||
)
|
||||
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
function InstallDarcCli ($darcVersion, $toolpath) {
|
||||
$darcCliPackageName = 'microsoft.dotnet.darc'
|
||||
|
||||
$dotnetRoot = InitializeDotNetCli -install:$true
|
||||
$dotnet = "$dotnetRoot\dotnet.exe"
|
||||
$toolList = & "$dotnet" tool list -g
|
||||
|
||||
if ($toolList -like "*$darcCliPackageName*") {
|
||||
& "$dotnet" tool uninstall $darcCliPackageName -g
|
||||
}
|
||||
|
||||
# If the user didn't explicitly specify the darc version,
|
||||
# query the Maestro API for the correct version of darc to install.
|
||||
if (-not $darcVersion) {
|
||||
$darcVersion = $(Invoke-WebRequest -Uri $versionEndpoint -UseBasicParsing).Content
|
||||
}
|
||||
|
||||
$arcadeServicesSource = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json'
|
||||
|
||||
Write-Host "Installing Darc CLI version $darcVersion..."
|
||||
Write-Host 'You may need to restart your command window if this is the first dotnet tool you have installed.'
|
||||
if (-not $toolpath) {
|
||||
Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity -g"
|
||||
& "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity -g
|
||||
}else {
|
||||
Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity --tool-path '$toolpath'"
|
||||
& "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity --tool-path "$toolpath"
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
InstallDarcCli $darcVersion $toolpath
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'Darc' -Message $_
|
||||
ExitWithExitCode 1
|
||||
param (
|
||||
$darcVersion = $null,
|
||||
$versionEndpoint = 'https://maestro-prod.westus2.cloudapp.azure.com/api/assets/darc-version?api-version=2019-01-16',
|
||||
$verbosity = 'minimal',
|
||||
$toolpath = $null
|
||||
)
|
||||
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
function InstallDarcCli ($darcVersion, $toolpath) {
|
||||
$darcCliPackageName = 'microsoft.dotnet.darc'
|
||||
|
||||
$dotnetRoot = InitializeDotNetCli -install:$true
|
||||
$dotnet = "$dotnetRoot\dotnet.exe"
|
||||
$toolList = & "$dotnet" tool list -g
|
||||
|
||||
if ($toolList -like "*$darcCliPackageName*") {
|
||||
& "$dotnet" tool uninstall $darcCliPackageName -g
|
||||
}
|
||||
|
||||
# If the user didn't explicitly specify the darc version,
|
||||
# query the Maestro API for the correct version of darc to install.
|
||||
if (-not $darcVersion) {
|
||||
$darcVersion = $(Invoke-WebRequest -Uri $versionEndpoint -UseBasicParsing).Content
|
||||
}
|
||||
|
||||
$arcadeServicesSource = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json'
|
||||
|
||||
Write-Host "Installing Darc CLI version $darcVersion..."
|
||||
Write-Host 'You may need to restart your command window if this is the first dotnet tool you have installed.'
|
||||
if (-not $toolpath) {
|
||||
Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity -g"
|
||||
& "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity -g
|
||||
}else {
|
||||
Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity --tool-path '$toolpath'"
|
||||
& "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity --tool-path "$toolpath"
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
InstallDarcCli $darcVersion $toolpath
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'Darc' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
|
@ -6,7 +6,7 @@ versionEndpoint='https://maestro-prod.westus2.cloudapp.azure.com/api/assets/darc
|
|||
verbosity='minimal'
|
||||
|
||||
while [[ $# > 0 ]]; do
|
||||
opt="$(echo "$1" | awk '{print tolower($0)}')"
|
||||
opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")"
|
||||
case "$opt" in
|
||||
--darcversion)
|
||||
darcVersion=$2
|
||||
|
@ -53,7 +53,7 @@ fi
|
|||
function InstallDarcCli {
|
||||
local darc_cli_package_name="microsoft.dotnet.darc"
|
||||
|
||||
InitializeDotNetCli
|
||||
InitializeDotNetCli true
|
||||
local dotnet_root=$_InitializeDotNetCli
|
||||
|
||||
if [ -z "$toolpath" ]; then
|
||||
|
@ -68,7 +68,7 @@ function InstallDarcCli {
|
|||
fi
|
||||
fi
|
||||
|
||||
local arcadeServicesSource="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json"
|
||||
local arcadeServicesSource="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json"
|
||||
|
||||
echo "Installing Darc CLI version $darcVersion..."
|
||||
echo "You may need to restart your command shell if this is the first dotnet tool you have installed."
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
@echo off
|
||||
@echo off
|
||||
powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0dotnet-install.ps1""" %*"
|
|
@ -1,29 +1,28 @@
|
|||
[CmdletBinding(PositionalBinding=$false)]
|
||||
Param(
|
||||
[string] $verbosity = "minimal",
|
||||
[string] $architecture = "",
|
||||
[string] $version = "Latest",
|
||||
[string] $runtime = "dotnet",
|
||||
[string] $RuntimeSourceFeed = "",
|
||||
[string] $RuntimeSourceFeedKey = ""
|
||||
)
|
||||
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
$dotnetRoot = Join-Path $RepoRoot ".dotnet"
|
||||
|
||||
$installdir = $dotnetRoot
|
||||
try {
|
||||
if ($architecture -and $architecture.Trim() -eq "x86") {
|
||||
$installdir = Join-Path $installdir "x86"
|
||||
}
|
||||
InstallDotNet $installdir $version $architecture $runtime $true -RuntimeSourceFeed $RuntimeSourceFeed -RuntimeSourceFeedKey $RuntimeSourceFeedKey
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
ExitWithExitCode 0
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
Param(
|
||||
[string] $verbosity = 'minimal',
|
||||
[string] $architecture = '',
|
||||
[string] $version = 'Latest',
|
||||
[string] $runtime = 'dotnet',
|
||||
[string] $RuntimeSourceFeed = '',
|
||||
[string] $RuntimeSourceFeedKey = ''
|
||||
)
|
||||
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
$dotnetRoot = Join-Path $RepoRoot '.dotnet'
|
||||
|
||||
$installdir = $dotnetRoot
|
||||
try {
|
||||
if ($architecture -and $architecture.Trim() -eq 'x86') {
|
||||
$installdir = Join-Path $installdir 'x86'
|
||||
}
|
||||
InstallDotNet $installdir $version $architecture $runtime $true -RuntimeSourceFeed $RuntimeSourceFeed -RuntimeSourceFeedKey $RuntimeSourceFeedKey
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'InitializeToolset' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
ExitWithExitCode 0
|
||||
|
|
|
@ -11,13 +11,15 @@ while [[ -h "$source" ]]; do
|
|||
done
|
||||
scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
|
||||
|
||||
. "$scriptroot/tools.sh"
|
||||
|
||||
version='Latest'
|
||||
architecture=''
|
||||
runtime='dotnet'
|
||||
runtimeSourceFeed=''
|
||||
runtimeSourceFeedKey=''
|
||||
while [[ $# > 0 ]]; do
|
||||
opt="$(echo "$1" | awk '{print tolower($0)}')"
|
||||
opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")"
|
||||
case "$opt" in
|
||||
-version|-v)
|
||||
shift
|
||||
|
@ -40,18 +42,45 @@ while [[ $# > 0 ]]; do
|
|||
runtimeSourceFeedKey="$1"
|
||||
;;
|
||||
*)
|
||||
echo "Invalid argument: $1"
|
||||
Write-PipelineTelemetryError -Category 'Build' -Message "Invalid argument: $1"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
. "$scriptroot/tools.sh"
|
||||
dotnetRoot="$repo_root/.dotnet"
|
||||
# Use uname to determine what the CPU is, see https://en.wikipedia.org/wiki/Uname#Examples
|
||||
cpuname=$(uname -m)
|
||||
case $cpuname in
|
||||
aarch64)
|
||||
buildarch=arm64
|
||||
;;
|
||||
loongarch64)
|
||||
buildarch=loongarch64
|
||||
;;
|
||||
amd64|x86_64)
|
||||
buildarch=x64
|
||||
;;
|
||||
armv*l)
|
||||
buildarch=arm
|
||||
;;
|
||||
i686)
|
||||
buildarch=x86
|
||||
;;
|
||||
*)
|
||||
echo "Unknown CPU $cpuname detected, treating it as x64"
|
||||
buildarch=x64
|
||||
;;
|
||||
esac
|
||||
|
||||
dotnetRoot="${repo_root}.dotnet"
|
||||
if [[ $architecture != "" ]] && [[ $architecture != $buildarch ]]; then
|
||||
dotnetRoot="$dotnetRoot/$architecture"
|
||||
fi
|
||||
|
||||
InstallDotNet $dotnetRoot $version "$architecture" $runtime true $runtimeSourceFeed $runtimeSourceFeedKey || {
|
||||
local exit_code=$?
|
||||
echo "dotnet-install.sh failed (exit code '$exit_code')." >&2
|
||||
Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "dotnet-install.sh failed (exit code '$exit_code')." >&2
|
||||
ExitWithExitCode $exit_code
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,13 @@
|
|||
param(
|
||||
[string] $token
|
||||
)
|
||||
|
||||
Write-Host "##vso[task.setvariable variable=VSS_NUGET_ACCESSTOKEN]$token"
|
||||
Write-Host "##vso[task.setvariable variable=VSS_NUGET_URI_PREFIXES]https://dnceng.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/dnceng/;https://devdiv.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/devdiv/"
|
||||
param(
|
||||
[string] $token
|
||||
)
|
||||
|
||||
|
||||
. $PSScriptRoot\pipeline-logging-functions.ps1
|
||||
|
||||
# Write-PipelineSetVariable will no-op if a variable named $ci is not defined
|
||||
# Since this script is only ever called in AzDO builds, just universally set it
|
||||
$ci = $true
|
||||
|
||||
Write-PipelineSetVariable -Name 'VSS_NUGET_ACCESSTOKEN' -Value $token -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'VSS_NUGET_URI_PREFIXES' -Value 'https://dnceng.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/dnceng/;https://devdiv.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/devdiv/' -IsMultiJobVariable $false
|
||||
|
|
|
@ -1,87 +0,0 @@
|
|||
Param(
|
||||
[Parameter(Mandatory=$true)][string] $barToken, # Token generated at https://maestro-prod.westus2.cloudapp.azure.com/Account/Tokens
|
||||
[Parameter(Mandatory=$true)][string] $gitHubPat, # GitHub personal access token from https://github.com/settings/tokens (no auth scopes needed)
|
||||
[Parameter(Mandatory=$true)][string] $azdoPat, # Azure Dev Ops tokens from https://dev.azure.com/dnceng/_details/security/tokens (code read scope needed)
|
||||
[Parameter(Mandatory=$true)][string] $outputFolder, # Where the graphviz.txt file will be created
|
||||
[string] $darcVersion = '1.1.0-beta.19175.6', # darc's version
|
||||
[string] $graphvizVersion = '2.38', # GraphViz version
|
||||
[switch] $includeToolset # Whether the graph should include toolset dependencies or not. i.e. arcade, optimization. For more about
|
||||
# toolset dependencies see https://github.com/dotnet/arcade/blob/master/Documentation/Darc.md#toolset-vs-product-dependencies
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
Import-Module -Name (Join-Path $PSScriptRoot "native\CommonLibrary.psm1")
|
||||
|
||||
function CheckExitCode ([string]$stage)
|
||||
{
|
||||
$exitCode = $LASTEXITCODE
|
||||
if ($exitCode -ne 0) {
|
||||
Write-Host "Something failed in stage: '$stage'. Check for errors above. Exiting now..."
|
||||
ExitWithExitCode $exitCode
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Push-Location $PSScriptRoot
|
||||
|
||||
Write-Host "Installing darc..."
|
||||
. .\darc-init.ps1 -darcVersion $darcVersion
|
||||
CheckExitCode "Running darc-init"
|
||||
|
||||
$engCommonBaseDir = Join-Path $PSScriptRoot "native\"
|
||||
$graphvizInstallDir = CommonLibrary\Get-NativeInstallDirectory
|
||||
$nativeToolBaseUri = "https://netcorenativeassets.blob.core.windows.net/resource-packages/external"
|
||||
$installBin = Join-Path $graphvizInstallDir "bin"
|
||||
|
||||
Write-Host "Installing dot..."
|
||||
.\native\install-tool.ps1 -ToolName graphviz -InstallPath $installBin -BaseUri $nativeToolBaseUri -CommonLibraryDirectory $engCommonBaseDir -Version $graphvizVersion -Verbose
|
||||
|
||||
$darcExe = "$env:USERPROFILE\.dotnet\tools"
|
||||
$darcExe = Resolve-Path "$darcExe\darc.exe"
|
||||
|
||||
Create-Directory $outputFolder
|
||||
|
||||
# Generate 3 graph descriptions:
|
||||
# 1. Flat with coherency information
|
||||
# 2. Graphviz (dot) file
|
||||
# 3. Standard dependency graph
|
||||
$graphVizFilePath = "$outputFolder\graphviz.txt"
|
||||
$graphVizImageFilePath = "$outputFolder\graph.png"
|
||||
$normalGraphFilePath = "$outputFolder\graph-full.txt"
|
||||
$flatGraphFilePath = "$outputFolder\graph-flat.txt"
|
||||
$baseOptions = @( "--github-pat", "$gitHubPat", "--azdev-pat", "$azdoPat", "--password", "$barToken" )
|
||||
|
||||
if ($includeToolset) {
|
||||
Write-Host "Toolsets will be included in the graph..."
|
||||
$baseOptions += @( "--include-toolset" )
|
||||
}
|
||||
|
||||
Write-Host "Generating standard dependency graph..."
|
||||
& "$darcExe" get-dependency-graph @baseOptions --output-file $normalGraphFilePath
|
||||
CheckExitCode "Generating normal dependency graph"
|
||||
|
||||
Write-Host "Generating flat dependency graph and graphviz file..."
|
||||
& "$darcExe" get-dependency-graph @baseOptions --flat --coherency --graphviz $graphVizFilePath --output-file $flatGraphFilePath
|
||||
CheckExitCode "Generating flat and graphviz dependency graph"
|
||||
|
||||
Write-Host "Generating graph image $graphVizFilePath"
|
||||
$dotFilePath = Join-Path $installBin "graphviz\$graphvizVersion\release\bin\dot.exe"
|
||||
& "$dotFilePath" -Tpng -o"$graphVizImageFilePath" "$graphVizFilePath"
|
||||
CheckExitCode "Generating graphviz image"
|
||||
|
||||
Write-Host "'$graphVizFilePath', '$flatGraphFilePath', '$normalGraphFilePath' and '$graphVizImageFilePath' created!"
|
||||
}
|
||||
catch {
|
||||
if (!$includeToolset) {
|
||||
Write-Host "This might be a toolset repo which includes only toolset dependencies. " -NoNewline -ForegroundColor Yellow
|
||||
Write-Host "Since -includeToolset is not set there is no graph to create. Include -includeToolset and try again..." -ForegroundColor Yellow
|
||||
}
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
} finally {
|
||||
Pop-Location
|
||||
}
|
|
@ -0,0 +1,117 @@
|
|||
Param(
|
||||
[Parameter(Mandatory=$true)][string] $SourcesDirectory, # Directory where source files live; if using a Localize directory it should live in here
|
||||
[string] $LanguageSet = 'VS_Main_Languages', # Language set to be used in the LocProject.json
|
||||
[switch] $UseCheckedInLocProjectJson, # When set, generates a LocProject.json and compares it to one that already exists in the repo; otherwise just generates one
|
||||
[switch] $CreateNeutralXlfs # Creates neutral xlf files. Only set to false when running locally
|
||||
)
|
||||
|
||||
# Generates LocProject.json files for the OneLocBuild task. OneLocBuildTask is described here:
|
||||
# https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task
|
||||
|
||||
Set-StrictMode -Version 2.0
|
||||
$ErrorActionPreference = "Stop"
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
Import-Module -Name (Join-Path $PSScriptRoot 'native\CommonLibrary.psm1')
|
||||
|
||||
$exclusionsFilePath = "$SourcesDirectory\eng\Localize\LocExclusions.json"
|
||||
$exclusions = @{ Exclusions = @() }
|
||||
if (Test-Path -Path $exclusionsFilePath)
|
||||
{
|
||||
$exclusions = Get-Content "$exclusionsFilePath" | ConvertFrom-Json
|
||||
}
|
||||
|
||||
Push-Location "$SourcesDirectory" # push location for Resolve-Path -Relative to work
|
||||
|
||||
# Template files
|
||||
$jsonFiles = @()
|
||||
$jsonTemplateFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\.template\.config\\localize\\.+\.en\.json" } # .NET templating pattern
|
||||
$jsonTemplateFiles | ForEach-Object {
|
||||
$null = $_.Name -Match "(.+)\.[\w-]+\.json" # matches '[filename].[langcode].json
|
||||
|
||||
$destinationFile = "$($_.Directory.FullName)\$($Matches.1).json"
|
||||
$jsonFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru
|
||||
}
|
||||
|
||||
$jsonWinformsTemplateFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "en\\strings\.json" } # current winforms pattern
|
||||
|
||||
$xlfFiles = @()
|
||||
|
||||
$allXlfFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory\*\*.xlf"
|
||||
$langXlfFiles = @()
|
||||
if ($allXlfFiles) {
|
||||
$null = $allXlfFiles[0].FullName -Match "\.([\w-]+)\.xlf" # matches '[langcode].xlf'
|
||||
$firstLangCode = $Matches.1
|
||||
$langXlfFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory\*\*.$firstLangCode.xlf"
|
||||
}
|
||||
$langXlfFiles | ForEach-Object {
|
||||
$null = $_.Name -Match "(.+)\.[\w-]+\.xlf" # matches '[filename].[langcode].xlf
|
||||
|
||||
$destinationFile = "$($_.Directory.FullName)\$($Matches.1).xlf"
|
||||
$xlfFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru
|
||||
}
|
||||
|
||||
$locFiles = $jsonFiles + $jsonWinformsTemplateFiles + $xlfFiles
|
||||
|
||||
$locJson = @{
|
||||
Projects = @(
|
||||
@{
|
||||
LanguageSet = $LanguageSet
|
||||
LocItems = @(
|
||||
$locFiles | ForEach-Object {
|
||||
$outputPath = "$(($_.DirectoryName | Resolve-Path -Relative) + "\")"
|
||||
$continue = $true
|
||||
foreach ($exclusion in $exclusions.Exclusions) {
|
||||
if ($outputPath.Contains($exclusion))
|
||||
{
|
||||
$continue = $false
|
||||
}
|
||||
}
|
||||
$sourceFile = ($_.FullName | Resolve-Path -Relative)
|
||||
if (!$CreateNeutralXlfs -and $_.Extension -eq '.xlf') {
|
||||
Remove-Item -Path $sourceFile
|
||||
}
|
||||
if ($continue)
|
||||
{
|
||||
if ($_.Directory.Name -eq 'en' -and $_.Extension -eq '.json') {
|
||||
return @{
|
||||
SourceFile = $sourceFile
|
||||
CopyOption = "LangIDOnPath"
|
||||
OutputPath = "$($_.Directory.Parent.FullName | Resolve-Path -Relative)\"
|
||||
}
|
||||
}
|
||||
else {
|
||||
return @{
|
||||
SourceFile = $sourceFile
|
||||
CopyOption = "LangIDOnName"
|
||||
OutputPath = $outputPath
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
$json = ConvertTo-Json $locJson -Depth 5
|
||||
Write-Host "LocProject.json generated:`n`n$json`n`n"
|
||||
Pop-Location
|
||||
|
||||
if (!$UseCheckedInLocProjectJson) {
|
||||
New-Item "$SourcesDirectory\eng\Localize\LocProject.json" -Force # Need this to make sure the Localize directory is created
|
||||
Set-Content "$SourcesDirectory\eng\Localize\LocProject.json" $json
|
||||
}
|
||||
else {
|
||||
New-Item "$SourcesDirectory\eng\Localize\LocProject-generated.json" -Force # Need this to make sure the Localize directory is created
|
||||
Set-Content "$SourcesDirectory\eng\Localize\LocProject-generated.json" $json
|
||||
|
||||
if ((Get-FileHash "$SourcesDirectory\eng\Localize\LocProject-generated.json").Hash -ne (Get-FileHash "$SourcesDirectory\eng\Localize\LocProject.json").Hash) {
|
||||
Write-PipelineTelemetryError -Category "OneLocBuild" -Message "Existing LocProject.json differs from generated LocProject.json. Download LocProject-generated.json and compare them."
|
||||
|
||||
exit 1
|
||||
}
|
||||
else {
|
||||
Write-Host "Generated LocProject.json and current LocProject.json are identical."
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
Param(
|
||||
[Parameter(Mandatory=$true)][string] $ManifestDirPath # Manifest directory where sbom will be placed
|
||||
)
|
||||
|
||||
Write-Host "Creating dir $ManifestDirPath"
|
||||
# create directory for sbom manifest to be placed
|
||||
if (!(Test-Path -path $ManifestDirPath))
|
||||
{
|
||||
New-Item -ItemType Directory -path $ManifestDirPath
|
||||
Write-Host "Successfully created directory $ManifestDirPath"
|
||||
}
|
||||
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"
|
|
@ -0,0 +1,22 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
source="${BASH_SOURCE[0]}"
|
||||
|
||||
manifest_dir=$1
|
||||
|
||||
if [ ! -d "$manifest_dir" ] ; then
|
||||
mkdir -p "$manifest_dir"
|
||||
echo "Sbom directory created." $manifest_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"
|
||||
|
||||
exit 0
|
|
@ -1,26 +1,26 @@
|
|||
<Project Sdk="Microsoft.DotNet.Helix.Sdk" DefaultTargets="Test">
|
||||
|
||||
<PropertyGroup>
|
||||
<Language>msbuild</Language>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<HelixCorrelationPayload Include="$(CorrelationPayloadDirectory)">
|
||||
<PayloadDirectory>%(Identity)</PayloadDirectory>
|
||||
</HelixCorrelationPayload>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<HelixWorkItem Include="WorkItem" Condition="'$(WorkItemDirectory)' != ''">
|
||||
<PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
|
||||
<Command>$(WorkItemCommand)</Command>
|
||||
<Timeout Condition="'$(WorkItemTimeout)' != ''">$(WorkItemTimeout)</Timeout>
|
||||
</HelixWorkItem>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<XUnitProject Include="$(XUnitProjects.Split(';'))">
|
||||
<Arguments />
|
||||
</XUnitProject>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
<Project Sdk="Microsoft.DotNet.Helix.Sdk" DefaultTargets="Test">
|
||||
|
||||
<PropertyGroup>
|
||||
<Language>msbuild</Language>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<HelixCorrelationPayload Include="$(CorrelationPayloadDirectory)">
|
||||
<PayloadDirectory>%(Identity)</PayloadDirectory>
|
||||
</HelixCorrelationPayload>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<HelixWorkItem Include="WorkItem" Condition="'$(WorkItemDirectory)' != ''">
|
||||
<PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
|
||||
<Command>$(WorkItemCommand)</Command>
|
||||
<Timeout Condition="'$(WorkItemTimeout)' != ''">$(WorkItemTimeout)</Timeout>
|
||||
</HelixWorkItem>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<XUnitProject Include="$(XUnitProjects.Split(';'))">
|
||||
<Arguments />
|
||||
</XUnitProject>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
@echo off
|
||||
powershell -NoProfile -NoLogo -ExecutionPolicy ByPass -command "& """%~dp0init-tools-native.ps1""" %*"
|
||||
@echo off
|
||||
powershell -NoProfile -NoLogo -ExecutionPolicy ByPass -command "& """%~dp0init-tools-native.ps1""" %*"
|
||||
exit /b %ErrorLevel%
|
|
@ -1,147 +1,152 @@
|
|||
<#
|
||||
.SYNOPSIS
|
||||
Entry point script for installing native tools
|
||||
|
||||
.DESCRIPTION
|
||||
Reads $RepoRoot\global.json file to determine native assets to install
|
||||
and executes installers for those tools
|
||||
|
||||
.PARAMETER BaseUri
|
||||
Base file directory or Url from which to acquire tool archives
|
||||
|
||||
.PARAMETER InstallDirectory
|
||||
Directory to install native toolset. This is a command-line override for the default
|
||||
Install directory precedence order:
|
||||
- InstallDirectory command-line override
|
||||
- NETCOREENG_INSTALL_DIRECTORY environment variable
|
||||
- (default) %USERPROFILE%/.netcoreeng/native
|
||||
|
||||
.PARAMETER Clean
|
||||
Switch specifying to not install anything, but cleanup native asset folders
|
||||
|
||||
.PARAMETER Force
|
||||
Clean and then install tools
|
||||
|
||||
.PARAMETER DownloadRetries
|
||||
Total number of retry attempts
|
||||
|
||||
.PARAMETER RetryWaitTimeInSeconds
|
||||
Wait time between retry attempts in seconds
|
||||
|
||||
.PARAMETER GlobalJsonFile
|
||||
File path to global.json file
|
||||
|
||||
.NOTES
|
||||
#>
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
Param (
|
||||
[string] $BaseUri = "https://netcorenativeassets.blob.core.windows.net/resource-packages/external",
|
||||
[string] $InstallDirectory,
|
||||
[switch] $Clean = $False,
|
||||
[switch] $Force = $False,
|
||||
[int] $DownloadRetries = 5,
|
||||
[int] $RetryWaitTimeInSeconds = 30,
|
||||
[string] $GlobalJsonFile
|
||||
)
|
||||
|
||||
if (!$GlobalJsonFile) {
|
||||
$GlobalJsonFile = Join-Path (Get-Item $PSScriptRoot).Parent.Parent.FullName "global.json"
|
||||
}
|
||||
|
||||
Set-StrictMode -version 2.0
|
||||
$ErrorActionPreference="Stop"
|
||||
|
||||
Import-Module -Name (Join-Path $PSScriptRoot "native\CommonLibrary.psm1")
|
||||
|
||||
try {
|
||||
# Define verbose switch if undefined
|
||||
$Verbose = $VerbosePreference -Eq "Continue"
|
||||
|
||||
$EngCommonBaseDir = Join-Path $PSScriptRoot "native\"
|
||||
$NativeBaseDir = $InstallDirectory
|
||||
if (!$NativeBaseDir) {
|
||||
$NativeBaseDir = CommonLibrary\Get-NativeInstallDirectory
|
||||
}
|
||||
$Env:CommonLibrary_NativeInstallDir = $NativeBaseDir
|
||||
$InstallBin = Join-Path $NativeBaseDir "bin"
|
||||
$InstallerPath = Join-Path $EngCommonBaseDir "install-tool.ps1"
|
||||
|
||||
# Process tools list
|
||||
Write-Host "Processing $GlobalJsonFile"
|
||||
If (-Not (Test-Path $GlobalJsonFile)) {
|
||||
Write-Host "Unable to find '$GlobalJsonFile'"
|
||||
exit 0
|
||||
}
|
||||
$NativeTools = Get-Content($GlobalJsonFile) -Raw |
|
||||
ConvertFrom-Json |
|
||||
Select-Object -Expand "native-tools" -ErrorAction SilentlyContinue
|
||||
if ($NativeTools) {
|
||||
$NativeTools.PSObject.Properties | ForEach-Object {
|
||||
$ToolName = $_.Name
|
||||
$ToolVersion = $_.Value
|
||||
$LocalInstallerArguments = @{ ToolName = "$ToolName" }
|
||||
$LocalInstallerArguments += @{ InstallPath = "$InstallBin" }
|
||||
$LocalInstallerArguments += @{ BaseUri = "$BaseUri" }
|
||||
$LocalInstallerArguments += @{ CommonLibraryDirectory = "$EngCommonBaseDir" }
|
||||
$LocalInstallerArguments += @{ Version = "$ToolVersion" }
|
||||
|
||||
if ($Verbose) {
|
||||
$LocalInstallerArguments += @{ Verbose = $True }
|
||||
}
|
||||
if (Get-Variable 'Force' -ErrorAction 'SilentlyContinue') {
|
||||
if($Force) {
|
||||
$LocalInstallerArguments += @{ Force = $True }
|
||||
}
|
||||
}
|
||||
if ($Clean) {
|
||||
$LocalInstallerArguments += @{ Clean = $True }
|
||||
}
|
||||
|
||||
Write-Verbose "Installing $ToolName version $ToolVersion"
|
||||
Write-Verbose "Executing '$InstallerPath $($LocalInstallerArguments.Keys.ForEach({"-$_ '$($LocalInstallerArguments.$_)'"}) -join ' ')'"
|
||||
& $InstallerPath @LocalInstallerArguments
|
||||
if ($LASTEXITCODE -Ne "0") {
|
||||
$errMsg = "$ToolName installation failed"
|
||||
if ((Get-Variable 'DoNotAbortNativeToolsInstallationOnFailure' -ErrorAction 'SilentlyContinue') -and $DoNotAbortNativeToolsInstallationOnFailure) {
|
||||
$showNativeToolsWarning = $true
|
||||
if ((Get-Variable 'DoNotDisplayNativeToolsInstallationWarnings' -ErrorAction 'SilentlyContinue') -and $DoNotDisplayNativeToolsInstallationWarnings) {
|
||||
$showNativeToolsWarning = $false
|
||||
}
|
||||
if ($showNativeToolsWarning) {
|
||||
Write-Warning $errMsg
|
||||
}
|
||||
$toolInstallationFailure = $true
|
||||
} else {
|
||||
Write-Error $errMsg
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((Get-Variable 'toolInstallationFailure' -ErrorAction 'SilentlyContinue') -and $toolInstallationFailure) {
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
else {
|
||||
Write-Host "No native tools defined in global.json"
|
||||
exit 0
|
||||
}
|
||||
|
||||
if ($Clean) {
|
||||
exit 0
|
||||
}
|
||||
if (Test-Path $InstallBin) {
|
||||
Write-Host "Native tools are available from" (Convert-Path -Path $InstallBin)
|
||||
Write-Host "##vso[task.prependpath]$(Convert-Path -Path $InstallBin)"
|
||||
}
|
||||
else {
|
||||
Write-Error "Native tools install directory does not exist, installation failed"
|
||||
exit 1
|
||||
}
|
||||
exit 0
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
exit 1
|
||||
}
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Entry point script for installing native tools
|
||||
|
||||
.DESCRIPTION
|
||||
Reads $RepoRoot\global.json file to determine native assets to install
|
||||
and executes installers for those tools
|
||||
|
||||
.PARAMETER BaseUri
|
||||
Base file directory or Url from which to acquire tool archives
|
||||
|
||||
.PARAMETER InstallDirectory
|
||||
Directory to install native toolset. This is a command-line override for the default
|
||||
Install directory precedence order:
|
||||
- InstallDirectory command-line override
|
||||
- NETCOREENG_INSTALL_DIRECTORY environment variable
|
||||
- (default) %USERPROFILE%/.netcoreeng/native
|
||||
|
||||
.PARAMETER Clean
|
||||
Switch specifying to not install anything, but cleanup native asset folders
|
||||
|
||||
.PARAMETER Force
|
||||
Clean and then install tools
|
||||
|
||||
.PARAMETER DownloadRetries
|
||||
Total number of retry attempts
|
||||
|
||||
.PARAMETER RetryWaitTimeInSeconds
|
||||
Wait time between retry attempts in seconds
|
||||
|
||||
.PARAMETER GlobalJsonFile
|
||||
File path to global.json file
|
||||
|
||||
.NOTES
|
||||
#>
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
Param (
|
||||
[string] $BaseUri = 'https://netcorenativeassets.blob.core.windows.net/resource-packages/external',
|
||||
[string] $InstallDirectory,
|
||||
[switch] $Clean = $False,
|
||||
[switch] $Force = $False,
|
||||
[int] $DownloadRetries = 5,
|
||||
[int] $RetryWaitTimeInSeconds = 30,
|
||||
[string] $GlobalJsonFile
|
||||
)
|
||||
|
||||
if (!$GlobalJsonFile) {
|
||||
$GlobalJsonFile = Join-Path (Get-Item $PSScriptRoot).Parent.Parent.FullName 'global.json'
|
||||
}
|
||||
|
||||
Set-StrictMode -version 2.0
|
||||
$ErrorActionPreference='Stop'
|
||||
|
||||
. $PSScriptRoot\pipeline-logging-functions.ps1
|
||||
Import-Module -Name (Join-Path $PSScriptRoot 'native\CommonLibrary.psm1')
|
||||
|
||||
try {
|
||||
# Define verbose switch if undefined
|
||||
$Verbose = $VerbosePreference -Eq 'Continue'
|
||||
|
||||
$EngCommonBaseDir = Join-Path $PSScriptRoot 'native\'
|
||||
$NativeBaseDir = $InstallDirectory
|
||||
if (!$NativeBaseDir) {
|
||||
$NativeBaseDir = CommonLibrary\Get-NativeInstallDirectory
|
||||
}
|
||||
$Env:CommonLibrary_NativeInstallDir = $NativeBaseDir
|
||||
$InstallBin = Join-Path $NativeBaseDir 'bin'
|
||||
$InstallerPath = Join-Path $EngCommonBaseDir 'install-tool.ps1'
|
||||
|
||||
# Process tools list
|
||||
Write-Host "Processing $GlobalJsonFile"
|
||||
If (-Not (Test-Path $GlobalJsonFile)) {
|
||||
Write-Host "Unable to find '$GlobalJsonFile'"
|
||||
exit 0
|
||||
}
|
||||
$NativeTools = Get-Content($GlobalJsonFile) -Raw |
|
||||
ConvertFrom-Json |
|
||||
Select-Object -Expand 'native-tools' -ErrorAction SilentlyContinue
|
||||
if ($NativeTools) {
|
||||
$NativeTools.PSObject.Properties | ForEach-Object {
|
||||
$ToolName = $_.Name
|
||||
$ToolVersion = $_.Value
|
||||
$LocalInstallerArguments = @{ ToolName = "$ToolName" }
|
||||
$LocalInstallerArguments += @{ InstallPath = "$InstallBin" }
|
||||
$LocalInstallerArguments += @{ BaseUri = "$BaseUri" }
|
||||
$LocalInstallerArguments += @{ CommonLibraryDirectory = "$EngCommonBaseDir" }
|
||||
$LocalInstallerArguments += @{ Version = "$ToolVersion" }
|
||||
|
||||
if ($Verbose) {
|
||||
$LocalInstallerArguments += @{ Verbose = $True }
|
||||
}
|
||||
if (Get-Variable 'Force' -ErrorAction 'SilentlyContinue') {
|
||||
if($Force) {
|
||||
$LocalInstallerArguments += @{ Force = $True }
|
||||
}
|
||||
}
|
||||
if ($Clean) {
|
||||
$LocalInstallerArguments += @{ Clean = $True }
|
||||
}
|
||||
|
||||
Write-Verbose "Installing $ToolName version $ToolVersion"
|
||||
Write-Verbose "Executing '$InstallerPath $($LocalInstallerArguments.Keys.ForEach({"-$_ '$($LocalInstallerArguments.$_)'"}) -join ' ')'"
|
||||
& $InstallerPath @LocalInstallerArguments
|
||||
if ($LASTEXITCODE -Ne "0") {
|
||||
$errMsg = "$ToolName installation failed"
|
||||
if ((Get-Variable 'DoNotAbortNativeToolsInstallationOnFailure' -ErrorAction 'SilentlyContinue') -and $DoNotAbortNativeToolsInstallationOnFailure) {
|
||||
$showNativeToolsWarning = $true
|
||||
if ((Get-Variable 'DoNotDisplayNativeToolsInstallationWarnings' -ErrorAction 'SilentlyContinue') -and $DoNotDisplayNativeToolsInstallationWarnings) {
|
||||
$showNativeToolsWarning = $false
|
||||
}
|
||||
if ($showNativeToolsWarning) {
|
||||
Write-Warning $errMsg
|
||||
}
|
||||
$toolInstallationFailure = $true
|
||||
} else {
|
||||
# We cannot change this to Write-PipelineTelemetryError because of https://github.com/dotnet/arcade/issues/4482
|
||||
Write-Host $errMsg
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((Get-Variable 'toolInstallationFailure' -ErrorAction 'SilentlyContinue') -and $toolInstallationFailure) {
|
||||
# We cannot change this to Write-PipelineTelemetryError because of https://github.com/dotnet/arcade/issues/4482
|
||||
Write-Host 'Native tools bootstrap failed'
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
else {
|
||||
Write-Host 'No native tools defined in global.json'
|
||||
exit 0
|
||||
}
|
||||
|
||||
if ($Clean) {
|
||||
exit 0
|
||||
}
|
||||
if (Test-Path $InstallBin) {
|
||||
Write-Host 'Native tools are available from ' (Convert-Path -Path $InstallBin)
|
||||
Write-Host "##vso[task.prependpath]$(Convert-Path -Path $InstallBin)"
|
||||
return $InstallBin
|
||||
}
|
||||
else {
|
||||
Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message 'Native tools install directory does not exist, installation failed'
|
||||
exit 1
|
||||
}
|
||||
exit 0
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
|
|
@ -10,12 +10,13 @@ force=false
|
|||
download_retries=5
|
||||
retry_wait_time_seconds=30
|
||||
global_json_file="$(dirname "$(dirname "${scriptroot}")")/global.json"
|
||||
declare -A native_assets
|
||||
declare -a native_assets
|
||||
|
||||
. $scriptroot/pipeline-logging-functions.sh
|
||||
. $scriptroot/native/common-library.sh
|
||||
|
||||
while (($# > 0)); do
|
||||
lowerI="$(echo $1 | awk '{print tolower($0)}')"
|
||||
lowerI="$(echo $1 | tr "[:upper:]" "[:lower:]")"
|
||||
case $lowerI in
|
||||
--baseuri)
|
||||
base_uri=$2
|
||||
|
@ -33,6 +34,14 @@ while (($# > 0)); do
|
|||
force=true
|
||||
shift 1
|
||||
;;
|
||||
--donotabortonfailure)
|
||||
donotabortonfailure=true
|
||||
shift 1
|
||||
;;
|
||||
--donotdisplaywarnings)
|
||||
donotdisplaywarnings=true
|
||||
shift 1
|
||||
;;
|
||||
--downloadretries)
|
||||
download_retries=$2
|
||||
shift 2
|
||||
|
@ -51,6 +60,8 @@ while (($# > 0)); do
|
|||
echo " - (default) %USERPROFILE%/.netcoreeng/native"
|
||||
echo ""
|
||||
echo " --clean Switch specifying not to install anything, but cleanup native asset folders"
|
||||
echo " --donotabortonfailure Switch specifiying whether to abort native tools installation on failure"
|
||||
echo " --donotdisplaywarnings Switch specifiying whether to display warnings during native tools installation on failure"
|
||||
echo " --force Clean and then install tools"
|
||||
echo " --help Print help and exit"
|
||||
echo ""
|
||||
|
@ -65,24 +76,89 @@ while (($# > 0)); do
|
|||
done
|
||||
|
||||
function ReadGlobalJsonNativeTools {
|
||||
# Get the native-tools section from the global.json.
|
||||
local native_tools_section=$(cat $global_json_file | awk '/"native-tools"/,/}/')
|
||||
# Only extract the contents of the object.
|
||||
local native_tools_list=$(echo $native_tools_section | awk -F"[{}]" '{print $2}')
|
||||
native_tools_list=${native_tools_list//[\" ]/}
|
||||
native_tools_list=$( echo "$native_tools_list" | sed 's/\s//g' | sed 's/,/\n/g' )
|
||||
# happy path: we have a proper JSON parsing tool `jq(1)` in PATH!
|
||||
if command -v jq &> /dev/null; then
|
||||
|
||||
local old_IFS=$IFS
|
||||
while read -r line; do
|
||||
# Lines are of the form: 'tool:version'
|
||||
IFS=:
|
||||
while read -r key value; do
|
||||
native_assets[$key]=$value
|
||||
done <<< "$line"
|
||||
done <<< "$native_tools_list"
|
||||
IFS=$old_IFS
|
||||
# jq: read each key/value pair under "native-tools" entry and emit:
|
||||
# KEY="<entry-key>" VALUE="<entry-value>"
|
||||
# followed by a null byte.
|
||||
#
|
||||
# bash: read line with null byte delimeter and push to array (for later `eval`uation).
|
||||
|
||||
return 0;
|
||||
while IFS= read -rd '' line; do
|
||||
native_assets+=("$line")
|
||||
done < <(jq -r '. |
|
||||
select(has("native-tools")) |
|
||||
."native-tools" |
|
||||
keys[] as $k |
|
||||
@sh "KEY=\($k) VALUE=\(.[$k])\u0000"' "$global_json_file")
|
||||
|
||||
return
|
||||
fi
|
||||
|
||||
# Warning: falling back to manually parsing JSON, which is not recommended.
|
||||
|
||||
# Following routine matches the output and escaping logic of jq(1)'s @sh formatter used above.
|
||||
# It has been tested with several weird strings with escaped characters in entries (key and value)
|
||||
# and results were compared with the output of jq(1) in binary representation using xxd(1);
|
||||
# just before the assignment to 'native_assets' array (above and below).
|
||||
|
||||
# try to capture the section under "native-tools".
|
||||
if [[ ! "$(cat "$global_json_file")" =~ \"native-tools\"[[:space:]\:\{]*([^\}]+) ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
section="${BASH_REMATCH[1]}"
|
||||
|
||||
parseStarted=0
|
||||
possibleEnd=0
|
||||
escaping=0
|
||||
escaped=0
|
||||
isKey=1
|
||||
|
||||
for (( i=0; i<${#section}; i++ )); do
|
||||
char="${section:$i:1}"
|
||||
if ! ((parseStarted)) && [[ "$char" =~ [[:space:],:] ]]; then continue; fi
|
||||
|
||||
if ! ((escaping)) && [[ "$char" == "\\" ]]; then
|
||||
escaping=1
|
||||
elif ((escaping)) && ! ((escaped)); then
|
||||
escaped=1
|
||||
fi
|
||||
|
||||
if ! ((parseStarted)) && [[ "$char" == "\"" ]]; then
|
||||
parseStarted=1
|
||||
possibleEnd=0
|
||||
elif [[ "$char" == "'" ]]; then
|
||||
token="$token'\\\''"
|
||||
possibleEnd=0
|
||||
elif ((escaping)) || [[ "$char" != "\"" ]]; then
|
||||
token="$token$char"
|
||||
possibleEnd=1
|
||||
fi
|
||||
|
||||
if ((possibleEnd)) && ! ((escaping)) && [[ "$char" == "\"" ]]; then
|
||||
# Use printf to unescape token to match jq(1)'s @sh formatting rules.
|
||||
# do not use 'token="$(printf "$token")"' syntax, as $() eats the trailing linefeed.
|
||||
printf -v token "'$token'"
|
||||
|
||||
if ((isKey)); then
|
||||
KEY="$token"
|
||||
isKey=0
|
||||
else
|
||||
line="KEY=$KEY VALUE=$token"
|
||||
native_assets+=("$line")
|
||||
isKey=1
|
||||
fi
|
||||
|
||||
# reset for next token
|
||||
parseStarted=0
|
||||
token=
|
||||
elif ((escaping)) && ((escaped)); then
|
||||
escaping=0
|
||||
escaped=0
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
native_base_dir=$install_directory
|
||||
|
@ -91,6 +167,7 @@ if [[ -z $install_directory ]]; then
|
|||
fi
|
||||
|
||||
install_bin="${native_base_dir}/bin"
|
||||
installed_any=false
|
||||
|
||||
ReadGlobalJsonNativeTools
|
||||
|
||||
|
@ -99,14 +176,14 @@ if [[ ${#native_assets[@]} -eq 0 ]]; then
|
|||
exit 0;
|
||||
else
|
||||
native_installer_dir="$scriptroot/native"
|
||||
for tool in "${!native_assets[@]}"
|
||||
do
|
||||
tool_version=${native_assets[$tool]}
|
||||
installer_name="install-$tool.sh"
|
||||
installer_command="$native_installer_dir/$installer_name"
|
||||
for index in "${!native_assets[@]}"; do
|
||||
eval "${native_assets["$index"]}"
|
||||
|
||||
installer_path="$native_installer_dir/install-$KEY.sh"
|
||||
installer_command="$installer_path"
|
||||
installer_command+=" --baseuri $base_uri"
|
||||
installer_command+=" --installpath $install_bin"
|
||||
installer_command+=" --version $tool_version"
|
||||
installer_command+=" --version $VALUE"
|
||||
echo $installer_command
|
||||
|
||||
if [[ $force = true ]]; then
|
||||
|
@ -117,11 +194,29 @@ else
|
|||
installer_command+=" --clean"
|
||||
fi
|
||||
|
||||
$installer_command
|
||||
|
||||
if [[ $? != 0 ]]; then
|
||||
echo "Execution Failed" >&2
|
||||
exit 1
|
||||
if [[ -a $installer_path ]]; then
|
||||
$installer_command
|
||||
if [[ $? != 0 ]]; then
|
||||
if [[ $donotabortonfailure = true ]]; then
|
||||
if [[ $donotdisplaywarnings != true ]]; then
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed"
|
||||
fi
|
||||
else
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
$installed_any = true
|
||||
fi
|
||||
else
|
||||
if [[ $donotabortonfailure == true ]]; then
|
||||
if [[ $donotdisplaywarnings != true ]]; then
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed: no install script"
|
||||
fi
|
||||
else
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed: no install script"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
@ -134,8 +229,10 @@ if [[ -d $install_bin ]]; then
|
|||
echo "Native tools are available from $install_bin"
|
||||
echo "##vso[task.prependpath]$install_bin"
|
||||
else
|
||||
echo "Native tools install directory does not exist, installation failed" >&2
|
||||
exit 1
|
||||
if [[ $installed_any = true ]]; then
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Native tools install directory does not exist, installation failed"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
|
|
@ -1,135 +1,132 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $Operation,
|
||||
[string] $AuthToken,
|
||||
[string] $CommitSha,
|
||||
[string] $RepoName,
|
||||
[switch] $IsFeedPrivate
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
# Sets VSS_NUGET_EXTERNAL_FEED_ENDPOINTS based on the "darc-int-*" feeds defined in NuGet.config. This is needed
|
||||
# in build agents by CredProvider to authenticate the restore requests to internal feeds as specified in
|
||||
# https://github.com/microsoft/artifacts-credprovider/blob/0f53327cd12fd893d8627d7b08a2171bf5852a41/README.md#environment-variables. This should ONLY be called from identified
|
||||
# internal builds
|
||||
function SetupCredProvider {
|
||||
param(
|
||||
[string] $AuthToken
|
||||
)
|
||||
|
||||
# Install the Cred Provider NuGet plugin
|
||||
Write-Host "Setting up Cred Provider NuGet plugin in the agent..."
|
||||
Write-Host "Getting 'installcredprovider.ps1' from 'https://github.com/microsoft/artifacts-credprovider'..."
|
||||
|
||||
$url = 'https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1'
|
||||
|
||||
Write-Host "Writing the contents of 'installcredprovider.ps1' locally..."
|
||||
Invoke-WebRequest $url -OutFile installcredprovider.ps1
|
||||
|
||||
Write-Host "Installing plugin..."
|
||||
.\installcredprovider.ps1 -Force
|
||||
|
||||
Write-Host "Deleting local copy of 'installcredprovider.ps1'..."
|
||||
Remove-Item .\installcredprovider.ps1
|
||||
|
||||
if (-Not("$env:USERPROFILE\.nuget\plugins\netcore")) {
|
||||
Write-Host "CredProvider plugin was not installed correctly!"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
else {
|
||||
Write-Host "CredProvider plugin was installed correctly!"
|
||||
}
|
||||
|
||||
# Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable
|
||||
# feeds successfully
|
||||
|
||||
$nugetConfigPath = "$RepoRoot\NuGet.config"
|
||||
|
||||
if (-Not (Test-Path -Path $nugetConfigPath)) {
|
||||
Write-Host "NuGet.config file not found in repo's root!"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
$endpoints = New-Object System.Collections.ArrayList
|
||||
$nugetConfigPackageSources = Select-Xml -Path $nugetConfigPath -XPath "//packageSources/add[contains(@key, 'darc-int-')]/@value" | foreach{$_.Node.Value}
|
||||
|
||||
if (($nugetConfigPackageSources | Measure-Object).Count -gt 0 ) {
|
||||
foreach ($stableRestoreResource in $nugetConfigPackageSources) {
|
||||
$trimmedResource = ([string]$stableRestoreResource).Trim()
|
||||
[void]$endpoints.Add(@{endpoint="$trimmedResource"; password="$AuthToken"})
|
||||
}
|
||||
}
|
||||
|
||||
if (($endpoints | Measure-Object).Count -gt 0) {
|
||||
# Create the JSON object. It should look like '{"endpointCredentials": [{"endpoint":"http://example.index.json", "username":"optional", "password":"accesstoken"}]}'
|
||||
$endpointCredentials = @{endpointCredentials=$endpoints} | ConvertTo-Json -Compress
|
||||
|
||||
# Create the environment variables the AzDo way
|
||||
Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data $endpointCredentials -Properties @{
|
||||
'variable' = 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS'
|
||||
'issecret' = 'false'
|
||||
}
|
||||
|
||||
# We don't want sessions cached since we will be updating the endpoints quite frequently
|
||||
Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data 'False' -Properties @{
|
||||
'variable' = 'NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED'
|
||||
'issecret' = 'false'
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host "No internal endpoints found in NuGet.config"
|
||||
}
|
||||
}
|
||||
|
||||
#Workaround for https://github.com/microsoft/msbuild/issues/4430
|
||||
function InstallDotNetSdkAndRestoreArcade {
|
||||
$dotnetTempDir = "$RepoRoot\dotnet"
|
||||
$dotnetSdkVersion="2.1.507" # After experimentation we know this version works when restoring the SDK (compared to 3.0.*)
|
||||
$dotnet = "$dotnetTempDir\dotnet.exe"
|
||||
$restoreProjPath = "$PSScriptRoot\restore.proj"
|
||||
|
||||
Write-Host "Installing dotnet SDK version $dotnetSdkVersion to restore Arcade SDK..."
|
||||
InstallDotNetSdk "$dotnetTempDir" "$dotnetSdkVersion"
|
||||
|
||||
'<Project Sdk="Microsoft.DotNet.Arcade.Sdk"/>' | Out-File "$restoreProjPath"
|
||||
|
||||
& $dotnet restore $restoreProjPath
|
||||
|
||||
Write-Host "Arcade SDK restored!"
|
||||
|
||||
if (Test-Path -Path $restoreProjPath) {
|
||||
Remove-Item $restoreProjPath
|
||||
}
|
||||
|
||||
if (Test-Path -Path $dotnetTempDir) {
|
||||
Remove-Item $dotnetTempDir -Recurse
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Push-Location $PSScriptRoot
|
||||
|
||||
if ($Operation -like "setup") {
|
||||
SetupCredProvider $AuthToken
|
||||
}
|
||||
elseif ($Operation -like "install-restore") {
|
||||
InstallDotNetSdkAndRestoreArcade
|
||||
}
|
||||
else {
|
||||
Write-Host "Unknown operation '$Operation'!"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
finally {
|
||||
Pop-Location
|
||||
}
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][string] $Operation,
|
||||
[string] $AuthToken,
|
||||
[string] $CommitSha,
|
||||
[string] $RepoName,
|
||||
[switch] $IsFeedPrivate
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
Set-StrictMode -Version 2.0
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
# Sets VSS_NUGET_EXTERNAL_FEED_ENDPOINTS based on the "darc-int-*" feeds defined in NuGet.config. This is needed
|
||||
# in build agents by CredProvider to authenticate the restore requests to internal feeds as specified in
|
||||
# https://github.com/microsoft/artifacts-credprovider/blob/0f53327cd12fd893d8627d7b08a2171bf5852a41/README.md#environment-variables. This should ONLY be called from identified
|
||||
# internal builds
|
||||
function SetupCredProvider {
|
||||
param(
|
||||
[string] $AuthToken
|
||||
)
|
||||
|
||||
# Install the Cred Provider NuGet plugin
|
||||
Write-Host 'Setting up Cred Provider NuGet plugin in the agent...'
|
||||
Write-Host "Getting 'installcredprovider.ps1' from 'https://github.com/microsoft/artifacts-credprovider'..."
|
||||
|
||||
$url = 'https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1'
|
||||
|
||||
Write-Host "Writing the contents of 'installcredprovider.ps1' locally..."
|
||||
Invoke-WebRequest $url -OutFile installcredprovider.ps1
|
||||
|
||||
Write-Host 'Installing plugin...'
|
||||
.\installcredprovider.ps1 -Force
|
||||
|
||||
Write-Host "Deleting local copy of 'installcredprovider.ps1'..."
|
||||
Remove-Item .\installcredprovider.ps1
|
||||
|
||||
if (-Not("$env:USERPROFILE\.nuget\plugins\netcore")) {
|
||||
Write-PipelineTelemetryError -Category 'Arcade' -Message 'CredProvider plugin was not installed correctly!'
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
else {
|
||||
Write-Host 'CredProvider plugin was installed correctly!'
|
||||
}
|
||||
|
||||
# Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable
|
||||
# feeds successfully
|
||||
|
||||
$nugetConfigPath = Join-Path $RepoRoot "NuGet.config"
|
||||
|
||||
if (-Not (Test-Path -Path $nugetConfigPath)) {
|
||||
Write-PipelineTelemetryError -Category 'Build' -Message 'NuGet.config file not found in repo root!'
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
$endpoints = New-Object System.Collections.ArrayList
|
||||
$nugetConfigPackageSources = Select-Xml -Path $nugetConfigPath -XPath "//packageSources/add[contains(@key, 'darc-int-')]/@value" | foreach{$_.Node.Value}
|
||||
|
||||
if (($nugetConfigPackageSources | Measure-Object).Count -gt 0 ) {
|
||||
foreach ($stableRestoreResource in $nugetConfigPackageSources) {
|
||||
$trimmedResource = ([string]$stableRestoreResource).Trim()
|
||||
[void]$endpoints.Add(@{endpoint="$trimmedResource"; password="$AuthToken"})
|
||||
}
|
||||
}
|
||||
|
||||
if (($endpoints | Measure-Object).Count -gt 0) {
|
||||
$endpointCredentials = @{endpointCredentials=$endpoints} | ConvertTo-Json -Compress
|
||||
|
||||
# Create the environment variables the AzDo way
|
||||
Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data $endpointCredentials -Properties @{
|
||||
'variable' = 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS'
|
||||
'issecret' = 'false'
|
||||
}
|
||||
|
||||
# We don't want sessions cached since we will be updating the endpoints quite frequently
|
||||
Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data 'False' -Properties @{
|
||||
'variable' = 'NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED'
|
||||
'issecret' = 'false'
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host 'No internal endpoints found in NuGet.config'
|
||||
}
|
||||
}
|
||||
|
||||
#Workaround for https://github.com/microsoft/msbuild/issues/4430
|
||||
function InstallDotNetSdkAndRestoreArcade {
|
||||
$dotnetTempDir = Join-Path $RepoRoot "dotnet"
|
||||
$dotnetSdkVersion="2.1.507" # After experimentation we know this version works when restoring the SDK (compared to 3.0.*)
|
||||
$dotnet = "$dotnetTempDir\dotnet.exe"
|
||||
$restoreProjPath = "$PSScriptRoot\restore.proj"
|
||||
|
||||
Write-Host "Installing dotnet SDK version $dotnetSdkVersion to restore Arcade SDK..."
|
||||
InstallDotNetSdk "$dotnetTempDir" "$dotnetSdkVersion"
|
||||
|
||||
'<Project Sdk="Microsoft.DotNet.Arcade.Sdk"/>' | Out-File "$restoreProjPath"
|
||||
|
||||
& $dotnet restore $restoreProjPath
|
||||
|
||||
Write-Host 'Arcade SDK restored!'
|
||||
|
||||
if (Test-Path -Path $restoreProjPath) {
|
||||
Remove-Item $restoreProjPath
|
||||
}
|
||||
|
||||
if (Test-Path -Path $dotnetTempDir) {
|
||||
Remove-Item $dotnetTempDir -Recurse
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Push-Location $PSScriptRoot
|
||||
|
||||
if ($Operation -like 'setup') {
|
||||
SetupCredProvider $AuthToken
|
||||
}
|
||||
elseif ($Operation -like 'install-restore') {
|
||||
InstallDotNetSdkAndRestoreArcade
|
||||
}
|
||||
else {
|
||||
Write-PipelineTelemetryError -Category 'Arcade' -Message "Unknown operation '$Operation'!"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'Arcade' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
finally {
|
||||
Pop-Location
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ function SetupCredProvider {
|
|||
rm installcredprovider.sh
|
||||
|
||||
if [ ! -d "$HOME/.nuget/plugins" ]; then
|
||||
echo "CredProvider plugin was not installed correctly!"
|
||||
Write-PipelineTelemetryError -category 'Build' 'CredProvider plugin was not installed correctly!'
|
||||
ExitWithExitCode 1
|
||||
else
|
||||
echo "CredProvider plugin was installed correctly!"
|
||||
|
@ -39,10 +39,10 @@ function SetupCredProvider {
|
|||
# Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable
|
||||
# feeds successfully
|
||||
|
||||
local nugetConfigPath="$repo_root/NuGet.config"
|
||||
local nugetConfigPath="{$repo_root}NuGet.config"
|
||||
|
||||
if [ ! "$nugetConfigPath" ]; then
|
||||
echo "NuGet.config file not found in repo's root!"
|
||||
Write-PipelineTelemetryError -category 'Build' "NuGet.config file not found in repo's root!"
|
||||
ExitWithExitCode 1
|
||||
fi
|
||||
|
||||
|
@ -62,7 +62,6 @@ function SetupCredProvider {
|
|||
endpoints+=']'
|
||||
|
||||
if [ ${#endpoints} -gt 2 ]; then
|
||||
# Create the JSON object. It should look like '{"endpointCredentials": [{"endpoint":"http://example.index.json", "username":"optional", "password":"accesstoken"}]}'
|
||||
local endpointCredentials="{\"endpointCredentials\": "$endpoints"}"
|
||||
|
||||
echo "##vso[task.setvariable variable=VSS_NUGET_EXTERNAL_FEED_ENDPOINTS]$endpointCredentials"
|
||||
|
@ -102,7 +101,7 @@ authToken=''
|
|||
repoName=''
|
||||
|
||||
while [[ $# > 0 ]]; do
|
||||
opt="$(echo "$1" | awk '{print tolower($0)}')"
|
||||
opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")"
|
||||
case "$opt" in
|
||||
--operation)
|
||||
operation=$2
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE file in the project root for more information. -->
|
||||
<Project>
|
||||
<Import Project="Sdk.props" Sdk="Microsoft.DotNet.Arcade.Sdk" />
|
||||
</Project>
|
||||
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. -->
|
||||
<Project>
|
||||
<Import Project="Sdk.props" Sdk="Microsoft.DotNet.Arcade.Sdk" />
|
||||
</Project>
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<packageSources>
|
||||
<clear />
|
||||
<add key="dotnet-core-internal-tooling" value="https://pkgs.dev.azure.com/devdiv/_packaging/dotnet-core-internal-tooling/nuget/v3/index.json" />
|
||||
</packageSources>
|
||||
</configuration>
|
|
@ -1,27 +1,27 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -->
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net472</TargetFramework>
|
||||
<ImportDirectoryBuildTargets>false</ImportDirectoryBuildTargets>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<!-- Clear references, the SDK may add some depending on UsuingToolXxx settings, but we only want to restore the following -->
|
||||
<PackageReference Remove="@(PackageReference)"/>
|
||||
<PackageReference Include="Microsoft.DotNet.IBCMerge" Version="$(MicrosoftDotNetIBCMergeVersion)" Condition="'$(UsingToolIbcOptimization)' == 'true'" />
|
||||
<PackageReference Include="Drop.App" Version="$(DropAppVersion)" ExcludeAssets="all" Condition="'$(UsingToolVisualStudioIbcTraining)' == 'true'"/>
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<RestoreSources></RestoreSources>
|
||||
<RestoreSources Condition="'$(UsingToolIbcOptimization)' == 'true'">
|
||||
https://devdiv.pkgs.visualstudio.com/_packaging/dotnet-core-internal-tooling/nuget/v3/index.json;
|
||||
</RestoreSources>
|
||||
<RestoreSources Condition="'$(UsingToolVisualStudioIbcTraining)' == 'true'">
|
||||
$(RestoreSources);
|
||||
https://devdiv.pkgs.visualstudio.com/_packaging/VS/nuget/v3/index.json;
|
||||
</RestoreSources>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Repository extensibility point -->
|
||||
<Import Project="$(RepositoryEngineeringDir)InternalTools.props" Condition="Exists('$(RepositoryEngineeringDir)InternalTools.props')" />
|
||||
</Project>
|
||||
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. -->
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net472</TargetFramework>
|
||||
<ImportDirectoryBuildTargets>false</ImportDirectoryBuildTargets>
|
||||
<AutomaticallyUseReferenceAssemblyPackages>false</AutomaticallyUseReferenceAssemblyPackages>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<!-- Clear references, the SDK may add some depending on UsuingToolXxx settings, but we only want to restore the following -->
|
||||
<PackageReference Remove="@(PackageReference)"/>
|
||||
<PackageReference Include="Microsoft.DotNet.IBCMerge" Version="$(MicrosoftDotNetIBCMergeVersion)" Condition="'$(UsingToolIbcOptimization)' == 'true'" />
|
||||
<PackageReference Include="Drop.App" Version="$(DropAppVersion)" ExcludeAssets="all" Condition="'$(UsingToolVisualStudioIbcTraining)' == 'true'"/>
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<RestoreSources></RestoreSources>
|
||||
<RestoreSources Condition="'$(UsingToolIbcOptimization)' == 'true'">
|
||||
https://devdiv.pkgs.visualstudio.com/_packaging/dotnet-core-internal-tooling/nuget/v3/index.json;
|
||||
</RestoreSources>
|
||||
<RestoreSources Condition="'$(UsingToolVisualStudioIbcTraining)' == 'true'">
|
||||
$(RestoreSources);
|
||||
https://devdiv.pkgs.visualstudio.com/_packaging/VS/nuget/v3/index.json;
|
||||
</RestoreSources>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Repository extensibility point -->
|
||||
<Import Project="$(RepositoryEngineeringDir)InternalTools.props" Condition="Exists('$(RepositoryEngineeringDir)InternalTools.props')" />
|
||||
</Project>
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
[CmdletBinding(PositionalBinding=$false)]
|
||||
Param(
|
||||
[string] $verbosity = "minimal",
|
||||
[string] $verbosity = 'minimal',
|
||||
[bool] $warnAsError = $true,
|
||||
[bool] $nodeReuse = $true,
|
||||
[switch] $ci,
|
||||
[switch] $prepareMachine,
|
||||
[switch] $excludePrereleaseVS,
|
||||
[string] $msbuildEngine = $null,
|
||||
[Parameter(ValueFromRemainingArguments=$true)][String[]]$extraArgs
|
||||
)
|
||||
|
||||
|
@ -18,9 +20,8 @@ try {
|
|||
MSBuild @extraArgs
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'Build' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ prepare_machine=false
|
|||
extra_args=''
|
||||
|
||||
while (($# > 0)); do
|
||||
lowerI="$(echo $1 | awk '{print tolower($0)}')"
|
||||
lowerI="$(echo $1 | tr "[:upper:]" "[:lower:]")"
|
||||
case $lowerI in
|
||||
--verbosity)
|
||||
verbosity=$2
|
||||
|
|
|
@ -48,7 +48,7 @@ function DownloadAndExtract {
|
|||
-Verbose:$Verbose
|
||||
|
||||
if ($DownloadStatus -Eq $False) {
|
||||
Write-Error "Download failed"
|
||||
Write-Error "Download failed from $Uri"
|
||||
return $False
|
||||
}
|
||||
|
||||
|
@ -145,9 +145,12 @@ function Get-File {
|
|||
New-Item -path $DownloadDirectory -force -itemType "Directory" | Out-Null
|
||||
}
|
||||
|
||||
$TempPath = "$Path.tmp"
|
||||
if (Test-Path -IsValid -Path $Uri) {
|
||||
Write-Verbose "'$Uri' is a file path, copying file to '$Path'"
|
||||
Copy-Item -Path $Uri -Destination $Path
|
||||
Write-Verbose "'$Uri' is a file path, copying temporarily to '$TempPath'"
|
||||
Copy-Item -Path $Uri -Destination $TempPath
|
||||
Write-Verbose "Moving temporary file to '$Path'"
|
||||
Move-Item -Path $TempPath -Destination $Path
|
||||
return $?
|
||||
}
|
||||
else {
|
||||
|
@ -157,8 +160,10 @@ function Get-File {
|
|||
while($Attempt -Lt $DownloadRetries)
|
||||
{
|
||||
try {
|
||||
Invoke-WebRequest -UseBasicParsing -Uri $Uri -OutFile $Path
|
||||
Write-Verbose "Downloaded to '$Path'"
|
||||
Invoke-WebRequest -UseBasicParsing -Uri $Uri -OutFile $TempPath
|
||||
Write-Verbose "Downloaded to temporary location '$TempPath'"
|
||||
Move-Item -Path $TempPath -Destination $Path
|
||||
Write-Verbose "Moved temporary file to '$Path'"
|
||||
return $True
|
||||
}
|
||||
catch {
|
||||
|
@ -271,7 +276,8 @@ function Get-MachineArchitecture {
|
|||
}
|
||||
if (($ProcessorArchitecture -Eq "AMD64") -Or
|
||||
($ProcessorArchitecture -Eq "IA64") -Or
|
||||
($ProcessorArchitecture -Eq "ARM64")) {
|
||||
($ProcessorArchitecture -Eq "ARM64") -Or
|
||||
($ProcessorArchitecture -Eq "LOONGARCH64")) {
|
||||
return "x64"
|
||||
}
|
||||
return "x86"
|
||||
|
@ -359,16 +365,21 @@ function Expand-Zip {
|
|||
return $False
|
||||
}
|
||||
}
|
||||
if (-Not (Test-Path $OutputDirectory)) {
|
||||
New-Item -path $OutputDirectory -Force -itemType "Directory" | Out-Null
|
||||
|
||||
$TempOutputDirectory = Join-Path "$(Split-Path -Parent $OutputDirectory)" "$(Split-Path -Leaf $OutputDirectory).tmp"
|
||||
if (Test-Path $TempOutputDirectory) {
|
||||
Remove-Item $TempOutputDirectory -Force -Recurse
|
||||
}
|
||||
New-Item -Path $TempOutputDirectory -Force -ItemType "Directory" | Out-Null
|
||||
|
||||
Add-Type -assembly "system.io.compression.filesystem"
|
||||
[io.compression.zipfile]::ExtractToDirectory("$ZipPath", "$OutputDirectory")
|
||||
[io.compression.zipfile]::ExtractToDirectory("$ZipPath", "$TempOutputDirectory")
|
||||
if ($? -Eq $False) {
|
||||
Write-Error "Unable to extract '$ZipPath'"
|
||||
return $False
|
||||
}
|
||||
|
||||
Move-Item -Path $TempOutputDirectory -Destination $OutputDirectory
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
|
|
|
@ -34,7 +34,7 @@ function ExpandZip {
|
|||
echo "'Force flag enabled, but '$output_directory' exists. Removing directory"
|
||||
rm -rf $output_directory
|
||||
if [[ $? != 0 ]]; then
|
||||
echo Unable to remove '$output_directory'>&2
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Unable to remove '$output_directory'"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
@ -45,7 +45,7 @@ function ExpandZip {
|
|||
echo "Extracting archive"
|
||||
tar -xf $zip_path -C $output_directory
|
||||
if [[ $? != 0 ]]; then
|
||||
echo "Unable to extract '$zip_path'" >&2
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Unable to extract '$zip_path'"
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
@ -117,7 +117,7 @@ function DownloadAndExtract {
|
|||
# Download file
|
||||
GetFile "$uri" "$temp_tool_path" $force $download_retries $retry_wait_time_seconds
|
||||
if [[ $? != 0 ]]; then
|
||||
echo "Failed to download '$uri' to '$temp_tool_path'." >&2
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Failed to download '$uri' to '$temp_tool_path'."
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
@ -125,7 +125,7 @@ function DownloadAndExtract {
|
|||
echo "extracting from $temp_tool_path to $installDir"
|
||||
ExpandZip "$temp_tool_path" "$installDir" $force $download_retries $retry_wait_time_seconds
|
||||
if [[ $? != 0 ]]; then
|
||||
echo "Failed to extract '$temp_tool_path' to '$installDir'." >&2
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Failed to extract '$temp_tool_path' to '$installDir'."
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
@ -148,8 +148,12 @@ function NewScriptShim {
|
|||
fi
|
||||
|
||||
if [[ ! -f $tool_file_path ]]; then
|
||||
echo "Specified tool file path:'$tool_file_path' does not exist" >&2
|
||||
return 1
|
||||
# try to see if the path is lower cased
|
||||
tool_file_path="$(echo $tool_file_path | tr "[:upper:]" "[:lower:]")"
|
||||
if [[ ! -f $tool_file_path ]]; then
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Specified tool file path:'$tool_file_path' does not exist"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
local shim_contents=$'#!/usr/bin/env bash\n'
|
||||
|
|
|
@ -0,0 +1,144 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# This file detects the C/C++ compiler and exports it to the CC/CXX environment variables
|
||||
#
|
||||
# NOTE: some scripts source this file and rely on stdout being empty, make sure to not output anything here!
|
||||
|
||||
if [[ "$#" -lt 3 ]]; then
|
||||
echo "Usage..."
|
||||
echo "init-compiler.sh <script directory> <Architecture> <compiler>"
|
||||
echo "Specify the script directory."
|
||||
echo "Specify the target architecture."
|
||||
echo "Specify the name of compiler (clang or gcc)."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
nativescriptroot="$1"
|
||||
build_arch="$2"
|
||||
compiler="$3"
|
||||
|
||||
case "$compiler" in
|
||||
clang*|-clang*|--clang*)
|
||||
# clangx.y or clang-x.y
|
||||
version="$(echo "$compiler" | tr -d '[:alpha:]-=')"
|
||||
parts=(${version//./ })
|
||||
majorVersion="${parts[0]}"
|
||||
minorVersion="${parts[1]}"
|
||||
if [[ -z "$minorVersion" && "$majorVersion" -le 6 ]]; then
|
||||
minorVersion=0;
|
||||
fi
|
||||
compiler=clang
|
||||
;;
|
||||
|
||||
gcc*|-gcc*|--gcc*)
|
||||
# gccx.y or gcc-x.y
|
||||
version="$(echo "$compiler" | tr -d '[:alpha:]-=')"
|
||||
parts=(${version//./ })
|
||||
majorVersion="${parts[0]}"
|
||||
minorVersion="${parts[1]}"
|
||||
compiler=gcc
|
||||
;;
|
||||
esac
|
||||
|
||||
cxxCompiler="$compiler++"
|
||||
|
||||
. "$nativescriptroot"/../pipeline-logging-functions.sh
|
||||
|
||||
# clear the existing CC and CXX from environment
|
||||
CC=
|
||||
CXX=
|
||||
LDFLAGS=
|
||||
|
||||
if [[ "$compiler" == "gcc" ]]; then cxxCompiler="g++"; fi
|
||||
|
||||
check_version_exists() {
|
||||
desired_version=-1
|
||||
|
||||
# Set up the environment to be used for building with the desired compiler.
|
||||
if command -v "$compiler-$1.$2" > /dev/null; then
|
||||
desired_version="-$1.$2"
|
||||
elif command -v "$compiler$1$2" > /dev/null; then
|
||||
desired_version="$1$2"
|
||||
elif command -v "$compiler-$1$2" > /dev/null; then
|
||||
desired_version="-$1$2"
|
||||
fi
|
||||
|
||||
echo "$desired_version"
|
||||
}
|
||||
|
||||
if [[ -z "$CLR_CC" ]]; then
|
||||
|
||||
# Set default versions
|
||||
if [[ -z "$majorVersion" ]]; then
|
||||
# note: gcc (all versions) and clang versions higher than 6 do not have minor version in file name, if it is zero.
|
||||
if [[ "$compiler" == "clang" ]]; then versions=( 13 12 11 10 9 8 7 6.0 5.0 4.0 3.9 3.8 3.7 3.6 3.5 )
|
||||
elif [[ "$compiler" == "gcc" ]]; then versions=( 12 11 10 9 8 7 6 5 4.9 ); fi
|
||||
|
||||
for version in "${versions[@]}"; do
|
||||
parts=(${version//./ })
|
||||
desired_version="$(check_version_exists "${parts[0]}" "${parts[1]}")"
|
||||
if [[ "$desired_version" != "-1" ]]; then majorVersion="${parts[0]}"; break; fi
|
||||
done
|
||||
|
||||
if [[ -z "$majorVersion" ]]; then
|
||||
if command -v "$compiler" > /dev/null; then
|
||||
if [[ "$(uname)" != "Darwin" ]]; then
|
||||
Write-PipelineTelemetryError -category "Build" -type "warning" "Specific version of $compiler not found, falling back to use the one in PATH."
|
||||
fi
|
||||
CC="$(command -v "$compiler")"
|
||||
CXX="$(command -v "$cxxCompiler")"
|
||||
else
|
||||
Write-PipelineTelemetryError -category "Build" "No usable version of $compiler found."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
if [[ "$compiler" == "clang" && "$majorVersion" -lt 5 ]]; then
|
||||
if [[ "$build_arch" == "arm" || "$build_arch" == "armel" ]]; then
|
||||
if command -v "$compiler" > /dev/null; then
|
||||
Write-PipelineTelemetryError -category "Build" -type "warning" "Found clang version $majorVersion which is not supported on arm/armel architectures, falling back to use clang from PATH."
|
||||
CC="$(command -v "$compiler")"
|
||||
CXX="$(command -v "$cxxCompiler")"
|
||||
else
|
||||
Write-PipelineTelemetryError -category "Build" "Found clang version $majorVersion which is not supported on arm/armel architectures, and there is no clang in PATH."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
else
|
||||
desired_version="$(check_version_exists "$majorVersion" "$minorVersion")"
|
||||
if [[ "$desired_version" == "-1" ]]; then
|
||||
Write-PipelineTelemetryError -category "Build" "Could not find specific version of $compiler: $majorVersion $minorVersion."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -z "$CC" ]]; then
|
||||
CC="$(command -v "$compiler$desired_version")"
|
||||
CXX="$(command -v "$cxxCompiler$desired_version")"
|
||||
if [[ -z "$CXX" ]]; then CXX="$(command -v "$cxxCompiler")"; fi
|
||||
fi
|
||||
else
|
||||
if [[ ! -f "$CLR_CC" ]]; then
|
||||
Write-PipelineTelemetryError -category "Build" "CLR_CC is set but path '$CLR_CC' does not exist"
|
||||
exit 1
|
||||
fi
|
||||
CC="$CLR_CC"
|
||||
CXX="$CLR_CXX"
|
||||
fi
|
||||
|
||||
if [[ -z "$CC" ]]; then
|
||||
Write-PipelineTelemetryError -category "Build" "Unable to find $compiler."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Only lld version >= 9 can be considered stable
|
||||
if [[ "$compiler" == "clang" && "$majorVersion" -ge 9 ]]; then
|
||||
if "$CC" -fuse-ld=lld -Wl,--version >/dev/null 2>&1; then
|
||||
LDFLAGS="-fuse-ld=lld"
|
||||
fi
|
||||
fi
|
||||
|
||||
SCAN_BUILD_COMMAND="$(command -v "scan-build$desired_version")"
|
||||
|
||||
export CC CXX LDFLAGS SCAN_BUILD_COMMAND
|
|
@ -14,7 +14,7 @@ download_retries=5
|
|||
retry_wait_time_seconds=30
|
||||
|
||||
while (($# > 0)); do
|
||||
lowerI="$(echo $1 | awk '{print tolower($0)}')"
|
||||
lowerI="$(echo $1 | tr "[:upper:]" "[:lower:]")"
|
||||
case $lowerI in
|
||||
--baseuri)
|
||||
base_uri=$2
|
||||
|
@ -63,7 +63,7 @@ done
|
|||
|
||||
tool_name="cmake-test"
|
||||
tool_os=$(GetCurrentOS)
|
||||
tool_folder=$(echo $tool_os | awk '{print tolower($0)}')
|
||||
tool_folder="$(echo $tool_os | tr "[:upper:]" "[:lower:]")"
|
||||
tool_arch="x86_64"
|
||||
tool_name_moniker="$tool_name-$version-$tool_os-$tool_arch"
|
||||
tool_install_directory="$install_path/$tool_name/$version"
|
||||
|
@ -101,7 +101,7 @@ fi
|
|||
DownloadAndExtract $uri $tool_install_directory $force $download_retries $retry_wait_time_seconds
|
||||
|
||||
if [[ $? != 0 ]]; then
|
||||
echo "Installation failed" >&2
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' 'Installation failed'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
@ -110,8 +110,8 @@ fi
|
|||
NewScriptShim $shim_path $tool_file_path true
|
||||
|
||||
if [[ $? != 0 ]]; then
|
||||
echo "Shim generation failed" >&2
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' 'Shim generation failed'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
exit 0
|
||||
|
|
|
@ -14,7 +14,7 @@ download_retries=5
|
|||
retry_wait_time_seconds=30
|
||||
|
||||
while (($# > 0)); do
|
||||
lowerI="$(echo $1 | awk '{print tolower($0)}')"
|
||||
lowerI="$(echo $1 | tr "[:upper:]" "[:lower:]")"
|
||||
case $lowerI in
|
||||
--baseuri)
|
||||
base_uri=$2
|
||||
|
@ -63,7 +63,7 @@ done
|
|||
|
||||
tool_name="cmake"
|
||||
tool_os=$(GetCurrentOS)
|
||||
tool_folder=$(echo $tool_os | awk '{print tolower($0)}')
|
||||
tool_folder="$(echo $tool_os | tr "[:upper:]" "[:lower:]")"
|
||||
tool_arch="x86_64"
|
||||
tool_name_moniker="$tool_name-$version-$tool_os-$tool_arch"
|
||||
tool_install_directory="$install_path/$tool_name/$version"
|
||||
|
@ -101,7 +101,7 @@ fi
|
|||
DownloadAndExtract $uri $tool_install_directory $force $download_retries $retry_wait_time_seconds
|
||||
|
||||
if [[ $? != 0 ]]; then
|
||||
echo "Installation failed" >&2
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' 'Installation failed'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
@ -110,8 +110,8 @@ fi
|
|||
NewScriptShim $shim_path $tool_file_path true
|
||||
|
||||
if [[ $? != 0 ]]; then
|
||||
echo "Shim generation failed" >&2
|
||||
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' 'Shim generation failed'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
exit 0
|
||||
|
|
|
@ -1,130 +1,132 @@
|
|||
<#
|
||||
.SYNOPSIS
|
||||
Install native tool
|
||||
|
||||
.DESCRIPTION
|
||||
Install cmake native tool from Azure blob storage
|
||||
|
||||
.PARAMETER InstallPath
|
||||
Base directory to install native tool to
|
||||
|
||||
.PARAMETER BaseUri
|
||||
Base file directory or Url from which to acquire tool archives
|
||||
|
||||
.PARAMETER CommonLibraryDirectory
|
||||
Path to folder containing common library modules
|
||||
|
||||
.PARAMETER Force
|
||||
Force install of tools even if they previously exist
|
||||
|
||||
.PARAMETER Clean
|
||||
Don't install the tool, just clean up the current install of the tool
|
||||
|
||||
.PARAMETER DownloadRetries
|
||||
Total number of retry attempts
|
||||
|
||||
.PARAMETER RetryWaitTimeInSeconds
|
||||
Wait time between retry attempts in seconds
|
||||
|
||||
.NOTES
|
||||
Returns 0 if install succeeds, 1 otherwise
|
||||
#>
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
Param (
|
||||
[Parameter(Mandatory=$True)]
|
||||
[string] $ToolName,
|
||||
[Parameter(Mandatory=$True)]
|
||||
[string] $InstallPath,
|
||||
[Parameter(Mandatory=$True)]
|
||||
[string] $BaseUri,
|
||||
[Parameter(Mandatory=$True)]
|
||||
[string] $Version,
|
||||
[string] $CommonLibraryDirectory = $PSScriptRoot,
|
||||
[switch] $Force = $False,
|
||||
[switch] $Clean = $False,
|
||||
[int] $DownloadRetries = 5,
|
||||
[int] $RetryWaitTimeInSeconds = 30
|
||||
)
|
||||
|
||||
# Import common library modules
|
||||
Import-Module -Name (Join-Path $CommonLibraryDirectory "CommonLibrary.psm1")
|
||||
|
||||
try {
|
||||
# Define verbose switch if undefined
|
||||
$Verbose = $VerbosePreference -Eq "Continue"
|
||||
|
||||
$Arch = CommonLibrary\Get-MachineArchitecture
|
||||
$ToolOs = "win64"
|
||||
if($Arch -Eq "x32") {
|
||||
$ToolOs = "win32"
|
||||
}
|
||||
$ToolNameMoniker = "$ToolName-$Version-$ToolOs-$Arch"
|
||||
$ToolInstallDirectory = Join-Path $InstallPath "$ToolName\$Version\"
|
||||
$Uri = "$BaseUri/windows/$ToolName/$ToolNameMoniker.zip"
|
||||
$ShimPath = Join-Path $InstallPath "$ToolName.exe"
|
||||
|
||||
if ($Clean) {
|
||||
Write-Host "Cleaning $ToolInstallDirectory"
|
||||
if (Test-Path $ToolInstallDirectory) {
|
||||
Remove-Item $ToolInstallDirectory -Force -Recurse
|
||||
}
|
||||
Write-Host "Cleaning $ShimPath"
|
||||
if (Test-Path $ShimPath) {
|
||||
Remove-Item $ShimPath -Force
|
||||
}
|
||||
$ToolTempPath = CommonLibrary\Get-TempPathFilename -Path $Uri
|
||||
Write-Host "Cleaning $ToolTempPath"
|
||||
if (Test-Path $ToolTempPath) {
|
||||
Remove-Item $ToolTempPath -Force
|
||||
}
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Install tool
|
||||
if ((Test-Path $ToolInstallDirectory) -And (-Not $Force)) {
|
||||
Write-Verbose "$ToolName ($Version) already exists, skipping install"
|
||||
}
|
||||
else {
|
||||
$InstallStatus = CommonLibrary\DownloadAndExtract -Uri $Uri `
|
||||
-InstallDirectory $ToolInstallDirectory `
|
||||
-Force:$Force `
|
||||
-DownloadRetries $DownloadRetries `
|
||||
-RetryWaitTimeInSeconds $RetryWaitTimeInSeconds `
|
||||
-Verbose:$Verbose
|
||||
|
||||
if ($InstallStatus -Eq $False) {
|
||||
Write-Error "Installation failed"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
$ToolFilePath = Get-ChildItem $ToolInstallDirectory -Recurse -Filter "$ToolName.exe" | % { $_.FullName }
|
||||
if (@($ToolFilePath).Length -Gt 1) {
|
||||
Write-Error "There are multiple copies of $ToolName in $($ToolInstallDirectory): `n$(@($ToolFilePath | out-string))"
|
||||
exit 1
|
||||
} elseif (@($ToolFilePath).Length -Lt 1) {
|
||||
Write-Error "$ToolName was not found in $ToolFilePath."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Generate shim
|
||||
# Always rewrite shims so that we are referencing the expected version
|
||||
$GenerateShimStatus = CommonLibrary\New-ScriptShim -ShimName $ToolName `
|
||||
-ShimDirectory $InstallPath `
|
||||
-ToolFilePath "$ToolFilePath" `
|
||||
-BaseUri $BaseUri `
|
||||
-Force:$Force `
|
||||
-Verbose:$Verbose
|
||||
|
||||
if ($GenerateShimStatus -Eq $False) {
|
||||
Write-Error "Generate shim failed"
|
||||
return 1
|
||||
}
|
||||
|
||||
exit 0
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
exit 1
|
||||
}
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Install native tool
|
||||
|
||||
.DESCRIPTION
|
||||
Install cmake native tool from Azure blob storage
|
||||
|
||||
.PARAMETER InstallPath
|
||||
Base directory to install native tool to
|
||||
|
||||
.PARAMETER BaseUri
|
||||
Base file directory or Url from which to acquire tool archives
|
||||
|
||||
.PARAMETER CommonLibraryDirectory
|
||||
Path to folder containing common library modules
|
||||
|
||||
.PARAMETER Force
|
||||
Force install of tools even if they previously exist
|
||||
|
||||
.PARAMETER Clean
|
||||
Don't install the tool, just clean up the current install of the tool
|
||||
|
||||
.PARAMETER DownloadRetries
|
||||
Total number of retry attempts
|
||||
|
||||
.PARAMETER RetryWaitTimeInSeconds
|
||||
Wait time between retry attempts in seconds
|
||||
|
||||
.NOTES
|
||||
Returns 0 if install succeeds, 1 otherwise
|
||||
#>
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
Param (
|
||||
[Parameter(Mandatory=$True)]
|
||||
[string] $ToolName,
|
||||
[Parameter(Mandatory=$True)]
|
||||
[string] $InstallPath,
|
||||
[Parameter(Mandatory=$True)]
|
||||
[string] $BaseUri,
|
||||
[Parameter(Mandatory=$True)]
|
||||
[string] $Version,
|
||||
[string] $CommonLibraryDirectory = $PSScriptRoot,
|
||||
[switch] $Force = $False,
|
||||
[switch] $Clean = $False,
|
||||
[int] $DownloadRetries = 5,
|
||||
[int] $RetryWaitTimeInSeconds = 30
|
||||
)
|
||||
|
||||
. $PSScriptRoot\..\pipeline-logging-functions.ps1
|
||||
|
||||
# Import common library modules
|
||||
Import-Module -Name (Join-Path $CommonLibraryDirectory "CommonLibrary.psm1")
|
||||
|
||||
try {
|
||||
# Define verbose switch if undefined
|
||||
$Verbose = $VerbosePreference -Eq "Continue"
|
||||
|
||||
$Arch = CommonLibrary\Get-MachineArchitecture
|
||||
$ToolOs = "win64"
|
||||
if($Arch -Eq "x32") {
|
||||
$ToolOs = "win32"
|
||||
}
|
||||
$ToolNameMoniker = "$ToolName-$Version-$ToolOs-$Arch"
|
||||
$ToolInstallDirectory = Join-Path $InstallPath "$ToolName\$Version\"
|
||||
$Uri = "$BaseUri/windows/$ToolName/$ToolNameMoniker.zip"
|
||||
$ShimPath = Join-Path $InstallPath "$ToolName.exe"
|
||||
|
||||
if ($Clean) {
|
||||
Write-Host "Cleaning $ToolInstallDirectory"
|
||||
if (Test-Path $ToolInstallDirectory) {
|
||||
Remove-Item $ToolInstallDirectory -Force -Recurse
|
||||
}
|
||||
Write-Host "Cleaning $ShimPath"
|
||||
if (Test-Path $ShimPath) {
|
||||
Remove-Item $ShimPath -Force
|
||||
}
|
||||
$ToolTempPath = CommonLibrary\Get-TempPathFilename -Path $Uri
|
||||
Write-Host "Cleaning $ToolTempPath"
|
||||
if (Test-Path $ToolTempPath) {
|
||||
Remove-Item $ToolTempPath -Force
|
||||
}
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Install tool
|
||||
if ((Test-Path $ToolInstallDirectory) -And (-Not $Force)) {
|
||||
Write-Verbose "$ToolName ($Version) already exists, skipping install"
|
||||
}
|
||||
else {
|
||||
$InstallStatus = CommonLibrary\DownloadAndExtract -Uri $Uri `
|
||||
-InstallDirectory $ToolInstallDirectory `
|
||||
-Force:$Force `
|
||||
-DownloadRetries $DownloadRetries `
|
||||
-RetryWaitTimeInSeconds $RetryWaitTimeInSeconds `
|
||||
-Verbose:$Verbose
|
||||
|
||||
if ($InstallStatus -Eq $False) {
|
||||
Write-PipelineTelemetryError "Installation failed" -Category "NativeToolsetBootstrapping"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
$ToolFilePath = Get-ChildItem $ToolInstallDirectory -Recurse -Filter "$ToolName.exe" | % { $_.FullName }
|
||||
if (@($ToolFilePath).Length -Gt 1) {
|
||||
Write-Error "There are multiple copies of $ToolName in $($ToolInstallDirectory): `n$(@($ToolFilePath | out-string))"
|
||||
exit 1
|
||||
} elseif (@($ToolFilePath).Length -Lt 1) {
|
||||
Write-Host "$ToolName was not found in $ToolInstallDirectory."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Generate shim
|
||||
# Always rewrite shims so that we are referencing the expected version
|
||||
$GenerateShimStatus = CommonLibrary\New-ScriptShim -ShimName $ToolName `
|
||||
-ShimDirectory $InstallPath `
|
||||
-ToolFilePath "$ToolFilePath" `
|
||||
-BaseUri $BaseUri `
|
||||
-Force:$Force `
|
||||
-Verbose:$Verbose
|
||||
|
||||
if ($GenerateShimStatus -Eq $False) {
|
||||
Write-PipelineTelemetryError "Generate shim failed" -Category "NativeToolsetBootstrapping"
|
||||
return 1
|
||||
}
|
||||
|
||||
exit 0
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category "NativeToolsetBootstrapping" -Message $_
|
||||
exit 1
|
||||
}
|
||||
|
|
|
@ -1,102 +0,0 @@
|
|||
<Project Sdk="Microsoft.DotNet.Helix.Sdk" DefaultTargets="Test">
|
||||
|
||||
<PropertyGroup Condition="'$(AGENT_OS)' == 'Windows_NT'">
|
||||
<WorkItemCommand>%HELIX_CORRELATION_PAYLOAD%\performance\scripts\benchmarks_ci.py --csproj %HELIX_CORRELATION_PAYLOAD%\performance\$(TargetCsproj)</WorkItemCommand>
|
||||
<CliArguments>--dotnet-versions %DOTNET_VERSION% --cli-source-info args --cli-branch %PERFLAB_BRANCH% --cli-commit-sha %PERFLAB_HASH% --cli-repository https://github.com/%PERFLAB_REPO% --cli-source-timestamp %PERFLAB_BUILDTIMESTAMP%</CliArguments>
|
||||
<Python>py -3</Python>
|
||||
<CoreRun>%HELIX_CORRELATION_PAYLOAD%\Core_Root\CoreRun.exe</CoreRun>
|
||||
<BaselineCoreRun>%HELIX_CORRELATION_PAYLOAD%\Baseline_Core_Root\CoreRun.exe</BaselineCoreRun>
|
||||
<HelixPreCommands>$(HelixPreCommands);call %HELIX_CORRELATION_PAYLOAD%\performance\tools\machine-setup.cmd</HelixPreCommands>
|
||||
<ArtifactsDirectory>%HELIX_CORRELATION_PAYLOAD%\artifacts\BenchmarkDotNet.Artifacts</ArtifactsDirectory>
|
||||
<BaselineArtifactsDirectory>%HELIX_CORRELATION_PAYLOAD%\artifacts\BenchmarkDotNet.Artifacts_Baseline</BaselineArtifactsDirectory>
|
||||
<ResultsComparer>%HELIX_CORRELATION_PAYLOAD%\performance\src\tools\ResultsComparer\ResultsComparer.csproj</ResultsComparer>
|
||||
<DotnetExe>%HELIX_CORRELATION_PAYLOAD%\performance\tools\dotnet\$(Architecture)\dotnet.exe</DotnetExe>
|
||||
<Percent>%25%25</Percent>
|
||||
<XMLResults>%HELIX_WORKITEM_ROOT%\testResults.xml</XMLResults>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(AGENT_OS)' != 'Windows_NT' and '$(RunFromPerfRepo)' == 'false'">
|
||||
<BaseDirectory>$HELIX_CORRELATION_PAYLOAD</BaseDirectory>
|
||||
<PerformanceDirectory>$(BaseDirectory)/performance</PerformanceDirectory>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(AGENT_OS)' != 'Windows_NT' and '$(RunFromPerfRepo)' == 'true'">
|
||||
<BaseDirectory>$HELIX_WORKITEM_PAYLOAD</BaseDirectory>
|
||||
<PerformanceDirectory>$(BaseDirectory)</PerformanceDirectory>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(AGENT_OS)' != 'Windows_NT'">
|
||||
<WorkItemCommand>$(PerformanceDirectory)/scripts/benchmarks_ci.py --csproj $(PerformanceDirectory)/$(TargetCsproj)</WorkItemCommand>
|
||||
<CliArguments>--dotnet-versions $DOTNET_VERSION --cli-source-info args --cli-branch $PERFLAB_BRANCH --cli-commit-sha $PERFLAB_HASH --cli-repository https://github.com/$PERFLAB_REPO --cli-source-timestamp $PERFLAB_BUILDTIMESTAMP</CliArguments>
|
||||
<Python>python3</Python>
|
||||
<CoreRun>$(BaseDirectory)/Core_Root/corerun</CoreRun>
|
||||
<BaselineCoreRun>$(BaseDirectory)/Baseline_Core_Root/corerun</BaselineCoreRun>
|
||||
<HelixPreCommands>$(HelixPreCommands);chmod +x $(PerformanceDirectory)/tools/machine-setup.sh;. $(PerformanceDirectory)/tools/machine-setup.sh</HelixPreCommands>
|
||||
<ArtifactsDirectory>$(BaseDirectory)/artifacts/BenchmarkDotNet.Artifacts</ArtifactsDirectory>
|
||||
<BaselineArtifactsDirectory>$(BaseDirectory)/artifacts/BenchmarkDotNet.Artifacts_Baseline</BaselineArtifactsDirectory>
|
||||
<ResultsComparer>$(PerformanceDirectory)/src/tools/ResultsComparer/ResultsComparer.csproj</ResultsComparer>
|
||||
<DotnetExe>$(PerformanceDirectory)/tools/dotnet/$(Architecture)/dotnet</DotnetExe>
|
||||
<Percent>%25</Percent>
|
||||
<XMLResults>$HELIX_WORKITEM_ROOT/testResults.xml</XMLResults>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(UseCoreRun)' == 'true'">
|
||||
<CoreRunArgument>--corerun $(CoreRun)</CoreRunArgument>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(UseBaselineCoreRun)' == 'true'">
|
||||
<BaselineCoreRunArgument>--corerun $(BaselineCoreRun)</BaselineCoreRunArgument>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(WorkItemCommand)' != ''">
|
||||
<WorkItemCommand>$(Python) $(WorkItemCommand) --incremental no --architecture $(Architecture) -f $(_Framework) $(PerfLabArguments)</WorkItemCommand>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(_Framework)' != 'net461'">
|
||||
<WorkItemCommand>$(WorkItemCommand) $(CliArguments)</WorkItemCommand>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<HelixCorrelationPayload Include="$(CorrelationPayloadDirectory)">
|
||||
<PayloadDirectory>%(Identity)</PayloadDirectory>
|
||||
</HelixCorrelationPayload>
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<PartitionCount>5</PartitionCount>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Partition Include="$(BuildConfig).Partition0" Index="0" />
|
||||
<Partition Include="$(BuildConfig).Partition1" Index="1" />
|
||||
<Partition Include="$(BuildConfig).Partition2" Index="2" />
|
||||
<Partition Include="$(BuildConfig).Partition3" Index="3" />
|
||||
<Partition Include="$(BuildConfig).Partition4" Index="4" />
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Compare)' == 'true'">
|
||||
<FailOnTestFailure>false</FailOnTestFailure>
|
||||
</PropertyGroup>
|
||||
|
||||
<!--
|
||||
Partition the Microbenchmarks project, but nothing else
|
||||
-->
|
||||
<ItemGroup Condition="$(TargetCsproj.Contains('MicroBenchmarks.csproj'))">
|
||||
<HelixWorkItem Include="@(Partition)">
|
||||
<PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
|
||||
<PreCommands Condition="'$(Compare)' == 'true'">$(WorkItemCommand) --bdn-artifacts $(BaselineArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(BaselineCoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)"</PreCommands>
|
||||
<Command>$(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)"</Command>
|
||||
<PostCommands Condition="'$(Compare)' == 'true'">$(DotnetExe) run -f $(_Framework) -p $(ResultsComparer) --base $(BaselineArtifactsDirectory) --diff $(ArtifactsDirectory) --threshold 2$(Percent) --xml $(XMLResults);$(FinalCommand)</PostCommands>
|
||||
<Timeout>4:00</Timeout>
|
||||
</HelixWorkItem>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="!$(TargetCsproj.Contains('MicroBenchmarks.csproj'))">
|
||||
<HelixWorkItem Include="$(BuildConfig).WorkItem">
|
||||
<PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
|
||||
<PreCommands Condition="'$(Compare)' == 'true'">$(WorkItemCommand) --bdn-artifacts $(BaselineArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(BaselineCoreRunArgument)"</PreCommands>
|
||||
<Command>$(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument)"</Command>
|
||||
<PostCommands Condition="'$(Compare)' == 'true'">$(DotnetExe) run -f $(_Framework) -p $(ResultsComparer) --base $(BaselineArtifactsDirectory) --diff $(ArtifactsDirectory) --threshold 2$(Percent) --xml $(XMLResults)</PostCommands>
|
||||
<Timeout>4:00</Timeout>
|
||||
</HelixWorkItem>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,106 +0,0 @@
|
|||
Param(
|
||||
[string] $SourceDirectory=$env:BUILD_SOURCESDIRECTORY,
|
||||
[string] $CoreRootDirectory,
|
||||
[string] $BaselineCoreRootDirectory,
|
||||
[string] $Architecture="x64",
|
||||
[string] $Framework="netcoreapp5.0",
|
||||
[string] $CompilationMode="Tiered",
|
||||
[string] $Repository=$env:BUILD_REPOSITORY_NAME,
|
||||
[string] $Branch=$env:BUILD_SOURCEBRANCH,
|
||||
[string] $CommitSha=$env:BUILD_SOURCEVERSION,
|
||||
[string] $BuildNumber=$env:BUILD_BUILDNUMBER,
|
||||
[string] $RunCategories="coreclr corefx",
|
||||
[string] $Csproj="src\benchmarks\micro\MicroBenchmarks.csproj",
|
||||
[string] $Kind="micro",
|
||||
[switch] $Internal,
|
||||
[switch] $Compare,
|
||||
[string] $Configurations="CompilationMode=$CompilationMode"
|
||||
)
|
||||
|
||||
$RunFromPerformanceRepo = ($Repository -eq "dotnet/performance") -or ($Repository -eq "dotnet-performance")
|
||||
$UseCoreRun = ($CoreRootDirectory -ne [string]::Empty)
|
||||
$UseBaselineCoreRun = ($BaselineCoreRootDirectory -ne [string]::Empty)
|
||||
|
||||
$PayloadDirectory = (Join-Path $SourceDirectory "Payload")
|
||||
$PerformanceDirectory = (Join-Path $PayloadDirectory "performance")
|
||||
$WorkItemDirectory = (Join-Path $SourceDirectory "workitem")
|
||||
$ExtraBenchmarkDotNetArguments = "--iterationCount 1 --warmupCount 0 --invocationCount 1 --unrollFactor 1 --strategy ColdStart --stopOnFirstError true"
|
||||
$Creator = $env:BUILD_DEFINITIONNAME
|
||||
$PerfLabArguments = ""
|
||||
$HelixSourcePrefix = "pr"
|
||||
|
||||
$Queue = "Windows.10.Amd64.ClientRS4.DevEx.15.8.Open"
|
||||
|
||||
if ($Framework.StartsWith("netcoreapp")) {
|
||||
$Queue = "Windows.10.Amd64.ClientRS5.Open"
|
||||
}
|
||||
|
||||
if ($Compare) {
|
||||
$Queue = "Windows.10.Amd64.19H1.Tiger.Perf.Open"
|
||||
$PerfLabArguments = ""
|
||||
$ExtraBenchmarkDotNetArguments = ""
|
||||
}
|
||||
|
||||
if ($Internal) {
|
||||
$Queue = "Windows.10.Amd64.19H1.Tiger.Perf"
|
||||
$PerfLabArguments = "--upload-to-perflab-container"
|
||||
$ExtraBenchmarkDotNetArguments = ""
|
||||
$Creator = ""
|
||||
$HelixSourcePrefix = "official"
|
||||
}
|
||||
|
||||
$CommonSetupArguments="--frameworks $Framework --queue $Queue --build-number $BuildNumber --build-configs $Configurations"
|
||||
$SetupArguments = "--repository https://github.com/$Repository --branch $Branch --get-perf-hash --commit-sha $CommitSha $CommonSetupArguments"
|
||||
|
||||
if ($RunFromPerformanceRepo) {
|
||||
$SetupArguments = "--perf-hash $CommitSha $CommonSetupArguments"
|
||||
|
||||
robocopy $SourceDirectory $PerformanceDirectory /E /XD $PayloadDirectory $SourceDirectory\artifacts $SourceDirectory\.git
|
||||
}
|
||||
else {
|
||||
git clone --branch master --depth 1 --quiet https://github.com/dotnet/performance $PerformanceDirectory
|
||||
}
|
||||
|
||||
if ($UseCoreRun) {
|
||||
$NewCoreRoot = (Join-Path $PayloadDirectory "Core_Root")
|
||||
Move-Item -Path $CoreRootDirectory -Destination $NewCoreRoot
|
||||
}
|
||||
if ($UseBaselineCoreRun) {
|
||||
$NewBaselineCoreRoot = (Join-Path $PayloadDirectory "Baseline_Core_Root")
|
||||
Move-Item -Path $BaselineCoreRootDirectory -Destination $NewBaselineCoreRoot
|
||||
}
|
||||
|
||||
$DocsDir = (Join-Path $PerformanceDirectory "docs")
|
||||
robocopy $DocsDir $WorkItemDirectory
|
||||
|
||||
# Set variables that we will need to have in future steps
|
||||
$ci = $true
|
||||
|
||||
. "$PSScriptRoot\..\pipeline-logging-functions.ps1"
|
||||
|
||||
# Directories
|
||||
Write-PipelineSetVariable -Name 'PayloadDirectory' -Value "$PayloadDirectory" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'PerformanceDirectory' -Value "$PerformanceDirectory" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'WorkItemDirectory' -Value "$WorkItemDirectory" -IsMultiJobVariable $false
|
||||
|
||||
# Script Arguments
|
||||
Write-PipelineSetVariable -Name 'Python' -Value "py -3" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'ExtraBenchmarkDotNetArguments' -Value "$ExtraBenchmarkDotNetArguments" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'SetupArguments' -Value "$SetupArguments" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'PerfLabArguments' -Value "$PerfLabArguments" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'BDNCategories' -Value "$RunCategories" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'TargetCsproj' -Value "$Csproj" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'Kind' -Value "$Kind" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'Architecture' -Value "$Architecture" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'UseCoreRun' -Value "$UseCoreRun" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'UseBaselineCoreRun' -Value "$UseBaselineCoreRun" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'RunFromPerfRepo' -Value "$RunFromPerformanceRepo" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'Compare' -Value "$Compare" -IsMultiJobVariable $false
|
||||
|
||||
# Helix Arguments
|
||||
Write-PipelineSetVariable -Name 'Creator' -Value "$Creator" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'Queue' -Value "$Queue" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name 'HelixSourcePrefix' -Value "$HelixSourcePrefix" -IsMultiJobVariable $false
|
||||
Write-PipelineSetVariable -Name '_BuildConfig' -Value "$Architecture.$Kind.$Framework" -IsMultiJobVariable $false
|
||||
|
||||
exit 0
|
|
@ -1,216 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
source_directory=$BUILD_SOURCESDIRECTORY
|
||||
core_root_directory=
|
||||
baseline_core_root_directory=
|
||||
architecture=x64
|
||||
framework=netcoreapp5.0
|
||||
compilation_mode=tiered
|
||||
repository=$BUILD_REPOSITORY_NAME
|
||||
branch=$BUILD_SOURCEBRANCH
|
||||
commit_sha=$BUILD_SOURCEVERSION
|
||||
build_number=$BUILD_BUILDNUMBER
|
||||
internal=false
|
||||
compare=false
|
||||
kind="micro"
|
||||
run_categories="coreclr corefx"
|
||||
csproj="src\benchmarks\micro\MicroBenchmarks.csproj"
|
||||
configurations=
|
||||
run_from_perf_repo=false
|
||||
use_core_run=true
|
||||
use_baseline_core_run=true
|
||||
|
||||
while (($# > 0)); do
|
||||
lowerI="$(echo $1 | awk '{print tolower($0)}')"
|
||||
case $lowerI in
|
||||
--sourcedirectory)
|
||||
source_directory=$2
|
||||
shift 2
|
||||
;;
|
||||
--corerootdirectory)
|
||||
core_root_directory=$2
|
||||
shift 2
|
||||
;;
|
||||
--baselinecorerootdirectory)
|
||||
baseline_core_root_directory=$2
|
||||
shift 2
|
||||
;;
|
||||
--architecture)
|
||||
architecture=$2
|
||||
shift 2
|
||||
;;
|
||||
--framework)
|
||||
framework=$2
|
||||
shift 2
|
||||
;;
|
||||
--compilationmode)
|
||||
compilation_mode=$2
|
||||
shift 2
|
||||
;;
|
||||
--repository)
|
||||
repository=$2
|
||||
shift 2
|
||||
;;
|
||||
--branch)
|
||||
branch=$2
|
||||
shift 2
|
||||
;;
|
||||
--commitsha)
|
||||
commit_sha=$2
|
||||
shift 2
|
||||
;;
|
||||
--buildnumber)
|
||||
build_number=$2
|
||||
shift 2
|
||||
;;
|
||||
--kind)
|
||||
kind=$2
|
||||
shift 2
|
||||
;;
|
||||
--runcategories)
|
||||
run_categories=$2
|
||||
shift 2
|
||||
;;
|
||||
--csproj)
|
||||
csproj=$2
|
||||
shift 2
|
||||
;;
|
||||
--internal)
|
||||
internal=true
|
||||
shift 1
|
||||
;;
|
||||
--compare)
|
||||
compare=true
|
||||
shift 1
|
||||
;;
|
||||
--configurations)
|
||||
configurations=$2
|
||||
shift 2
|
||||
;;
|
||||
--help)
|
||||
echo "Common settings:"
|
||||
echo " --corerootdirectory <value> Directory where Core_Root exists, if running perf testing with --corerun"
|
||||
echo " --architecture <value> Architecture of the testing being run"
|
||||
echo " --configurations <value> List of key=value pairs that will be passed to perf testing infrastructure."
|
||||
echo " ex: --configurations \"CompilationMode=Tiered OptimzationLevel=PGO\""
|
||||
echo " --help Print help and exit"
|
||||
echo ""
|
||||
echo "Advanced settings:"
|
||||
echo " --framework <value> The framework to run, if not running in master"
|
||||
echo " --compliationmode <value> The compilation mode if not passing --configurations"
|
||||
echo " --sourcedirectory <value> The directory of the sources. Defaults to env:BUILD_SOURCESDIRECTORY"
|
||||
echo " --repository <value> The name of the repository in the <owner>/<repository name> format. Defaults to env:BUILD_REPOSITORY_NAME"
|
||||
echo " --branch <value> The name of the branch. Defaults to env:BUILD_SOURCEBRANCH"
|
||||
echo " --commitsha <value> The commit sha1 to run against. Defaults to env:BUILD_SOURCEVERSION"
|
||||
echo " --buildnumber <value> The build number currently running. Defaults to env:BUILD_BUILDNUMBER"
|
||||
echo " --csproj The relative path to the benchmark csproj whose tests should be run. Defaults to src\benchmarks\micro\MicroBenchmarks.csproj"
|
||||
echo " --kind <value> Related to csproj. The kind of benchmarks that should be run. Defaults to micro"
|
||||
echo " --runcategories <value> Related to csproj. Categories of benchmarks to run. Defaults to \"coreclr corefx\""
|
||||
echo " --internal If the benchmarks are running as an official job."
|
||||
echo ""
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "$repository" == "dotnet/performance" ] || [ "$repository" == "dotnet-performance" ]; then
|
||||
run_from_perf_repo=true
|
||||
fi
|
||||
|
||||
if [ -z "$configurations" ]; then
|
||||
configurations="CompliationMode=$compilation_mode"
|
||||
fi
|
||||
|
||||
if [ -z "$core_root_directory" ]; then
|
||||
use_core_run=false
|
||||
fi
|
||||
|
||||
if [ -z "$baseline_core_root_directory" ]; then
|
||||
use_baseline_core_run=false
|
||||
fi
|
||||
|
||||
payload_directory=$source_directory/Payload
|
||||
performance_directory=$payload_directory/performance
|
||||
workitem_directory=$source_directory/workitem
|
||||
extra_benchmark_dotnet_arguments="--iterationCount 1 --warmupCount 0 --invocationCount 1 --unrollFactor 1 --strategy ColdStart --stopOnFirstError true"
|
||||
perflab_arguments=
|
||||
queue=Ubuntu.1804.Amd64.Open
|
||||
creator=$BUILD_DEFINITIONNAME
|
||||
helix_source_prefix="pr"
|
||||
|
||||
if [[ "$compare" == true ]]; then
|
||||
extra_benchmark_dotnet_arguments=
|
||||
perflab_arguments=
|
||||
|
||||
# No open queues for arm64
|
||||
if [[ "$architecture" = "arm64" ]]; then
|
||||
echo "Compare not available for arm64"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
queue=Ubuntu.1804.Amd64.Tiger.Perf.Open
|
||||
fi
|
||||
|
||||
if [[ "$internal" == true ]]; then
|
||||
perflab_arguments="--upload-to-perflab-container"
|
||||
helix_source_prefix="official"
|
||||
creator=
|
||||
extra_benchmark_dotnet_arguments=
|
||||
|
||||
if [[ "$architecture" = "arm64" ]]; then
|
||||
queue=Ubuntu.1804.Arm64.Perf
|
||||
else
|
||||
queue=Ubuntu.1804.Amd64.Tiger.Perf
|
||||
fi
|
||||
fi
|
||||
|
||||
common_setup_arguments="--frameworks $framework --queue $queue --build-number $build_number --build-configs $configurations"
|
||||
setup_arguments="--repository https://github.com/$repository --branch $branch --get-perf-hash --commit-sha $commit_sha $common_setup_arguments"
|
||||
|
||||
if [[ "$run_from_perf_repo" = true ]]; then
|
||||
payload_directory=
|
||||
workitem_directory=$source_directory
|
||||
performance_directory=$workitem_directory
|
||||
setup_arguments="--perf-hash $commit_sha $common_setup_arguments"
|
||||
else
|
||||
git clone --branch master --depth 1 --quiet https://github.com/dotnet/performance $performance_directory
|
||||
|
||||
docs_directory=$performance_directory/docs
|
||||
mv $docs_directory $workitem_directory
|
||||
fi
|
||||
|
||||
if [[ "$use_core_run" = true ]]; then
|
||||
new_core_root=$payload_directory/Core_Root
|
||||
mv $core_root_directory $new_core_root
|
||||
fi
|
||||
|
||||
if [[ "$use_baseline_core_run" = true ]]; then
|
||||
new_baseline_core_root=$payload_directory/Baseline_Core_Root
|
||||
mv $baseline_core_root_directory $new_baseline_core_root
|
||||
fi
|
||||
|
||||
ci=true
|
||||
|
||||
_script_dir=$(pwd)/eng/common
|
||||
. "$_script_dir/pipeline-logging-functions.sh"
|
||||
|
||||
# Make sure all of our variables are available for future steps
|
||||
Write-PipelineSetVariable -name "UseCoreRun" -value "$use_core_run" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "UseBaselineCoreRun" -value "$use_baseline_core_run" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "Architecture" -value "$architecture" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "PayloadDirectory" -value "$payload_directory" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "PerformanceDirectory" -value "$performance_directory" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "WorkItemDirectory" -value "$workitem_directory" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "Queue" -value "$queue" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "SetupArguments" -value "$setup_arguments" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "Python" -value "$python3" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "PerfLabArguments" -value "$perflab_arguments" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "ExtraBenchmarkDotNetArguments" -value "$extra_benchmark_dotnet_arguments" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "BDNCategories" -value "$run_categories" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "TargetCsproj" -value "$csproj" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "RunFromPerfRepo" -value "$run_from_perf_repo" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "Creator" -value "$creator" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "HelixSourcePrefix" -value "$helix_source_prefix" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "Kind" -value "$kind" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "_BuildConfig" -value "$architecture.$kind.$framework" -is_multi_job_variable false
|
||||
Write-PipelineSetVariable -name "Compare" -value "$compare" -is_multi_job_variable false
|
|
@ -1,234 +1,260 @@
|
|||
# Source for this file was taken from https://github.com/microsoft/azure-pipelines-task-lib/blob/11c9439d4af17e6475d9fe058e6b2e03914d17e6/powershell/VstsTaskSdk/LoggingCommandFunctions.ps1 and modified.
|
||||
|
||||
# NOTE: You should not be calling these method directly as they are likely to change. Instead you should be calling the Write-Pipeline* functions defined in tools.ps1
|
||||
|
||||
$script:loggingCommandPrefix = '##vso['
|
||||
$script:loggingCommandEscapeMappings = @( # TODO: WHAT ABOUT "="? WHAT ABOUT "%"?
|
||||
New-Object psobject -Property @{ Token = ';' ; Replacement = '%3B' }
|
||||
New-Object psobject -Property @{ Token = "`r" ; Replacement = '%0D' }
|
||||
New-Object psobject -Property @{ Token = "`n" ; Replacement = '%0A' }
|
||||
New-Object psobject -Property @{ Token = "]" ; Replacement = '%5D' }
|
||||
)
|
||||
# TODO: BUG: Escape % ???
|
||||
# TODO: Add test to verify don't need to escape "=".
|
||||
|
||||
function Write-PipelineTelemetryError {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Category,
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Message,
|
||||
[Parameter(Mandatory = $false)]
|
||||
[string]$Type = 'error',
|
||||
[string]$ErrCode,
|
||||
[string]$SourcePath,
|
||||
[string]$LineNumber,
|
||||
[string]$ColumnNumber,
|
||||
[switch]$AsOutput)
|
||||
|
||||
$PSBoundParameters.Remove("Category") | Out-Null
|
||||
|
||||
$Message = "(NETCORE_ENGINEERING_TELEMETRY=$Category) $Message"
|
||||
$PSBoundParameters.Remove("Message") | Out-Null
|
||||
$PSBoundParameters.Add("Message", $Message)
|
||||
|
||||
Write-PipelineTaskError @PSBoundParameters
|
||||
}
|
||||
|
||||
function Write-PipelineTaskError {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Message,
|
||||
[Parameter(Mandatory = $false)]
|
||||
[string]$Type = 'error',
|
||||
[string]$ErrCode,
|
||||
[string]$SourcePath,
|
||||
[string]$LineNumber,
|
||||
[string]$ColumnNumber,
|
||||
[switch]$AsOutput)
|
||||
|
||||
if(!$ci) {
|
||||
if($Type -eq 'error') {
|
||||
Write-Host $Message -ForegroundColor Red
|
||||
return
|
||||
}
|
||||
elseif ($Type -eq 'warning') {
|
||||
Write-Host $Message -ForegroundColor Yellow
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if(($Type -ne 'error') -and ($Type -ne 'warning')) {
|
||||
Write-Host $Message
|
||||
return
|
||||
}
|
||||
if(-not $PSBoundParameters.ContainsKey('Type')) {
|
||||
$PSBoundParameters.Add('Type', 'error')
|
||||
}
|
||||
Write-LogIssue @PSBoundParameters
|
||||
}
|
||||
|
||||
function Write-PipelineSetVariable {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Name,
|
||||
[string]$Value,
|
||||
[switch]$Secret,
|
||||
[switch]$AsOutput,
|
||||
[bool]$IsMultiJobVariable=$true)
|
||||
|
||||
if($ci) {
|
||||
Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data $Value -Properties @{
|
||||
'variable' = $Name
|
||||
'isSecret' = $Secret
|
||||
'isOutput' = $IsMultiJobVariable
|
||||
} -AsOutput:$AsOutput
|
||||
}
|
||||
}
|
||||
|
||||
function Write-PipelinePrependPath {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
[string]$Path,
|
||||
[switch]$AsOutput)
|
||||
if($ci) {
|
||||
Write-LoggingCommand -Area 'task' -Event 'prependpath' -Data $Path -AsOutput:$AsOutput
|
||||
}
|
||||
}
|
||||
|
||||
<########################################
|
||||
# Private functions.
|
||||
########################################>
|
||||
function Format-LoggingCommandData {
|
||||
[CmdletBinding()]
|
||||
param([string]$Value, [switch]$Reverse)
|
||||
|
||||
if (!$Value) {
|
||||
return ''
|
||||
}
|
||||
|
||||
if (!$Reverse) {
|
||||
foreach ($mapping in $script:loggingCommandEscapeMappings) {
|
||||
$Value = $Value.Replace($mapping.Token, $mapping.Replacement)
|
||||
}
|
||||
} else {
|
||||
for ($i = $script:loggingCommandEscapeMappings.Length - 1 ; $i -ge 0 ; $i--) {
|
||||
$mapping = $script:loggingCommandEscapeMappings[$i]
|
||||
$Value = $Value.Replace($mapping.Replacement, $mapping.Token)
|
||||
}
|
||||
}
|
||||
|
||||
return $Value
|
||||
}
|
||||
|
||||
function Format-LoggingCommand {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Area,
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Event,
|
||||
[string]$Data,
|
||||
[hashtable]$Properties)
|
||||
|
||||
# Append the preamble.
|
||||
[System.Text.StringBuilder]$sb = New-Object -TypeName System.Text.StringBuilder
|
||||
$null = $sb.Append($script:loggingCommandPrefix).Append($Area).Append('.').Append($Event)
|
||||
|
||||
# Append the properties.
|
||||
if ($Properties) {
|
||||
$first = $true
|
||||
foreach ($key in $Properties.Keys) {
|
||||
[string]$value = Format-LoggingCommandData $Properties[$key]
|
||||
if ($value) {
|
||||
if ($first) {
|
||||
$null = $sb.Append(' ')
|
||||
$first = $false
|
||||
} else {
|
||||
$null = $sb.Append(';')
|
||||
}
|
||||
|
||||
$null = $sb.Append("$key=$value")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Append the tail and output the value.
|
||||
$Data = Format-LoggingCommandData $Data
|
||||
$sb.Append(']').Append($Data).ToString()
|
||||
}
|
||||
|
||||
function Write-LoggingCommand {
|
||||
[CmdletBinding(DefaultParameterSetName = 'Parameters')]
|
||||
param(
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'Parameters')]
|
||||
[string]$Area,
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'Parameters')]
|
||||
[string]$Event,
|
||||
[Parameter(ParameterSetName = 'Parameters')]
|
||||
[string]$Data,
|
||||
[Parameter(ParameterSetName = 'Parameters')]
|
||||
[hashtable]$Properties,
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'Object')]
|
||||
$Command,
|
||||
[switch]$AsOutput)
|
||||
|
||||
if ($PSCmdlet.ParameterSetName -eq 'Object') {
|
||||
Write-LoggingCommand -Area $Command.Area -Event $Command.Event -Data $Command.Data -Properties $Command.Properties -AsOutput:$AsOutput
|
||||
return
|
||||
}
|
||||
|
||||
$command = Format-LoggingCommand -Area $Area -Event $Event -Data $Data -Properties $Properties
|
||||
if ($AsOutput) {
|
||||
$command
|
||||
} else {
|
||||
Write-Host $command
|
||||
}
|
||||
}
|
||||
|
||||
function Write-LogIssue {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[ValidateSet('warning', 'error')]
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Type,
|
||||
[string]$Message,
|
||||
[string]$ErrCode,
|
||||
[string]$SourcePath,
|
||||
[string]$LineNumber,
|
||||
[string]$ColumnNumber,
|
||||
[switch]$AsOutput)
|
||||
|
||||
$command = Format-LoggingCommand -Area 'task' -Event 'logissue' -Data $Message -Properties @{
|
||||
'type' = $Type
|
||||
'code' = $ErrCode
|
||||
'sourcepath' = $SourcePath
|
||||
'linenumber' = $LineNumber
|
||||
'columnnumber' = $ColumnNumber
|
||||
}
|
||||
if ($AsOutput) {
|
||||
return $command
|
||||
}
|
||||
|
||||
if ($Type -eq 'error') {
|
||||
$foregroundColor = $host.PrivateData.ErrorForegroundColor
|
||||
$backgroundColor = $host.PrivateData.ErrorBackgroundColor
|
||||
if ($foregroundColor -isnot [System.ConsoleColor] -or $backgroundColor -isnot [System.ConsoleColor]) {
|
||||
$foregroundColor = [System.ConsoleColor]::Red
|
||||
$backgroundColor = [System.ConsoleColor]::Black
|
||||
}
|
||||
} else {
|
||||
$foregroundColor = $host.PrivateData.WarningForegroundColor
|
||||
$backgroundColor = $host.PrivateData.WarningBackgroundColor
|
||||
if ($foregroundColor -isnot [System.ConsoleColor] -or $backgroundColor -isnot [System.ConsoleColor]) {
|
||||
$foregroundColor = [System.ConsoleColor]::Yellow
|
||||
$backgroundColor = [System.ConsoleColor]::Black
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host $command -ForegroundColor $foregroundColor -BackgroundColor $backgroundColor
|
||||
}
|
||||
# Source for this file was taken from https://github.com/microsoft/azure-pipelines-task-lib/blob/11c9439d4af17e6475d9fe058e6b2e03914d17e6/powershell/VstsTaskSdk/LoggingCommandFunctions.ps1 and modified.
|
||||
|
||||
# NOTE: You should not be calling these method directly as they are likely to change. Instead you should be calling the Write-Pipeline* functions defined in tools.ps1
|
||||
|
||||
$script:loggingCommandPrefix = '##vso['
|
||||
$script:loggingCommandEscapeMappings = @( # TODO: WHAT ABOUT "="? WHAT ABOUT "%"?
|
||||
New-Object psobject -Property @{ Token = ';' ; Replacement = '%3B' }
|
||||
New-Object psobject -Property @{ Token = "`r" ; Replacement = '%0D' }
|
||||
New-Object psobject -Property @{ Token = "`n" ; Replacement = '%0A' }
|
||||
New-Object psobject -Property @{ Token = "]" ; Replacement = '%5D' }
|
||||
)
|
||||
# TODO: BUG: Escape % ???
|
||||
# TODO: Add test to verify don't need to escape "=".
|
||||
|
||||
# Specify "-Force" to force pipeline formatted output even if "$ci" is false or not set
|
||||
function Write-PipelineTelemetryError {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Category,
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Message,
|
||||
[Parameter(Mandatory = $false)]
|
||||
[string]$Type = 'error',
|
||||
[string]$ErrCode,
|
||||
[string]$SourcePath,
|
||||
[string]$LineNumber,
|
||||
[string]$ColumnNumber,
|
||||
[switch]$AsOutput,
|
||||
[switch]$Force)
|
||||
|
||||
$PSBoundParameters.Remove('Category') | Out-Null
|
||||
|
||||
if ($Force -Or ((Test-Path variable:ci) -And $ci)) {
|
||||
$Message = "(NETCORE_ENGINEERING_TELEMETRY=$Category) $Message"
|
||||
}
|
||||
$PSBoundParameters.Remove('Message') | Out-Null
|
||||
$PSBoundParameters.Add('Message', $Message)
|
||||
Write-PipelineTaskError @PSBoundParameters
|
||||
}
|
||||
|
||||
# Specify "-Force" to force pipeline formatted output even if "$ci" is false or not set
|
||||
function Write-PipelineTaskError {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Message,
|
||||
[Parameter(Mandatory = $false)]
|
||||
[string]$Type = 'error',
|
||||
[string]$ErrCode,
|
||||
[string]$SourcePath,
|
||||
[string]$LineNumber,
|
||||
[string]$ColumnNumber,
|
||||
[switch]$AsOutput,
|
||||
[switch]$Force
|
||||
)
|
||||
|
||||
if (!$Force -And (-Not (Test-Path variable:ci) -Or !$ci)) {
|
||||
if ($Type -eq 'error') {
|
||||
Write-Host $Message -ForegroundColor Red
|
||||
return
|
||||
}
|
||||
elseif ($Type -eq 'warning') {
|
||||
Write-Host $Message -ForegroundColor Yellow
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if (($Type -ne 'error') -and ($Type -ne 'warning')) {
|
||||
Write-Host $Message
|
||||
return
|
||||
}
|
||||
$PSBoundParameters.Remove('Force') | Out-Null
|
||||
if (-not $PSBoundParameters.ContainsKey('Type')) {
|
||||
$PSBoundParameters.Add('Type', 'error')
|
||||
}
|
||||
Write-LogIssue @PSBoundParameters
|
||||
}
|
||||
|
||||
function Write-PipelineSetVariable {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Name,
|
||||
[string]$Value,
|
||||
[switch]$Secret,
|
||||
[switch]$AsOutput,
|
||||
[bool]$IsMultiJobVariable = $true)
|
||||
|
||||
if ((Test-Path variable:ci) -And $ci) {
|
||||
Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data $Value -Properties @{
|
||||
'variable' = $Name
|
||||
'isSecret' = $Secret
|
||||
'isOutput' = $IsMultiJobVariable
|
||||
} -AsOutput:$AsOutput
|
||||
}
|
||||
}
|
||||
|
||||
function Write-PipelinePrependPath {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Path,
|
||||
[switch]$AsOutput)
|
||||
|
||||
if ((Test-Path variable:ci) -And $ci) {
|
||||
Write-LoggingCommand -Area 'task' -Event 'prependpath' -Data $Path -AsOutput:$AsOutput
|
||||
}
|
||||
}
|
||||
|
||||
function Write-PipelineSetResult {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[ValidateSet("Succeeded", "SucceededWithIssues", "Failed", "Cancelled", "Skipped")]
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Result,
|
||||
[string]$Message)
|
||||
if ((Test-Path variable:ci) -And $ci) {
|
||||
Write-LoggingCommand -Area 'task' -Event 'complete' -Data $Message -Properties @{
|
||||
'result' = $Result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<########################################
|
||||
# Private functions.
|
||||
########################################>
|
||||
function Format-LoggingCommandData {
|
||||
[CmdletBinding()]
|
||||
param([string]$Value, [switch]$Reverse)
|
||||
|
||||
if (!$Value) {
|
||||
return ''
|
||||
}
|
||||
|
||||
if (!$Reverse) {
|
||||
foreach ($mapping in $script:loggingCommandEscapeMappings) {
|
||||
$Value = $Value.Replace($mapping.Token, $mapping.Replacement)
|
||||
}
|
||||
}
|
||||
else {
|
||||
for ($i = $script:loggingCommandEscapeMappings.Length - 1 ; $i -ge 0 ; $i--) {
|
||||
$mapping = $script:loggingCommandEscapeMappings[$i]
|
||||
$Value = $Value.Replace($mapping.Replacement, $mapping.Token)
|
||||
}
|
||||
}
|
||||
|
||||
return $Value
|
||||
}
|
||||
|
||||
function Format-LoggingCommand {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Area,
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Event,
|
||||
[string]$Data,
|
||||
[hashtable]$Properties)
|
||||
|
||||
# Append the preamble.
|
||||
[System.Text.StringBuilder]$sb = New-Object -TypeName System.Text.StringBuilder
|
||||
$null = $sb.Append($script:loggingCommandPrefix).Append($Area).Append('.').Append($Event)
|
||||
|
||||
# Append the properties.
|
||||
if ($Properties) {
|
||||
$first = $true
|
||||
foreach ($key in $Properties.Keys) {
|
||||
[string]$value = Format-LoggingCommandData $Properties[$key]
|
||||
if ($value) {
|
||||
if ($first) {
|
||||
$null = $sb.Append(' ')
|
||||
$first = $false
|
||||
}
|
||||
else {
|
||||
$null = $sb.Append(';')
|
||||
}
|
||||
|
||||
$null = $sb.Append("$key=$value")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Append the tail and output the value.
|
||||
$Data = Format-LoggingCommandData $Data
|
||||
$sb.Append(']').Append($Data).ToString()
|
||||
}
|
||||
|
||||
function Write-LoggingCommand {
|
||||
[CmdletBinding(DefaultParameterSetName = 'Parameters')]
|
||||
param(
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'Parameters')]
|
||||
[string]$Area,
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'Parameters')]
|
||||
[string]$Event,
|
||||
[Parameter(ParameterSetName = 'Parameters')]
|
||||
[string]$Data,
|
||||
[Parameter(ParameterSetName = 'Parameters')]
|
||||
[hashtable]$Properties,
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'Object')]
|
||||
$Command,
|
||||
[switch]$AsOutput)
|
||||
|
||||
if ($PSCmdlet.ParameterSetName -eq 'Object') {
|
||||
Write-LoggingCommand -Area $Command.Area -Event $Command.Event -Data $Command.Data -Properties $Command.Properties -AsOutput:$AsOutput
|
||||
return
|
||||
}
|
||||
|
||||
$command = Format-LoggingCommand -Area $Area -Event $Event -Data $Data -Properties $Properties
|
||||
if ($AsOutput) {
|
||||
$command
|
||||
}
|
||||
else {
|
||||
Write-Host $command
|
||||
}
|
||||
}
|
||||
|
||||
function Write-LogIssue {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[ValidateSet('warning', 'error')]
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Type,
|
||||
[string]$Message,
|
||||
[string]$ErrCode,
|
||||
[string]$SourcePath,
|
||||
[string]$LineNumber,
|
||||
[string]$ColumnNumber,
|
||||
[switch]$AsOutput)
|
||||
|
||||
$command = Format-LoggingCommand -Area 'task' -Event 'logissue' -Data $Message -Properties @{
|
||||
'type' = $Type
|
||||
'code' = $ErrCode
|
||||
'sourcepath' = $SourcePath
|
||||
'linenumber' = $LineNumber
|
||||
'columnnumber' = $ColumnNumber
|
||||
}
|
||||
if ($AsOutput) {
|
||||
return $command
|
||||
}
|
||||
|
||||
if ($Type -eq 'error') {
|
||||
$foregroundColor = $host.PrivateData.ErrorForegroundColor
|
||||
$backgroundColor = $host.PrivateData.ErrorBackgroundColor
|
||||
if ($foregroundColor -isnot [System.ConsoleColor] -or $backgroundColor -isnot [System.ConsoleColor]) {
|
||||
$foregroundColor = [System.ConsoleColor]::Red
|
||||
$backgroundColor = [System.ConsoleColor]::Black
|
||||
}
|
||||
}
|
||||
else {
|
||||
$foregroundColor = $host.PrivateData.WarningForegroundColor
|
||||
$backgroundColor = $host.PrivateData.WarningBackgroundColor
|
||||
if ($foregroundColor -isnot [System.ConsoleColor] -or $backgroundColor -isnot [System.ConsoleColor]) {
|
||||
$foregroundColor = [System.ConsoleColor]::Yellow
|
||||
$backgroundColor = [System.ConsoleColor]::Black
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host $command -ForegroundColor $foregroundColor -BackgroundColor $backgroundColor
|
||||
}
|
||||
|
|
|
@ -2,15 +2,19 @@
|
|||
|
||||
function Write-PipelineTelemetryError {
|
||||
local telemetry_category=''
|
||||
local force=false
|
||||
local function_args=()
|
||||
local message=''
|
||||
while [[ $# -gt 0 ]]; do
|
||||
opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')"
|
||||
opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")"
|
||||
case "$opt" in
|
||||
-category|-c)
|
||||
telemetry_category=$2
|
||||
shift
|
||||
;;
|
||||
-force|-f)
|
||||
force=true
|
||||
;;
|
||||
-*)
|
||||
function_args+=("$1 $2")
|
||||
shift
|
||||
|
@ -22,31 +26,29 @@ function Write-PipelineTelemetryError {
|
|||
shift
|
||||
done
|
||||
|
||||
if [[ "$ci" != true ]]; then
|
||||
if [[ $force != true ]] && [[ "$ci" != true ]]; then
|
||||
echo "$message" >&2
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ $force == true ]]; then
|
||||
function_args+=("-force")
|
||||
fi
|
||||
message="(NETCORE_ENGINEERING_TELEMETRY=$telemetry_category) $message"
|
||||
function_args+=("$message")
|
||||
|
||||
Write-PipelineTaskError $function_args
|
||||
Write-PipelineTaskError ${function_args[@]}
|
||||
}
|
||||
|
||||
function Write-PipelineTaskError {
|
||||
if [[ "$ci" != true ]]; then
|
||||
echo "$@" >&2
|
||||
return
|
||||
fi
|
||||
|
||||
local message_type="error"
|
||||
local sourcepath=''
|
||||
local linenumber=''
|
||||
local columnnumber=''
|
||||
local error_code=''
|
||||
local force=false
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')"
|
||||
opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")"
|
||||
case "$opt" in
|
||||
-type|-t)
|
||||
message_type=$2
|
||||
|
@ -68,6 +70,9 @@ function Write-PipelineTaskError {
|
|||
error_code=$2
|
||||
shift
|
||||
;;
|
||||
-force|-f)
|
||||
force=true
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
|
@ -76,6 +81,11 @@ function Write-PipelineTaskError {
|
|||
shift
|
||||
done
|
||||
|
||||
if [[ $force != true ]] && [[ "$ci" != true ]]; then
|
||||
echo "$@" >&2
|
||||
return
|
||||
fi
|
||||
|
||||
local message="##vso[task.logissue"
|
||||
|
||||
message="$message type=$message_type"
|
||||
|
@ -112,7 +122,7 @@ function Write-PipelineSetVariable {
|
|||
local is_multi_job_variable=true
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')"
|
||||
opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")"
|
||||
case "$opt" in
|
||||
-name|-n)
|
||||
name=$2
|
||||
|
@ -154,7 +164,7 @@ function Write-PipelinePrependPath {
|
|||
local prepend_path=''
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')"
|
||||
opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")"
|
||||
case "$opt" in
|
||||
-path|-p)
|
||||
prepend_path=$2
|
||||
|
@ -169,4 +179,28 @@ function Write-PipelinePrependPath {
|
|||
if [[ "$ci" == true ]]; then
|
||||
echo "##vso[task.prependpath]$prepend_path"
|
||||
fi
|
||||
}
|
||||
}
|
||||
|
||||
function Write-PipelineSetResult {
|
||||
local result=''
|
||||
local message=''
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")"
|
||||
case "$opt" in
|
||||
-result|-r)
|
||||
result=$2
|
||||
shift
|
||||
;;
|
||||
-message|-m)
|
||||
message=$2
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [[ "$ci" == true ]]; then
|
||||
echo "##vso[task.complete result=$result;]$message"
|
||||
fi
|
||||
}
|
||||
|
|
|
@ -1,48 +1,48 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][int] $BuildId,
|
||||
[Parameter(Mandatory=$true)][int] $ChannelId,
|
||||
[Parameter(Mandatory=$true)][string] $MaestroApiAccessToken,
|
||||
[Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = "https://maestro-prod.westus2.cloudapp.azure.com",
|
||||
[Parameter(Mandatory=$false)][string] $MaestroApiVersion = "2019-01-16"
|
||||
)
|
||||
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
try {
|
||||
# Check that the channel we are going to promote the build to exist
|
||||
$channelInfo = Get-MaestroChannel -ChannelId $ChannelId
|
||||
|
||||
if (!$channelInfo) {
|
||||
Write-Host "Channel with BAR ID $ChannelId was not found in BAR!"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
# Get info about which channels the build has already been promoted to
|
||||
$buildInfo = Get-MaestroBuild -BuildId $BuildId
|
||||
|
||||
if (!$buildInfo) {
|
||||
Write-Host "Build with BAR ID $BuildId was not found in BAR!"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
# Find whether the build is already assigned to the channel or not
|
||||
if ($buildInfo.channels) {
|
||||
foreach ($channel in $buildInfo.channels) {
|
||||
if ($channel.Id -eq $ChannelId) {
|
||||
Write-Host "The build with BAR ID $BuildId is already on channel $ChannelId!"
|
||||
ExitWithExitCode 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "Promoting build '$BuildId' to channel '$ChannelId'."
|
||||
|
||||
Assign-BuildToChannel -BuildId $BuildId -ChannelId $ChannelId
|
||||
|
||||
Write-Host "done."
|
||||
}
|
||||
catch {
|
||||
Write-Host "There was an error while trying to promote build '$BuildId' to channel '$ChannelId'"
|
||||
Write-Host $_
|
||||
Write-Host $_.ScriptStackTrace
|
||||
}
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][int] $BuildId,
|
||||
[Parameter(Mandatory=$true)][int] $ChannelId,
|
||||
[Parameter(Mandatory=$true)][string] $MaestroApiAccessToken,
|
||||
[Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro-prod.westus2.cloudapp.azure.com',
|
||||
[Parameter(Mandatory=$false)][string] $MaestroApiVersion = '2019-01-16'
|
||||
)
|
||||
|
||||
try {
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
# Check that the channel we are going to promote the build to exist
|
||||
$channelInfo = Get-MaestroChannel -ChannelId $ChannelId
|
||||
|
||||
if (!$channelInfo) {
|
||||
Write-PipelineTelemetryCategory -Category 'PromoteBuild' -Message "Channel with BAR ID $ChannelId was not found in BAR!"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
# Get info about which channel(s) the build has already been promoted to
|
||||
$buildInfo = Get-MaestroBuild -BuildId $BuildId
|
||||
|
||||
if (!$buildInfo) {
|
||||
Write-PipelineTelemetryError -Category 'PromoteBuild' -Message "Build with BAR ID $BuildId was not found in BAR!"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
# Find whether the build is already assigned to the channel or not
|
||||
if ($buildInfo.channels) {
|
||||
foreach ($channel in $buildInfo.channels) {
|
||||
if ($channel.Id -eq $ChannelId) {
|
||||
Write-Host "The build with BAR ID $BuildId is already on channel $ChannelId!"
|
||||
ExitWithExitCode 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "Promoting build '$BuildId' to channel '$ChannelId'."
|
||||
|
||||
Assign-BuildToChannel -BuildId $BuildId -ChannelId $ChannelId
|
||||
|
||||
Write-Host 'done.'
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-PipelineTelemetryError -Category 'PromoteBuild' -Message "There was an error while trying to promote build '$BuildId' to channel '$ChannelId'"
|
||||
ExitWithExitCode 1
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $PromoteToChannels, # List of channels that the build should be promoted to
|
||||
[Parameter(Mandatory=$true)][array] $AvailableChannelIds # List of channel IDs available in the YAML implementation
|
||||
)
|
||||
|
||||
try {
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
if ($PromoteToChannels -eq "") {
|
||||
Write-PipelineTaskError -Type 'warning' -Message "This build won't publish assets as it's not configured to any Maestro channel. If that wasn't intended use Darc to configure a default channel using add-default-channel for this branch or to promote it to a channel using add-build-to-channel. See https://github.com/dotnet/arcade/blob/master/Documentation/Darc.md#assigning-an-individual-build-to-a-channel for more info."
|
||||
ExitWithExitCode 0
|
||||
}
|
||||
|
||||
# Check that every channel that Maestro told to promote the build to
|
||||
# is available in YAML
|
||||
$PromoteToChannelsIds = $PromoteToChannels -split "\D" | Where-Object { $_ }
|
||||
|
||||
$hasErrors = $false
|
||||
|
||||
foreach ($id in $PromoteToChannelsIds) {
|
||||
if (($id -ne 0) -and ($id -notin $AvailableChannelIds)) {
|
||||
Write-PipelineTaskError -Message "Channel $id is not present in the post-build YAML configuration! This is an error scenario. Please contact @dnceng."
|
||||
$hasErrors = $true
|
||||
}
|
||||
}
|
||||
|
||||
# The `Write-PipelineTaskError` doesn't error the script and we might report several errors
|
||||
# in the previous lines. The check below makes sure that we return an error state from the
|
||||
# script if we reported any validation error
|
||||
if ($hasErrors) {
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
Write-Host 'done.'
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-PipelineTelemetryError -Category 'CheckChannelConsistency' -Message "There was an error while trying to check consistency of Maestro default channels for the build and post-build YAML configuration."
|
||||
ExitWithExitCode 1
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][int] $BarBuildId, # ID of the build which assets should be downloaded
|
||||
[Parameter(Mandatory=$true)][string] $DropLocation, # Where the assets should be downloaded to
|
||||
[Parameter(Mandatory=$true)][string] $MaestroApiAccessToken, # Token used to access Maestro API
|
||||
[Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = "https://maestro-prod.westus2.cloudapp.azure.com", # Maestro API URL
|
||||
[Parameter(Mandatory=$false)][string] $MaestroApiVersion = "2019-01-16" # Version of Maestro API to use
|
||||
)
|
||||
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
try {
|
||||
Write-Host "Installing DARC ..."
|
||||
|
||||
. $PSScriptRoot\..\darc-init.ps1
|
||||
$exitCode = $LASTEXITCODE
|
||||
|
||||
if ($exitCode -ne 0) {
|
||||
Write-PipelineTaskError "Something failed while running 'darc-init.ps1'. Check for errors above. Exiting now..."
|
||||
ExitWithExitCode $exitCode
|
||||
}
|
||||
|
||||
# For now, only use a dry run.
|
||||
# Ideally we would change darc to enable a quick request that
|
||||
# would check whether the file exists that you can download it,
|
||||
# and that it won't conflict with other files.
|
||||
# https://github.com/dotnet/arcade/issues/3674
|
||||
# Right now we can't remove continue-on-error because we ocassionally will have
|
||||
# dependencies that have no associated builds (e.g. an old dependency).
|
||||
# We need to add an option to baseline specific dependencies away, or add them manually
|
||||
# to the BAR.
|
||||
darc gather-drop --non-shipping `
|
||||
--dry-run `
|
||||
--continue-on-error `
|
||||
--id $BarBuildId `
|
||||
--output-dir $DropLocation `
|
||||
--bar-uri $MaestroApiEndpoint `
|
||||
--password $MaestroApiAccessToken `
|
||||
--latest-location
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
}
|
|
@ -1,25 +1,24 @@
|
|||
# This script validates NuGet package metadata information using this
|
||||
# tool: https://github.com/NuGet/NuGetGallery/tree/jver-verify/src/VerifyMicrosoftPackage
|
||||
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][string] $PackagesPath, # Path to where the packages to be validated are
|
||||
[Parameter(Mandatory=$true)][string] $ToolDestinationPath # Where the validation tool should be downloaded to
|
||||
)
|
||||
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
try {
|
||||
$url = "https://raw.githubusercontent.com/NuGet/NuGetGallery/jver-verify/src/VerifyMicrosoftPackage/verify.ps1"
|
||||
|
||||
New-Item -ItemType "directory" -Path ${ToolDestinationPath} -Force
|
||||
|
||||
Invoke-WebRequest $url -OutFile ${ToolDestinationPath}\verify.ps1
|
||||
|
||||
& ${ToolDestinationPath}\verify.ps1 ${PackagesPath}\*.nupkg
|
||||
}
|
||||
catch {
|
||||
Write-PipelineTaskError "NuGet package validation failed. Please check error logs."
|
||||
Write-Host $_
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
# This script validates NuGet package metadata information using this
|
||||
# tool: https://github.com/NuGet/NuGetGallery/tree/jver-verify/src/VerifyMicrosoftPackage
|
||||
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][string] $PackagesPath, # Path to where the packages to be validated are
|
||||
[Parameter(Mandatory=$true)][string] $ToolDestinationPath # Where the validation tool should be downloaded to
|
||||
)
|
||||
|
||||
try {
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
$url = 'https://raw.githubusercontent.com/NuGet/NuGetGallery/3e25ad135146676bcab0050a516939d9958bfa5d/src/VerifyMicrosoftPackage/verify.ps1'
|
||||
|
||||
New-Item -ItemType 'directory' -Path ${ToolDestinationPath} -Force
|
||||
|
||||
Invoke-WebRequest $url -OutFile ${ToolDestinationPath}\verify.ps1
|
||||
|
||||
& ${ToolDestinationPath}\verify.ps1 ${PackagesPath}\*.nupkg
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'NuGetValidation' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
|
|
@ -1,90 +1,91 @@
|
|||
# Most of the functions in this file require the variables `MaestroApiEndPoint`,
|
||||
# `MaestroApiVersion` and `MaestroApiAccessToken` to be globally available.
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
# `tools.ps1` checks $ci to perform some actions. Since the post-build
|
||||
# scripts don't necessarily execute in the same agent that run the
|
||||
# build.ps1/sh script this variable isn't automatically set.
|
||||
$ci = $true
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
function Create-MaestroApiRequestHeaders([string]$ContentType = "application/json") {
|
||||
Validate-MaestroVars
|
||||
|
||||
$headers = New-Object 'System.Collections.Generic.Dictionary[[String],[String]]'
|
||||
$headers.Add('Accept', $ContentType)
|
||||
$headers.Add('Authorization',"Bearer $MaestroApiAccessToken")
|
||||
return $headers
|
||||
}
|
||||
|
||||
function Get-MaestroChannel([int]$ChannelId) {
|
||||
Validate-MaestroVars
|
||||
|
||||
$apiHeaders = Create-MaestroApiRequestHeaders
|
||||
$apiEndpoint = "$MaestroApiEndPoint/api/channels/${ChannelId}?api-version=$MaestroApiVersion"
|
||||
|
||||
$result = try { Invoke-WebRequest -Method Get -Uri $apiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" }
|
||||
return $result
|
||||
}
|
||||
|
||||
function Get-MaestroBuild([int]$BuildId) {
|
||||
Validate-MaestroVars
|
||||
|
||||
$apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken
|
||||
$apiEndpoint = "$MaestroApiEndPoint/api/builds/${BuildId}?api-version=$MaestroApiVersion"
|
||||
|
||||
$result = try { return Invoke-WebRequest -Method Get -Uri $apiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" }
|
||||
return $result
|
||||
}
|
||||
|
||||
function Get-MaestroSubscriptions([string]$SourceRepository, [int]$ChannelId) {
|
||||
Validate-MaestroVars
|
||||
|
||||
$SourceRepository = [System.Web.HttpUtility]::UrlEncode($SourceRepository)
|
||||
$apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken
|
||||
$apiEndpoint = "$MaestroApiEndPoint/api/subscriptions?sourceRepository=$SourceRepository&channelId=$ChannelId&api-version=$MaestroApiVersion"
|
||||
|
||||
$result = try { Invoke-WebRequest -Method Get -Uri $apiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" }
|
||||
return $result
|
||||
}
|
||||
|
||||
function Trigger-Subscription([string]$SubscriptionId) {
|
||||
Validate-MaestroVars
|
||||
|
||||
$apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken
|
||||
$apiEndpoint = "$MaestroApiEndPoint/api/subscriptions/$SubscriptionId/trigger?api-version=$MaestroApiVersion"
|
||||
Invoke-WebRequest -Uri $apiEndpoint -Headers $apiHeaders -Method Post | Out-Null
|
||||
}
|
||||
|
||||
function Assign-BuildToChannel([int]$BuildId, [int]$ChannelId) {
|
||||
Validate-MaestroVars
|
||||
|
||||
$apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken
|
||||
$apiEndpoint = "$MaestroApiEndPoint/api/channels/${ChannelId}/builds/${BuildId}?api-version=$MaestroApiVersion"
|
||||
Invoke-WebRequest -Method Post -Uri $apiEndpoint -Headers $apiHeaders | Out-Null
|
||||
}
|
||||
|
||||
function Validate-MaestroVars {
|
||||
try {
|
||||
Get-Variable MaestroApiEndPoint -Scope Global | Out-Null
|
||||
Get-Variable MaestroApiVersion -Scope Global | Out-Null
|
||||
Get-Variable MaestroApiAccessToken -Scope Global | Out-Null
|
||||
|
||||
if (!($MaestroApiEndPoint -Match "^http[s]?://maestro-(int|prod).westus2.cloudapp.azure.com$")) {
|
||||
Write-PipelineTaskError "MaestroApiEndPoint is not a valid Maestro URL. '$MaestroApiEndPoint'"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
if (!($MaestroApiVersion -Match "^[0-9]{4}-[0-9]{2}-[0-9]{2}$")) {
|
||||
Write-PipelineTaskError "MaestroApiVersion does not match a version string in the format yyyy-MM-DD. '$MaestroApiVersion'"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-PipelineTaskError "Error: Variables `MaestroApiEndPoint`, `MaestroApiVersion` and `MaestroApiAccessToken` are required while using this script."
|
||||
Write-Host $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
# Most of the functions in this file require the variables `MaestroApiEndPoint`,
|
||||
# `MaestroApiVersion` and `MaestroApiAccessToken` to be globally available.
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
# `tools.ps1` checks $ci to perform some actions. Since the post-build
|
||||
# scripts don't necessarily execute in the same agent that run the
|
||||
# build.ps1/sh script this variable isn't automatically set.
|
||||
$ci = $true
|
||||
$disableConfigureToolsetImport = $true
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
function Create-MaestroApiRequestHeaders([string]$ContentType = 'application/json') {
|
||||
Validate-MaestroVars
|
||||
|
||||
$headers = New-Object 'System.Collections.Generic.Dictionary[[String],[String]]'
|
||||
$headers.Add('Accept', $ContentType)
|
||||
$headers.Add('Authorization',"Bearer $MaestroApiAccessToken")
|
||||
return $headers
|
||||
}
|
||||
|
||||
function Get-MaestroChannel([int]$ChannelId) {
|
||||
Validate-MaestroVars
|
||||
|
||||
$apiHeaders = Create-MaestroApiRequestHeaders
|
||||
$apiEndpoint = "$MaestroApiEndPoint/api/channels/${ChannelId}?api-version=$MaestroApiVersion"
|
||||
|
||||
$result = try { Invoke-WebRequest -Method Get -Uri $apiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" }
|
||||
return $result
|
||||
}
|
||||
|
||||
function Get-MaestroBuild([int]$BuildId) {
|
||||
Validate-MaestroVars
|
||||
|
||||
$apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken
|
||||
$apiEndpoint = "$MaestroApiEndPoint/api/builds/${BuildId}?api-version=$MaestroApiVersion"
|
||||
|
||||
$result = try { return Invoke-WebRequest -Method Get -Uri $apiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" }
|
||||
return $result
|
||||
}
|
||||
|
||||
function Get-MaestroSubscriptions([string]$SourceRepository, [int]$ChannelId) {
|
||||
Validate-MaestroVars
|
||||
|
||||
$SourceRepository = [System.Web.HttpUtility]::UrlEncode($SourceRepository)
|
||||
$apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken
|
||||
$apiEndpoint = "$MaestroApiEndPoint/api/subscriptions?sourceRepository=$SourceRepository&channelId=$ChannelId&api-version=$MaestroApiVersion"
|
||||
|
||||
$result = try { Invoke-WebRequest -Method Get -Uri $apiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" }
|
||||
return $result
|
||||
}
|
||||
|
||||
function Assign-BuildToChannel([int]$BuildId, [int]$ChannelId) {
|
||||
Validate-MaestroVars
|
||||
|
||||
$apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken
|
||||
$apiEndpoint = "$MaestroApiEndPoint/api/channels/${ChannelId}/builds/${BuildId}?api-version=$MaestroApiVersion"
|
||||
Invoke-WebRequest -Method Post -Uri $apiEndpoint -Headers $apiHeaders | Out-Null
|
||||
}
|
||||
|
||||
function Trigger-Subscription([string]$SubscriptionId) {
|
||||
Validate-MaestroVars
|
||||
|
||||
$apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken
|
||||
$apiEndpoint = "$MaestroApiEndPoint/api/subscriptions/$SubscriptionId/trigger?api-version=$MaestroApiVersion"
|
||||
Invoke-WebRequest -Uri $apiEndpoint -Headers $apiHeaders -Method Post | Out-Null
|
||||
}
|
||||
|
||||
function Validate-MaestroVars {
|
||||
try {
|
||||
Get-Variable MaestroApiEndPoint | Out-Null
|
||||
Get-Variable MaestroApiVersion | Out-Null
|
||||
Get-Variable MaestroApiAccessToken | Out-Null
|
||||
|
||||
if (!($MaestroApiEndPoint -Match '^http[s]?://maestro-(int|prod).westus2.cloudapp.azure.com$')) {
|
||||
Write-PipelineTelemetryError -Category 'MaestroVars' -Message "MaestroApiEndPoint is not a valid Maestro URL. '$MaestroApiEndPoint'"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
if (!($MaestroApiVersion -Match '^[0-9]{4}-[0-9]{2}-[0-9]{2}$')) {
|
||||
Write-PipelineTelemetryError -Category 'MaestroVars' -Message "MaestroApiVersion does not match a version string in the format yyyy-MM-DD. '$MaestroApiVersion'"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-PipelineTelemetryError -Category 'MaestroVars' -Message 'Error: Variables `MaestroApiEndPoint`, `MaestroApiVersion` and `MaestroApiAccessToken` are required while using this script.'
|
||||
Write-Host $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][int] $BuildId,
|
||||
[Parameter(Mandatory=$true)][int] $PublishingInfraVersion,
|
||||
[Parameter(Mandatory=$true)][string] $AzdoToken,
|
||||
[Parameter(Mandatory=$true)][string] $MaestroToken,
|
||||
[Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro-prod.westus2.cloudapp.azure.com',
|
||||
[Parameter(Mandatory=$true)][string] $WaitPublishingFinish,
|
||||
[Parameter(Mandatory=$false)][string] $ArtifactsPublishingAdditionalParameters,
|
||||
[Parameter(Mandatory=$false)][string] $SymbolPublishingAdditionalParameters
|
||||
)
|
||||
|
||||
try {
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
$darc = Get-Darc
|
||||
|
||||
$optionalParams = [System.Collections.ArrayList]::new()
|
||||
|
||||
if ("" -ne $ArtifactsPublishingAdditionalParameters) {
|
||||
$optionalParams.Add("--artifact-publishing-parameters") | Out-Null
|
||||
$optionalParams.Add($ArtifactsPublishingAdditionalParameters) | Out-Null
|
||||
}
|
||||
|
||||
if ("" -ne $SymbolPublishingAdditionalParameters) {
|
||||
$optionalParams.Add("--symbol-publishing-parameters") | Out-Null
|
||||
$optionalParams.Add($SymbolPublishingAdditionalParameters) | Out-Null
|
||||
}
|
||||
|
||||
if ("false" -eq $WaitPublishingFinish) {
|
||||
$optionalParams.Add("--no-wait") | Out-Null
|
||||
}
|
||||
|
||||
& $darc add-build-to-channel `
|
||||
--id $buildId `
|
||||
--publishing-infra-version $PublishingInfraVersion `
|
||||
--default-channels `
|
||||
--source-branch main `
|
||||
--azdev-pat $AzdoToken `
|
||||
--bar-uri $MaestroApiEndPoint `
|
||||
--password $MaestroToken `
|
||||
@optionalParams
|
||||
|
||||
if ($LastExitCode -ne 0) {
|
||||
Write-Host "Problems using Darc to promote build ${buildId} to default channels. Stopping execution..."
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host 'done.'
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-PipelineTelemetryError -Category 'PromoteBuild' -Message "There was an error while trying to publish build '$BuildId' to default channels."
|
||||
ExitWithExitCode 1
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $ReleaseConfigsPath # Full path to ReleaseConfigs.txt asset
|
||||
)
|
||||
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
try {
|
||||
$Content = Get-Content $ReleaseConfigsPath
|
||||
|
||||
$BarId = $Content | Select -Index 0
|
||||
|
||||
$Channels = ""
|
||||
$Content | Select -Index 1 | ForEach-Object { $Channels += "$_ ," }
|
||||
|
||||
$IsStableBuild = $Content | Select -Index 2
|
||||
|
||||
Write-PipelineSetVariable -Name 'BARBuildId' -Value $BarId
|
||||
Write-PipelineSetVariable -Name 'InitialChannels' -Value "$Channels"
|
||||
Write-PipelineSetVariable -Name 'IsStableBuild' -Value $IsStableBuild
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
}
|
|
@ -1,257 +1,319 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where Symbols.NuGet packages to be checked are stored
|
||||
[Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation
|
||||
[Parameter(Mandatory=$false)][string] $GHRepoName, # GitHub name of the repo including the Org. E.g., dotnet/arcade
|
||||
[Parameter(Mandatory=$false)][string] $GHCommit, # GitHub commit SHA used to build the packages
|
||||
[Parameter(Mandatory=$true)][string] $SourcelinkCliVersion # Version of SourceLink CLI to use
|
||||
)
|
||||
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
# Cache/HashMap (File -> Exist flag) used to consult whether a file exist
|
||||
# in the repository at a specific commit point. This is populated by inserting
|
||||
# all files present in the repo at a specific commit point.
|
||||
$global:RepoFiles = @{}
|
||||
|
||||
# Maximum number of jobs to run in parallel
|
||||
$MaxParallelJobs = 6
|
||||
|
||||
# Wait time between check for system load
|
||||
$SecondsBetweenLoadChecks = 10
|
||||
|
||||
$ValidatePackage = {
|
||||
param(
|
||||
[string] $PackagePath # Full path to a Symbols.NuGet package
|
||||
)
|
||||
|
||||
. $using:PSScriptRoot\..\tools.ps1
|
||||
|
||||
# Ensure input file exist
|
||||
if (!(Test-Path $PackagePath)) {
|
||||
Write-Host "Input file does not exist: $PackagePath"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Extensions for which we'll look for SourceLink information
|
||||
# For now we'll only care about Portable & Embedded PDBs
|
||||
$RelevantExtensions = @(".dll", ".exe", ".pdb")
|
||||
|
||||
Write-Host -NoNewLine "Validating" ([System.IO.Path]::GetFileName($PackagePath)) "... "
|
||||
|
||||
$PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath)
|
||||
$ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageId
|
||||
$FailedFiles = 0
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
[System.IO.Directory]::CreateDirectory($ExtractPath) | Out-Null
|
||||
|
||||
try {
|
||||
$zip = [System.IO.Compression.ZipFile]::OpenRead($PackagePath)
|
||||
|
||||
$zip.Entries |
|
||||
Where-Object {$RelevantExtensions -contains [System.IO.Path]::GetExtension($_.Name)} |
|
||||
ForEach-Object {
|
||||
$FileName = $_.FullName
|
||||
$Extension = [System.IO.Path]::GetExtension($_.Name)
|
||||
$FakeName = -Join((New-Guid), $Extension)
|
||||
$TargetFile = Join-Path -Path $ExtractPath -ChildPath $FakeName
|
||||
|
||||
# We ignore resource DLLs
|
||||
if ($FileName.EndsWith(".resources.dll")) {
|
||||
return
|
||||
}
|
||||
|
||||
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile, $true)
|
||||
|
||||
$ValidateFile = {
|
||||
param(
|
||||
[string] $FullPath, # Full path to the module that has to be checked
|
||||
[string] $RealPath,
|
||||
[ref] $FailedFiles
|
||||
)
|
||||
|
||||
$sourcelinkExe = "$env:USERPROFILE\.dotnet\tools"
|
||||
$sourcelinkExe = Resolve-Path "$sourcelinkExe\sourcelink.exe"
|
||||
$SourceLinkInfos = & $sourcelinkExe print-urls $FullPath | Out-String
|
||||
|
||||
if ($LASTEXITCODE -eq 0 -and -not ([string]::IsNullOrEmpty($SourceLinkInfos))) {
|
||||
$NumFailedLinks = 0
|
||||
|
||||
# We only care about Http addresses
|
||||
$Matches = (Select-String '(http[s]?)(:\/\/)([^\s,]+)' -Input $SourceLinkInfos -AllMatches).Matches
|
||||
|
||||
if ($Matches.Count -ne 0) {
|
||||
$Matches.Value |
|
||||
ForEach-Object {
|
||||
$Link = $_
|
||||
$CommitUrl = "https://raw.githubusercontent.com/${using:GHRepoName}/${using:GHCommit}/"
|
||||
|
||||
$FilePath = $Link.Replace($CommitUrl, "")
|
||||
$Status = 200
|
||||
$Cache = $using:RepoFiles
|
||||
|
||||
if ( !($Cache.ContainsKey($FilePath)) ) {
|
||||
try {
|
||||
$Uri = $Link -as [System.URI]
|
||||
|
||||
# Only GitHub links are valid
|
||||
if ($Uri.AbsoluteURI -ne $null -and ($Uri.Host -match "github" -or $Uri.Host -match "githubusercontent")) {
|
||||
$Status = (Invoke-WebRequest -Uri $Link -UseBasicParsing -Method HEAD -TimeoutSec 5).StatusCode
|
||||
}
|
||||
else {
|
||||
$Status = 0
|
||||
}
|
||||
}
|
||||
catch {
|
||||
write-host $_
|
||||
$Status = 0
|
||||
}
|
||||
}
|
||||
|
||||
if ($Status -ne 200) {
|
||||
if ($NumFailedLinks -eq 0) {
|
||||
if ($FailedFiles.Value -eq 0) {
|
||||
Write-Host
|
||||
}
|
||||
|
||||
Write-Host "`tFile $RealPath has broken links:"
|
||||
}
|
||||
|
||||
Write-Host "`t`tFailed to retrieve $Link"
|
||||
|
||||
$NumFailedLinks++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($NumFailedLinks -ne 0) {
|
||||
$FailedFiles.value++
|
||||
$global:LASTEXITCODE = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&$ValidateFile $TargetFile $FileName ([ref]$FailedFiles)
|
||||
}
|
||||
}
|
||||
catch {
|
||||
|
||||
}
|
||||
finally {
|
||||
$zip.Dispose()
|
||||
}
|
||||
|
||||
if ($FailedFiles -eq 0) {
|
||||
Write-Host "Passed."
|
||||
return 0
|
||||
}
|
||||
else {
|
||||
Write-Host "$PackagePath has broken SourceLink links."
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
function ValidateSourceLinkLinks {
|
||||
if ($GHRepoName -ne "" -and !($GHRepoName -Match "^[^\s\/]+/[^\s\/]+$")) {
|
||||
if (!($GHRepoName -Match "^[^\s-]+-[^\s]+$")) {
|
||||
Write-PipelineTaskError "GHRepoName should be in the format <org>/<repo> or <org>-<repo>. '$GHRepoName'"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
else {
|
||||
$GHRepoName = $GHRepoName -replace '^([^\s-]+)-([^\s]+)$', '$1/$2';
|
||||
}
|
||||
}
|
||||
|
||||
if ($GHCommit -ne "" -and !($GHCommit -Match "^[0-9a-fA-F]{40}$")) {
|
||||
Write-PipelineTaskError "GHCommit should be a 40 chars hexadecimal string. '$GHCommit'"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
if ($GHRepoName -ne "" -and $GHCommit -ne "") {
|
||||
$RepoTreeURL = -Join("http://api.github.com/repos/", $GHRepoName, "/git/trees/", $GHCommit, "?recursive=1")
|
||||
$CodeExtensions = @(".cs", ".vb", ".fs", ".fsi", ".fsx", ".fsscript")
|
||||
|
||||
try {
|
||||
# Retrieve the list of files in the repo at that particular commit point and store them in the RepoFiles hash
|
||||
$Data = Invoke-WebRequest $RepoTreeURL -UseBasicParsing | ConvertFrom-Json | Select-Object -ExpandProperty tree
|
||||
|
||||
foreach ($file in $Data) {
|
||||
$Extension = [System.IO.Path]::GetExtension($file.path)
|
||||
|
||||
if ($CodeExtensions.Contains($Extension)) {
|
||||
$RepoFiles[$file.path] = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host "Problems downloading the list of files from the repo. Url used: $RepoTreeURL . Execution will proceed without caching."
|
||||
}
|
||||
}
|
||||
elseif ($GHRepoName -ne "" -or $GHCommit -ne "") {
|
||||
Write-Host "For using the http caching mechanism both GHRepoName and GHCommit should be informed."
|
||||
}
|
||||
|
||||
if (Test-Path $ExtractPath) {
|
||||
Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
# Process each NuGet package in parallel
|
||||
Get-ChildItem "$InputPath\*.symbols.nupkg" |
|
||||
ForEach-Object {
|
||||
Start-Job -ScriptBlock $ValidatePackage -ArgumentList $_.FullName | Out-Null
|
||||
$NumJobs = @(Get-Job -State 'Running').Count
|
||||
|
||||
while ($NumJobs -ge $MaxParallelJobs) {
|
||||
Write-Host "There are $NumJobs validation jobs running right now. Waiting $SecondsBetweenLoadChecks seconds to check again."
|
||||
sleep $SecondsBetweenLoadChecks
|
||||
$NumJobs = @(Get-Job -State 'Running').Count
|
||||
}
|
||||
|
||||
foreach ($Job in @(Get-Job -State 'Completed')) {
|
||||
Receive-Job -Id $Job.Id
|
||||
Remove-Job -Id $Job.Id
|
||||
}
|
||||
}
|
||||
|
||||
$ValidationFailures = 0
|
||||
foreach ($Job in @(Get-Job)) {
|
||||
$jobResult = Wait-Job -Id $Job.Id | Receive-Job
|
||||
if ($jobResult -ne "0") {
|
||||
$ValidationFailures++
|
||||
}
|
||||
}
|
||||
if ($ValidationFailures -gt 0) {
|
||||
Write-PipelineTaskError " $ValidationFailures package(s) failed validation."
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
|
||||
function InstallSourcelinkCli {
|
||||
$sourcelinkCliPackageName = "sourcelink"
|
||||
|
||||
$dotnetRoot = InitializeDotNetCli -install:$true
|
||||
$dotnet = "$dotnetRoot\dotnet.exe"
|
||||
$toolList = & "$dotnet" tool list --global
|
||||
|
||||
if (($toolList -like "*$sourcelinkCliPackageName*") -and ($toolList -like "*$sourcelinkCliVersion*")) {
|
||||
Write-Host "SourceLink CLI version $sourcelinkCliVersion is already installed."
|
||||
}
|
||||
else {
|
||||
Write-Host "Installing SourceLink CLI version $sourcelinkCliVersion..."
|
||||
Write-Host "You may need to restart your command window if this is the first dotnet tool you have installed."
|
||||
& "$dotnet" tool install $sourcelinkCliPackageName --version $sourcelinkCliVersion --verbosity "minimal" --global
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
InstallSourcelinkCli
|
||||
|
||||
ValidateSourceLinkLinks
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where Symbols.NuGet packages to be checked are stored
|
||||
[Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation
|
||||
[Parameter(Mandatory=$false)][string] $GHRepoName, # GitHub name of the repo including the Org. E.g., dotnet/arcade
|
||||
[Parameter(Mandatory=$false)][string] $GHCommit, # GitHub commit SHA used to build the packages
|
||||
[Parameter(Mandatory=$true)][string] $SourcelinkCliVersion # Version of SourceLink CLI to use
|
||||
)
|
||||
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
# Cache/HashMap (File -> Exist flag) used to consult whether a file exist
|
||||
# in the repository at a specific commit point. This is populated by inserting
|
||||
# all files present in the repo at a specific commit point.
|
||||
$global:RepoFiles = @{}
|
||||
|
||||
# Maximum number of jobs to run in parallel
|
||||
$MaxParallelJobs = 16
|
||||
|
||||
$MaxRetries = 5
|
||||
$RetryWaitTimeInSeconds = 30
|
||||
|
||||
# Wait time between check for system load
|
||||
$SecondsBetweenLoadChecks = 10
|
||||
|
||||
if (!$InputPath -or !(Test-Path $InputPath)){
|
||||
Write-Host "No files to validate."
|
||||
ExitWithExitCode 0
|
||||
}
|
||||
|
||||
$ValidatePackage = {
|
||||
param(
|
||||
[string] $PackagePath # Full path to a Symbols.NuGet package
|
||||
)
|
||||
|
||||
. $using:PSScriptRoot\..\tools.ps1
|
||||
|
||||
# Ensure input file exist
|
||||
if (!(Test-Path $PackagePath)) {
|
||||
Write-Host "Input file does not exist: $PackagePath"
|
||||
return [pscustomobject]@{
|
||||
result = 1
|
||||
packagePath = $PackagePath
|
||||
}
|
||||
}
|
||||
|
||||
# Extensions for which we'll look for SourceLink information
|
||||
# For now we'll only care about Portable & Embedded PDBs
|
||||
$RelevantExtensions = @('.dll', '.exe', '.pdb')
|
||||
|
||||
Write-Host -NoNewLine 'Validating ' ([System.IO.Path]::GetFileName($PackagePath)) '...'
|
||||
|
||||
$PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath)
|
||||
$ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageId
|
||||
$FailedFiles = 0
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
[System.IO.Directory]::CreateDirectory($ExtractPath) | Out-Null
|
||||
|
||||
try {
|
||||
$zip = [System.IO.Compression.ZipFile]::OpenRead($PackagePath)
|
||||
|
||||
$zip.Entries |
|
||||
Where-Object {$RelevantExtensions -contains [System.IO.Path]::GetExtension($_.Name)} |
|
||||
ForEach-Object {
|
||||
$FileName = $_.FullName
|
||||
$Extension = [System.IO.Path]::GetExtension($_.Name)
|
||||
$FakeName = -Join((New-Guid), $Extension)
|
||||
$TargetFile = Join-Path -Path $ExtractPath -ChildPath $FakeName
|
||||
|
||||
# We ignore resource DLLs
|
||||
if ($FileName.EndsWith('.resources.dll')) {
|
||||
return [pscustomobject]@{
|
||||
result = 0
|
||||
packagePath = $PackagePath
|
||||
}
|
||||
}
|
||||
|
||||
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile, $true)
|
||||
|
||||
$ValidateFile = {
|
||||
param(
|
||||
[string] $FullPath, # Full path to the module that has to be checked
|
||||
[string] $RealPath,
|
||||
[ref] $FailedFiles
|
||||
)
|
||||
|
||||
$sourcelinkExe = "$env:USERPROFILE\.dotnet\tools"
|
||||
$sourcelinkExe = Resolve-Path "$sourcelinkExe\sourcelink.exe"
|
||||
$SourceLinkInfos = & $sourcelinkExe print-urls $FullPath | Out-String
|
||||
|
||||
if ($LASTEXITCODE -eq 0 -and -not ([string]::IsNullOrEmpty($SourceLinkInfos))) {
|
||||
$NumFailedLinks = 0
|
||||
|
||||
# We only care about Http addresses
|
||||
$Matches = (Select-String '(http[s]?)(:\/\/)([^\s,]+)' -Input $SourceLinkInfos -AllMatches).Matches
|
||||
|
||||
if ($Matches.Count -ne 0) {
|
||||
$Matches.Value |
|
||||
ForEach-Object {
|
||||
$Link = $_
|
||||
$CommitUrl = "https://raw.githubusercontent.com/${using:GHRepoName}/${using:GHCommit}/"
|
||||
|
||||
$FilePath = $Link.Replace($CommitUrl, "")
|
||||
$Status = 200
|
||||
$Cache = $using:RepoFiles
|
||||
|
||||
$attempts = 0
|
||||
|
||||
while ($attempts -lt $using:MaxRetries) {
|
||||
if ( !($Cache.ContainsKey($FilePath)) ) {
|
||||
try {
|
||||
$Uri = $Link -as [System.URI]
|
||||
|
||||
if ($Link -match "submodules") {
|
||||
# Skip submodule links until sourcelink properly handles submodules
|
||||
$Status = 200
|
||||
}
|
||||
elseif ($Uri.AbsoluteURI -ne $null -and ($Uri.Host -match 'github' -or $Uri.Host -match 'githubusercontent')) {
|
||||
# Only GitHub links are valid
|
||||
$Status = (Invoke-WebRequest -Uri $Link -UseBasicParsing -Method HEAD -TimeoutSec 5).StatusCode
|
||||
}
|
||||
else {
|
||||
# If it's not a github link, we want to break out of the loop and not retry.
|
||||
$Status = 0
|
||||
$attempts = $using:MaxRetries
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
$Status = 0
|
||||
}
|
||||
}
|
||||
|
||||
if ($Status -ne 200) {
|
||||
$attempts++
|
||||
|
||||
if ($attempts -lt $using:MaxRetries)
|
||||
{
|
||||
$attemptsLeft = $using:MaxRetries - $attempts
|
||||
Write-Warning "Download failed, $attemptsLeft attempts remaining, will retry in $using:RetryWaitTimeInSeconds seconds"
|
||||
Start-Sleep -Seconds $using:RetryWaitTimeInSeconds
|
||||
}
|
||||
else {
|
||||
if ($NumFailedLinks -eq 0) {
|
||||
if ($FailedFiles.Value -eq 0) {
|
||||
Write-Host
|
||||
}
|
||||
|
||||
Write-Host "`tFile $RealPath has broken links:"
|
||||
}
|
||||
|
||||
Write-Host "`t`tFailed to retrieve $Link"
|
||||
|
||||
$NumFailedLinks++
|
||||
}
|
||||
}
|
||||
else {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($NumFailedLinks -ne 0) {
|
||||
$FailedFiles.value++
|
||||
$global:LASTEXITCODE = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&$ValidateFile $TargetFile $FileName ([ref]$FailedFiles)
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
}
|
||||
finally {
|
||||
$zip.Dispose()
|
||||
}
|
||||
|
||||
if ($FailedFiles -eq 0) {
|
||||
Write-Host 'Passed.'
|
||||
return [pscustomobject]@{
|
||||
result = 0
|
||||
packagePath = $PackagePath
|
||||
}
|
||||
}
|
||||
else {
|
||||
Write-PipelineTelemetryError -Category 'SourceLink' -Message "$PackagePath has broken SourceLink links."
|
||||
return [pscustomobject]@{
|
||||
result = 1
|
||||
packagePath = $PackagePath
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function CheckJobResult(
|
||||
$result,
|
||||
$packagePath,
|
||||
[ref]$ValidationFailures,
|
||||
[switch]$logErrors) {
|
||||
if ($result -ne '0') {
|
||||
if ($logErrors) {
|
||||
Write-PipelineTelemetryError -Category 'SourceLink' -Message "$packagePath has broken SourceLink links."
|
||||
}
|
||||
$ValidationFailures.Value++
|
||||
}
|
||||
}
|
||||
|
||||
function ValidateSourceLinkLinks {
|
||||
if ($GHRepoName -ne '' -and !($GHRepoName -Match '^[^\s\/]+/[^\s\/]+$')) {
|
||||
if (!($GHRepoName -Match '^[^\s-]+-[^\s]+$')) {
|
||||
Write-PipelineTelemetryError -Category 'SourceLink' -Message "GHRepoName should be in the format <org>/<repo> or <org>-<repo>. '$GHRepoName'"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
else {
|
||||
$GHRepoName = $GHRepoName -replace '^([^\s-]+)-([^\s]+)$', '$1/$2';
|
||||
}
|
||||
}
|
||||
|
||||
if ($GHCommit -ne '' -and !($GHCommit -Match '^[0-9a-fA-F]{40}$')) {
|
||||
Write-PipelineTelemetryError -Category 'SourceLink' -Message "GHCommit should be a 40 chars hexadecimal string. '$GHCommit'"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
if ($GHRepoName -ne '' -and $GHCommit -ne '') {
|
||||
$RepoTreeURL = -Join('http://api.github.com/repos/', $GHRepoName, '/git/trees/', $GHCommit, '?recursive=1')
|
||||
$CodeExtensions = @('.cs', '.vb', '.fs', '.fsi', '.fsx', '.fsscript')
|
||||
|
||||
try {
|
||||
# Retrieve the list of files in the repo at that particular commit point and store them in the RepoFiles hash
|
||||
$Data = Invoke-WebRequest $RepoTreeURL -UseBasicParsing | ConvertFrom-Json | Select-Object -ExpandProperty tree
|
||||
|
||||
foreach ($file in $Data) {
|
||||
$Extension = [System.IO.Path]::GetExtension($file.path)
|
||||
|
||||
if ($CodeExtensions.Contains($Extension)) {
|
||||
$RepoFiles[$file.path] = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host "Problems downloading the list of files from the repo. Url used: $RepoTreeURL . Execution will proceed without caching."
|
||||
}
|
||||
}
|
||||
elseif ($GHRepoName -ne '' -or $GHCommit -ne '') {
|
||||
Write-Host 'For using the http caching mechanism both GHRepoName and GHCommit should be informed.'
|
||||
}
|
||||
|
||||
if (Test-Path $ExtractPath) {
|
||||
Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
$ValidationFailures = 0
|
||||
|
||||
# Process each NuGet package in parallel
|
||||
Get-ChildItem "$InputPath\*.symbols.nupkg" |
|
||||
ForEach-Object {
|
||||
Write-Host "Starting $($_.FullName)"
|
||||
Start-Job -ScriptBlock $ValidatePackage -ArgumentList $_.FullName | Out-Null
|
||||
$NumJobs = @(Get-Job -State 'Running').Count
|
||||
|
||||
while ($NumJobs -ge $MaxParallelJobs) {
|
||||
Write-Host "There are $NumJobs validation jobs running right now. Waiting $SecondsBetweenLoadChecks seconds to check again."
|
||||
sleep $SecondsBetweenLoadChecks
|
||||
$NumJobs = @(Get-Job -State 'Running').Count
|
||||
}
|
||||
|
||||
foreach ($Job in @(Get-Job -State 'Completed')) {
|
||||
$jobResult = Wait-Job -Id $Job.Id | Receive-Job
|
||||
CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$ValidationFailures) -LogErrors
|
||||
Remove-Job -Id $Job.Id
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($Job in @(Get-Job)) {
|
||||
$jobResult = Wait-Job -Id $Job.Id | Receive-Job
|
||||
CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$ValidationFailures)
|
||||
Remove-Job -Id $Job.Id
|
||||
}
|
||||
if ($ValidationFailures -gt 0) {
|
||||
Write-PipelineTelemetryError -Category 'SourceLink' -Message "$ValidationFailures package(s) failed validation."
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
|
||||
function InstallSourcelinkCli {
|
||||
$sourcelinkCliPackageName = 'sourcelink'
|
||||
|
||||
$dotnetRoot = InitializeDotNetCli -install:$true
|
||||
$dotnet = "$dotnetRoot\dotnet.exe"
|
||||
$toolList = & "$dotnet" tool list --global
|
||||
|
||||
if (($toolList -like "*$sourcelinkCliPackageName*") -and ($toolList -like "*$sourcelinkCliVersion*")) {
|
||||
Write-Host "SourceLink CLI version $sourcelinkCliVersion is already installed."
|
||||
}
|
||||
else {
|
||||
Write-Host "Installing SourceLink CLI version $sourcelinkCliVersion..."
|
||||
Write-Host 'You may need to restart your command window if this is the first dotnet tool you have installed.'
|
||||
& "$dotnet" tool install $sourcelinkCliPackageName --version $sourcelinkCliVersion --verbosity "minimal" --global
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
InstallSourcelinkCli
|
||||
|
||||
foreach ($Job in @(Get-Job)) {
|
||||
Remove-Job -Id $Job.Id
|
||||
}
|
||||
|
||||
ValidateSourceLinkLinks
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'SourceLink' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
|
|
@ -1,189 +1,339 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where NuGet packages to be checked are stored
|
||||
[Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation
|
||||
[Parameter(Mandatory=$true)][string] $DotnetSymbolVersion # Version of dotnet symbol to use
|
||||
)
|
||||
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
function FirstMatchingSymbolDescriptionOrDefault {
|
||||
param(
|
||||
[string] $FullPath, # Full path to the module that has to be checked
|
||||
[string] $TargetServerParam, # Parameter to pass to `Symbol Tool` indicating the server to lookup for symbols
|
||||
[string] $SymbolsPath
|
||||
)
|
||||
|
||||
$FileName = [System.IO.Path]::GetFileName($FullPath)
|
||||
$Extension = [System.IO.Path]::GetExtension($FullPath)
|
||||
|
||||
# Those below are potential symbol files that the `dotnet symbol` might
|
||||
# return. Which one will be returned depend on the type of file we are
|
||||
# checking and which type of file was uploaded.
|
||||
|
||||
# The file itself is returned
|
||||
$SymbolPath = $SymbolsPath + "\" + $FileName
|
||||
|
||||
# PDB file for the module
|
||||
$PdbPath = $SymbolPath.Replace($Extension, ".pdb")
|
||||
|
||||
# PDB file for R2R module (created by crossgen)
|
||||
$NGenPdb = $SymbolPath.Replace($Extension, ".ni.pdb")
|
||||
|
||||
# DBG file for a .so library
|
||||
$SODbg = $SymbolPath.Replace($Extension, ".so.dbg")
|
||||
|
||||
# DWARF file for a .dylib
|
||||
$DylibDwarf = $SymbolPath.Replace($Extension, ".dylib.dwarf")
|
||||
|
||||
$dotnetSymbolExe = "$env:USERPROFILE\.dotnet\tools"
|
||||
$dotnetSymbolExe = Resolve-Path "$dotnetSymbolExe\dotnet-symbol.exe"
|
||||
|
||||
& $dotnetSymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath | Out-Null
|
||||
|
||||
if (Test-Path $PdbPath) {
|
||||
return "PDB"
|
||||
}
|
||||
elseif (Test-Path $NGenPdb) {
|
||||
return "NGen PDB"
|
||||
}
|
||||
elseif (Test-Path $SODbg) {
|
||||
return "DBG for SO"
|
||||
}
|
||||
elseif (Test-Path $DylibDwarf) {
|
||||
return "Dwarf for Dylib"
|
||||
}
|
||||
elseif (Test-Path $SymbolPath) {
|
||||
return "Module"
|
||||
}
|
||||
else {
|
||||
return $null
|
||||
}
|
||||
}
|
||||
|
||||
function CountMissingSymbols {
|
||||
param(
|
||||
[string] $PackagePath # Path to a NuGet package
|
||||
)
|
||||
|
||||
# Ensure input file exist
|
||||
if (!(Test-Path $PackagePath)) {
|
||||
Write-PipelineTaskError "Input file does not exist: $PackagePath"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
# Extensions for which we'll look for symbols
|
||||
$RelevantExtensions = @(".dll", ".exe", ".so", ".dylib")
|
||||
|
||||
# How many files are missing symbol information
|
||||
$MissingSymbols = 0
|
||||
|
||||
$PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath)
|
||||
$PackageGuid = New-Guid
|
||||
$ExtractPath = Join-Path -Path $ExtractPath -ChildPath $PackageGuid
|
||||
$SymbolsPath = Join-Path -Path $ExtractPath -ChildPath "Symbols"
|
||||
|
||||
[System.IO.Compression.ZipFile]::ExtractToDirectory($PackagePath, $ExtractPath)
|
||||
|
||||
Get-ChildItem -Recurse $ExtractPath |
|
||||
Where-Object {$RelevantExtensions -contains $_.Extension} |
|
||||
ForEach-Object {
|
||||
if ($_.FullName -Match "\\ref\\") {
|
||||
Write-Host "`t Ignoring reference assembly file" $_.FullName
|
||||
return
|
||||
}
|
||||
|
||||
$SymbolsOnMSDL = FirstMatchingSymbolDescriptionOrDefault $_.FullName "--microsoft-symbol-server" $SymbolsPath
|
||||
$SymbolsOnSymWeb = FirstMatchingSymbolDescriptionOrDefault $_.FullName "--internal-server" $SymbolsPath
|
||||
|
||||
Write-Host -NoNewLine "`t Checking file" $_.FullName "... "
|
||||
|
||||
if ($SymbolsOnMSDL -ne $null -and $SymbolsOnSymWeb -ne $null) {
|
||||
Write-Host "Symbols found on MSDL (" $SymbolsOnMSDL ") and SymWeb (" $SymbolsOnSymWeb ")"
|
||||
}
|
||||
else {
|
||||
$MissingSymbols++
|
||||
|
||||
if ($SymbolsOnMSDL -eq $null -and $SymbolsOnSymWeb -eq $null) {
|
||||
Write-Host "No symbols found on MSDL or SymWeb!"
|
||||
}
|
||||
else {
|
||||
if ($SymbolsOnMSDL -eq $null) {
|
||||
Write-Host "No symbols found on MSDL!"
|
||||
}
|
||||
else {
|
||||
Write-Host "No symbols found on SymWeb!"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Pop-Location
|
||||
|
||||
return $MissingSymbols
|
||||
}
|
||||
|
||||
function CheckSymbolsAvailable {
|
||||
if (Test-Path $ExtractPath) {
|
||||
Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
Get-ChildItem "$InputPath\*.nupkg" |
|
||||
ForEach-Object {
|
||||
$FileName = $_.Name
|
||||
|
||||
# These packages from Arcade-Services include some native libraries that
|
||||
# our current symbol uploader can't handle. Below is a workaround until
|
||||
# we get issue: https://github.com/dotnet/arcade/issues/2457 sorted.
|
||||
if ($FileName -Match "Microsoft\.DotNet\.Darc\.") {
|
||||
Write-Host "Ignoring Arcade-services file: $FileName"
|
||||
Write-Host
|
||||
return
|
||||
}
|
||||
elseif ($FileName -Match "Microsoft\.DotNet\.Maestro\.Tasks\.") {
|
||||
Write-Host "Ignoring Arcade-services file: $FileName"
|
||||
Write-Host
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host "Validating $FileName "
|
||||
$Status = CountMissingSymbols "$InputPath\$FileName"
|
||||
|
||||
if ($Status -ne 0) {
|
||||
Write-PipelineTaskError "Missing symbols for $Status modules in the package $FileName"
|
||||
ExitWithExitCode $exitCode
|
||||
}
|
||||
|
||||
Write-Host
|
||||
}
|
||||
}
|
||||
|
||||
function InstallDotnetSymbol {
|
||||
$dotnetSymbolPackageName = "dotnet-symbol"
|
||||
|
||||
$dotnetRoot = InitializeDotNetCli -install:$true
|
||||
$dotnet = "$dotnetRoot\dotnet.exe"
|
||||
$toolList = & "$dotnet" tool list --global
|
||||
|
||||
if (($toolList -like "*$dotnetSymbolPackageName*") -and ($toolList -like "*$dotnetSymbolVersion*")) {
|
||||
Write-Host "dotnet-symbol version $dotnetSymbolVersion is already installed."
|
||||
}
|
||||
else {
|
||||
Write-Host "Installing dotnet-symbol version $dotnetSymbolVersion..."
|
||||
Write-Host "You may need to restart your command window if this is the first dotnet tool you have installed."
|
||||
& "$dotnet" tool install $dotnetSymbolPackageName --version $dotnetSymbolVersion --verbosity "minimal" --global
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
InstallDotnetSymbol
|
||||
|
||||
CheckSymbolsAvailable
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
param(
|
||||
[Parameter(Mandatory = $true)][string] $InputPath, # Full path to directory where NuGet packages to be checked are stored
|
||||
[Parameter(Mandatory = $true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation
|
||||
[Parameter(Mandatory = $true)][string] $DotnetSymbolVersion, # Version of dotnet symbol to use
|
||||
[Parameter(Mandatory = $false)][switch] $CheckForWindowsPdbs, # If we should check for the existence of windows pdbs in addition to portable PDBs
|
||||
[Parameter(Mandatory = $false)][switch] $ContinueOnError, # If we should keep checking symbols after an error
|
||||
[Parameter(Mandatory = $false)][switch] $Clean, # Clean extracted symbols directory after checking symbols
|
||||
[Parameter(Mandatory = $false)][string] $SymbolExclusionFile # Exclude the symbols in the file from publishing to symbol server
|
||||
)
|
||||
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
# Maximum number of jobs to run in parallel
|
||||
$MaxParallelJobs = 16
|
||||
|
||||
# Max number of retries
|
||||
$MaxRetry = 5
|
||||
|
||||
# Wait time between check for system load
|
||||
$SecondsBetweenLoadChecks = 10
|
||||
|
||||
# Set error codes
|
||||
Set-Variable -Name "ERROR_BADEXTRACT" -Option Constant -Value -1
|
||||
Set-Variable -Name "ERROR_FILEDOESNOTEXIST" -Option Constant -Value -2
|
||||
|
||||
$WindowsPdbVerificationParam = ""
|
||||
if ($CheckForWindowsPdbs) {
|
||||
$WindowsPdbVerificationParam = "--windows-pdbs"
|
||||
}
|
||||
|
||||
$ExclusionSet = New-Object System.Collections.Generic.HashSet[string];
|
||||
|
||||
if (!$InputPath -or !(Test-Path $InputPath)){
|
||||
Write-Host "No symbols to validate."
|
||||
ExitWithExitCode 0
|
||||
}
|
||||
|
||||
#Check if the path exists
|
||||
if ($SymbolExclusionFile -and (Test-Path $SymbolExclusionFile)){
|
||||
[string[]]$Exclusions = Get-Content "$SymbolExclusionFile"
|
||||
$Exclusions | foreach { if($_ -and $_.Trim()){$ExclusionSet.Add($_)} }
|
||||
}
|
||||
else{
|
||||
Write-Host "Symbol Exclusion file does not exists. No symbols to exclude."
|
||||
}
|
||||
|
||||
$CountMissingSymbols = {
|
||||
param(
|
||||
[string] $PackagePath, # Path to a NuGet package
|
||||
[string] $WindowsPdbVerificationParam # If we should check for the existence of windows pdbs in addition to portable PDBs
|
||||
)
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
Write-Host "Validating $PackagePath "
|
||||
|
||||
# Ensure input file exist
|
||||
if (!(Test-Path $PackagePath)) {
|
||||
Write-PipelineTaskError "Input file does not exist: $PackagePath"
|
||||
return [pscustomobject]@{
|
||||
result = $using:ERROR_FILEDOESNOTEXIST
|
||||
packagePath = $PackagePath
|
||||
}
|
||||
}
|
||||
|
||||
# Extensions for which we'll look for symbols
|
||||
$RelevantExtensions = @('.dll', '.exe', '.so', '.dylib')
|
||||
|
||||
# How many files are missing symbol information
|
||||
$MissingSymbols = 0
|
||||
|
||||
$PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath)
|
||||
$PackageGuid = New-Guid
|
||||
$ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageGuid
|
||||
$SymbolsPath = Join-Path -Path $ExtractPath -ChildPath 'Symbols'
|
||||
|
||||
try {
|
||||
[System.IO.Compression.ZipFile]::ExtractToDirectory($PackagePath, $ExtractPath)
|
||||
}
|
||||
catch {
|
||||
Write-Host "Something went wrong extracting $PackagePath"
|
||||
Write-Host $_
|
||||
return [pscustomobject]@{
|
||||
result = $using:ERROR_BADEXTRACT
|
||||
packagePath = $PackagePath
|
||||
}
|
||||
}
|
||||
|
||||
Get-ChildItem -Recurse $ExtractPath |
|
||||
Where-Object { $RelevantExtensions -contains $_.Extension } |
|
||||
ForEach-Object {
|
||||
$FileName = $_.FullName
|
||||
if ($FileName -Match '\\ref\\') {
|
||||
Write-Host "`t Ignoring reference assembly file " $FileName
|
||||
return
|
||||
}
|
||||
|
||||
$FirstMatchingSymbolDescriptionOrDefault = {
|
||||
param(
|
||||
[string] $FullPath, # Full path to the module that has to be checked
|
||||
[string] $TargetServerParam, # Parameter to pass to `Symbol Tool` indicating the server to lookup for symbols
|
||||
[string] $WindowsPdbVerificationParam, # Parameter to pass to potential check for windows-pdbs.
|
||||
[string] $SymbolsPath
|
||||
)
|
||||
|
||||
$FileName = [System.IO.Path]::GetFileName($FullPath)
|
||||
$Extension = [System.IO.Path]::GetExtension($FullPath)
|
||||
|
||||
# Those below are potential symbol files that the `dotnet symbol` might
|
||||
# return. Which one will be returned depend on the type of file we are
|
||||
# checking and which type of file was uploaded.
|
||||
|
||||
# The file itself is returned
|
||||
$SymbolPath = $SymbolsPath + '\' + $FileName
|
||||
|
||||
# PDB file for the module
|
||||
$PdbPath = $SymbolPath.Replace($Extension, '.pdb')
|
||||
|
||||
# PDB file for R2R module (created by crossgen)
|
||||
$NGenPdb = $SymbolPath.Replace($Extension, '.ni.pdb')
|
||||
|
||||
# DBG file for a .so library
|
||||
$SODbg = $SymbolPath.Replace($Extension, '.so.dbg')
|
||||
|
||||
# DWARF file for a .dylib
|
||||
$DylibDwarf = $SymbolPath.Replace($Extension, '.dylib.dwarf')
|
||||
|
||||
$dotnetSymbolExe = "$env:USERPROFILE\.dotnet\tools"
|
||||
$dotnetSymbolExe = Resolve-Path "$dotnetSymbolExe\dotnet-symbol.exe"
|
||||
|
||||
$totalRetries = 0
|
||||
|
||||
while ($totalRetries -lt $using:MaxRetry) {
|
||||
|
||||
# Save the output and get diagnostic output
|
||||
$output = & $dotnetSymbolExe --symbols --modules $WindowsPdbVerificationParam $TargetServerParam $FullPath -o $SymbolsPath --diagnostics | Out-String
|
||||
|
||||
if ((Test-Path $PdbPath) -and (Test-path $SymbolPath)) {
|
||||
return 'Module and PDB for Module'
|
||||
}
|
||||
elseif ((Test-Path $NGenPdb) -and (Test-Path $PdbPath) -and (Test-Path $SymbolPath)) {
|
||||
return 'Dll, PDB and NGen PDB'
|
||||
}
|
||||
elseif ((Test-Path $SODbg) -and (Test-Path $SymbolPath)) {
|
||||
return 'So and DBG for SO'
|
||||
}
|
||||
elseif ((Test-Path $DylibDwarf) -and (Test-Path $SymbolPath)) {
|
||||
return 'Dylib and Dwarf for Dylib'
|
||||
}
|
||||
elseif (Test-Path $SymbolPath) {
|
||||
return 'Module'
|
||||
}
|
||||
else
|
||||
{
|
||||
$totalRetries++
|
||||
}
|
||||
}
|
||||
|
||||
return $null
|
||||
}
|
||||
|
||||
$FileRelativePath = $FileName.Replace("$ExtractPath\", "")
|
||||
if (($($using:ExclusionSet) -ne $null) -and ($($using:ExclusionSet).Contains($FileRelativePath) -or ($($using:ExclusionSet).Contains($FileRelativePath.Replace("\", "/"))))){
|
||||
Write-Host "Skipping $FileName from symbol validation"
|
||||
}
|
||||
|
||||
else {
|
||||
$FileGuid = New-Guid
|
||||
$ExpandedSymbolsPath = Join-Path -Path $SymbolsPath -ChildPath $FileGuid
|
||||
|
||||
$SymbolsOnMSDL = & $FirstMatchingSymbolDescriptionOrDefault `
|
||||
-FullPath $FileName `
|
||||
-TargetServerParam '--microsoft-symbol-server' `
|
||||
-SymbolsPath "$ExpandedSymbolsPath-msdl" `
|
||||
-WindowsPdbVerificationParam $WindowsPdbVerificationParam
|
||||
$SymbolsOnSymWeb = & $FirstMatchingSymbolDescriptionOrDefault `
|
||||
-FullPath $FileName `
|
||||
-TargetServerParam '--internal-server' `
|
||||
-SymbolsPath "$ExpandedSymbolsPath-symweb" `
|
||||
-WindowsPdbVerificationParam $WindowsPdbVerificationParam
|
||||
|
||||
Write-Host -NoNewLine "`t Checking file " $FileName "... "
|
||||
|
||||
if ($SymbolsOnMSDL -ne $null -and $SymbolsOnSymWeb -ne $null) {
|
||||
Write-Host "Symbols found on MSDL ($SymbolsOnMSDL) and SymWeb ($SymbolsOnSymWeb)"
|
||||
}
|
||||
else {
|
||||
$MissingSymbols++
|
||||
|
||||
if ($SymbolsOnMSDL -eq $null -and $SymbolsOnSymWeb -eq $null) {
|
||||
Write-Host 'No symbols found on MSDL or SymWeb!'
|
||||
}
|
||||
else {
|
||||
if ($SymbolsOnMSDL -eq $null) {
|
||||
Write-Host 'No symbols found on MSDL!'
|
||||
}
|
||||
else {
|
||||
Write-Host 'No symbols found on SymWeb!'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($using:Clean) {
|
||||
Remove-Item $ExtractPath -Recurse -Force
|
||||
}
|
||||
|
||||
Pop-Location
|
||||
|
||||
return [pscustomobject]@{
|
||||
result = $MissingSymbols
|
||||
packagePath = $PackagePath
|
||||
}
|
||||
}
|
||||
|
||||
function CheckJobResult(
|
||||
$result,
|
||||
$packagePath,
|
||||
[ref]$DupedSymbols,
|
||||
[ref]$TotalFailures) {
|
||||
if ($result -eq $ERROR_BADEXTRACT) {
|
||||
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath has duplicated symbol files"
|
||||
$DupedSymbols.Value++
|
||||
}
|
||||
elseif ($result -eq $ERROR_FILEDOESNOTEXIST) {
|
||||
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath does not exist"
|
||||
$TotalFailures.Value++
|
||||
}
|
||||
elseif ($result -gt '0') {
|
||||
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Missing symbols for $result modules in the package $packagePath"
|
||||
$TotalFailures.Value++
|
||||
}
|
||||
else {
|
||||
Write-Host "All symbols verified for package $packagePath"
|
||||
}
|
||||
}
|
||||
|
||||
function CheckSymbolsAvailable {
|
||||
if (Test-Path $ExtractPath) {
|
||||
Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
$TotalPackages = 0
|
||||
$TotalFailures = 0
|
||||
$DupedSymbols = 0
|
||||
|
||||
Get-ChildItem "$InputPath\*.nupkg" |
|
||||
ForEach-Object {
|
||||
$FileName = $_.Name
|
||||
$FullName = $_.FullName
|
||||
|
||||
# These packages from Arcade-Services include some native libraries that
|
||||
# our current symbol uploader can't handle. Below is a workaround until
|
||||
# we get issue: https://github.com/dotnet/arcade/issues/2457 sorted.
|
||||
if ($FileName -Match 'Microsoft\.DotNet\.Darc\.') {
|
||||
Write-Host "Ignoring Arcade-services file: $FileName"
|
||||
Write-Host
|
||||
return
|
||||
}
|
||||
elseif ($FileName -Match 'Microsoft\.DotNet\.Maestro\.Tasks\.') {
|
||||
Write-Host "Ignoring Arcade-services file: $FileName"
|
||||
Write-Host
|
||||
return
|
||||
}
|
||||
|
||||
$TotalPackages++
|
||||
|
||||
Start-Job -ScriptBlock $CountMissingSymbols -ArgumentList @($FullName,$WindowsPdbVerificationParam) | Out-Null
|
||||
|
||||
$NumJobs = @(Get-Job -State 'Running').Count
|
||||
|
||||
while ($NumJobs -ge $MaxParallelJobs) {
|
||||
Write-Host "There are $NumJobs validation jobs running right now. Waiting $SecondsBetweenLoadChecks seconds to check again."
|
||||
sleep $SecondsBetweenLoadChecks
|
||||
$NumJobs = @(Get-Job -State 'Running').Count
|
||||
}
|
||||
|
||||
foreach ($Job in @(Get-Job -State 'Completed')) {
|
||||
$jobResult = Wait-Job -Id $Job.Id | Receive-Job
|
||||
CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$DupedSymbols) ([ref]$TotalFailures)
|
||||
Remove-Job -Id $Job.Id
|
||||
}
|
||||
Write-Host
|
||||
}
|
||||
|
||||
foreach ($Job in @(Get-Job)) {
|
||||
$jobResult = Wait-Job -Id $Job.Id | Receive-Job
|
||||
CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$DupedSymbols) ([ref]$TotalFailures)
|
||||
}
|
||||
|
||||
if ($TotalFailures -gt 0 -or $DupedSymbols -gt 0) {
|
||||
if ($TotalFailures -gt 0) {
|
||||
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Symbols missing for $TotalFailures/$TotalPackages packages"
|
||||
}
|
||||
|
||||
if ($DupedSymbols -gt 0) {
|
||||
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$DupedSymbols/$TotalPackages packages had duplicated symbol files and could not be extracted"
|
||||
}
|
||||
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
else {
|
||||
Write-Host "All symbols validated!"
|
||||
}
|
||||
}
|
||||
|
||||
function InstallDotnetSymbol {
|
||||
$dotnetSymbolPackageName = 'dotnet-symbol'
|
||||
|
||||
$dotnetRoot = InitializeDotNetCli -install:$true
|
||||
$dotnet = "$dotnetRoot\dotnet.exe"
|
||||
$toolList = & "$dotnet" tool list --global
|
||||
|
||||
if (($toolList -like "*$dotnetSymbolPackageName*") -and ($toolList -like "*$dotnetSymbolVersion*")) {
|
||||
Write-Host "dotnet-symbol version $dotnetSymbolVersion is already installed."
|
||||
}
|
||||
else {
|
||||
Write-Host "Installing dotnet-symbol version $dotnetSymbolVersion..."
|
||||
Write-Host 'You may need to restart your command window if this is the first dotnet tool you have installed.'
|
||||
& "$dotnet" tool install $dotnetSymbolPackageName --version $dotnetSymbolVersion --verbosity "minimal" --global
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
InstallDotnetSymbol
|
||||
|
||||
foreach ($Job in @(Get-Job)) {
|
||||
Remove-Job -Id $Job.Id
|
||||
}
|
||||
|
||||
CheckSymbolsAvailable
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
|
|
@ -1,57 +1,64 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $SourceRepo,
|
||||
[Parameter(Mandatory=$true)][int] $ChannelId,
|
||||
[Parameter(Mandatory=$true)][string] $MaestroApiAccessToken,
|
||||
[Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = "https://maestro-prod.westus2.cloudapp.azure.com",
|
||||
[Parameter(Mandatory=$false)][string] $MaestroApiVersion = "2019-01-16"
|
||||
)
|
||||
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
# Get all the $SourceRepo subscriptions
|
||||
$normalizedSourceRepo = $SourceRepo.Replace('dnceng@', '')
|
||||
$subscriptions = Get-MaestroSubscriptions -SourceRepository $normalizedSourceRepo -ChannelId $ChannelId
|
||||
|
||||
if (!$subscriptions) {
|
||||
Write-Host "No subscriptions found for source repo '$normalizedSourceRepo' in channel '$ChannelId'"
|
||||
ExitWithExitCode 0
|
||||
}
|
||||
|
||||
$subscriptionsToTrigger = New-Object System.Collections.Generic.List[string]
|
||||
$failedTriggeredSubscription = $false
|
||||
|
||||
# Get all enabled subscriptions that need dependency flow on 'everyBuild'
|
||||
foreach ($subscription in $subscriptions) {
|
||||
if ($subscription.enabled -and $subscription.policy.updateFrequency -like 'everyBuild' -and $subscription.channel.id -eq $ChannelId) {
|
||||
Write-Host "Should trigger this subscription: $subscription.id"
|
||||
[void]$subscriptionsToTrigger.Add($subscription.id)
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($subscriptionToTrigger in $subscriptionsToTrigger) {
|
||||
try {
|
||||
Write-Host "Triggering subscription '$subscriptionToTrigger'."
|
||||
|
||||
Trigger-Subscription -SubscriptionId $subscriptionToTrigger
|
||||
|
||||
Write-Host "done."
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-Host "There was an error while triggering subscription '$subscriptionToTrigger'"
|
||||
Write-Host $_
|
||||
Write-Host $_.ScriptStackTrace
|
||||
$failedTriggeredSubscription = $true
|
||||
}
|
||||
}
|
||||
|
||||
if ($subscriptionsToTrigger.Count -eq 0) {
|
||||
Write-Host "No subscription matched source repo '$normalizedSourceRepo' and channel ID '$ChannelId'."
|
||||
}
|
||||
elseif ($failedTriggeredSubscription) {
|
||||
Write-Host "At least one subscription failed to be triggered..."
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
else {
|
||||
Write-Host "All subscriptions were triggered successfully!"
|
||||
}
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][string] $SourceRepo,
|
||||
[Parameter(Mandatory=$true)][int] $ChannelId,
|
||||
[Parameter(Mandatory=$true)][string] $MaestroApiAccessToken,
|
||||
[Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro-prod.westus2.cloudapp.azure.com',
|
||||
[Parameter(Mandatory=$false)][string] $MaestroApiVersion = '2019-01-16'
|
||||
)
|
||||
|
||||
try {
|
||||
. $PSScriptRoot\post-build-utils.ps1
|
||||
|
||||
# Get all the $SourceRepo subscriptions
|
||||
$normalizedSourceRepo = $SourceRepo.Replace('dnceng@', '')
|
||||
$subscriptions = Get-MaestroSubscriptions -SourceRepository $normalizedSourceRepo -ChannelId $ChannelId
|
||||
|
||||
if (!$subscriptions) {
|
||||
Write-PipelineTelemetryError -Category 'TriggerSubscriptions' -Message "No subscriptions found for source repo '$normalizedSourceRepo' in channel '$ChannelId'"
|
||||
ExitWithExitCode 0
|
||||
}
|
||||
|
||||
$subscriptionsToTrigger = New-Object System.Collections.Generic.List[string]
|
||||
$failedTriggeredSubscription = $false
|
||||
|
||||
# Get all enabled subscriptions that need dependency flow on 'everyBuild'
|
||||
foreach ($subscription in $subscriptions) {
|
||||
if ($subscription.enabled -and $subscription.policy.updateFrequency -like 'everyBuild' -and $subscription.channel.id -eq $ChannelId) {
|
||||
Write-Host "Should trigger this subscription: ${$subscription.id}"
|
||||
[void]$subscriptionsToTrigger.Add($subscription.id)
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($subscriptionToTrigger in $subscriptionsToTrigger) {
|
||||
try {
|
||||
Write-Host "Triggering subscription '$subscriptionToTrigger'."
|
||||
|
||||
Trigger-Subscription -SubscriptionId $subscriptionToTrigger
|
||||
|
||||
Write-Host 'done.'
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-Host "There was an error while triggering subscription '$subscriptionToTrigger'"
|
||||
Write-Host $_
|
||||
Write-Host $_.ScriptStackTrace
|
||||
$failedTriggeredSubscription = $true
|
||||
}
|
||||
}
|
||||
|
||||
if ($subscriptionsToTrigger.Count -eq 0) {
|
||||
Write-Host "No subscription matched source repo '$normalizedSourceRepo' and channel ID '$ChannelId'."
|
||||
}
|
||||
elseif ($failedTriggeredSubscription) {
|
||||
Write-PipelineTelemetryError -Category 'TriggerSubscriptions' -Message 'At least one subscription failed to be triggered...'
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
else {
|
||||
Write-Host 'All subscriptions were triggered successfully!'
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'TriggerSubscriptions' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
|
||||
Param(
|
||||
[Parameter(Mandatory=$true)][int] $buildId,
|
||||
[Parameter(Mandatory=$true)][string] $azdoOrgUri,
|
||||
[Parameter(Mandatory=$true)][string] $azdoProject,
|
||||
[Parameter(Mandatory=$true)][string] $token
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
function Get-AzDOHeaders(
|
||||
[string] $token)
|
||||
{
|
||||
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":${token}"))
|
||||
$headers = @{"Authorization"="Basic $base64AuthInfo"}
|
||||
return $headers
|
||||
}
|
||||
|
||||
function Update-BuildRetention(
|
||||
[string] $azdoOrgUri,
|
||||
[string] $azdoProject,
|
||||
[int] $buildId,
|
||||
[string] $token)
|
||||
{
|
||||
$headers = Get-AzDOHeaders -token $token
|
||||
$requestBody = "{
|
||||
`"keepForever`": `"true`"
|
||||
}"
|
||||
|
||||
$requestUri = "${azdoOrgUri}/${azdoProject}/_apis/build/builds/${buildId}?api-version=6.0"
|
||||
write-Host "Attempting to retain build using the following URI: ${requestUri} ..."
|
||||
|
||||
try {
|
||||
Invoke-RestMethod -Uri $requestUri -Method Patch -Body $requestBody -Header $headers -contentType "application/json"
|
||||
Write-Host "Updated retention settings for build ${buildId}."
|
||||
}
|
||||
catch {
|
||||
Write-Error "Failed to update retention settings for build: $_.Exception.Response.StatusDescription"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
Update-BuildRetention -azdoOrgUri $azdoOrgUri -azdoProject $azdoProject -buildId $buildId -token $token
|
||||
exit 0
|
|
@ -1,8 +1,8 @@
|
|||
[CmdletBinding(PositionalBinding=$false)]
|
||||
Param(
|
||||
[string] $configuration = "Debug",
|
||||
[string] $configuration = 'Debug',
|
||||
[string] $task,
|
||||
[string] $verbosity = "minimal",
|
||||
[string] $verbosity = 'minimal',
|
||||
[string] $msbuildEngine = $null,
|
||||
[switch] $restore,
|
||||
[switch] $prepareMachine,
|
||||
|
@ -32,9 +32,9 @@ function Print-Usage() {
|
|||
}
|
||||
|
||||
function Build([string]$target) {
|
||||
$logSuffix = if ($target -eq "Execute") { "" } else { ".$target" }
|
||||
$logSuffix = if ($target -eq 'Execute') { '' } else { ".$target" }
|
||||
$log = Join-Path $LogDir "$task$logSuffix.binlog"
|
||||
$outputPath = Join-Path $ToolsetDir "$task\\"
|
||||
$outputPath = Join-Path $ToolsetDir "$task\"
|
||||
|
||||
MSBuild $taskProject `
|
||||
/bl:$log `
|
||||
|
@ -42,37 +42,55 @@ function Build([string]$target) {
|
|||
/p:Configuration=$configuration `
|
||||
/p:RepoRoot=$RepoRoot `
|
||||
/p:BaseIntermediateOutputPath=$outputPath `
|
||||
/v:$verbosity `
|
||||
@properties
|
||||
}
|
||||
|
||||
try {
|
||||
if ($help -or (($null -ne $properties) -and ($properties.Contains("/help") -or $properties.Contains("/?")))) {
|
||||
if ($help -or (($null -ne $properties) -and ($properties.Contains('/help') -or $properties.Contains('/?')))) {
|
||||
Print-Usage
|
||||
exit 0
|
||||
}
|
||||
|
||||
if ($task -eq "") {
|
||||
Write-Host "Missing required parameter '-task <value>'" -ForegroundColor Red
|
||||
Write-PipelineTelemetryError -Category 'Build' -Message "Missing required parameter '-task <value>'"
|
||||
Print-Usage
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
if( $msbuildEngine -eq "vs") {
|
||||
# Ensure desktop MSBuild is available for sdk tasks.
|
||||
if( -not ($GlobalJson.tools.PSObject.Properties.Name -contains "vs" )) {
|
||||
$GlobalJson.tools | Add-Member -Name "vs" -Value (ConvertFrom-Json "{ `"version`": `"16.5`" }") -MemberType NoteProperty
|
||||
}
|
||||
if( -not ($GlobalJson.tools.PSObject.Properties.Name -match "xcopy-msbuild" )) {
|
||||
$GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "16.10.0-preview2" -MemberType NoteProperty
|
||||
}
|
||||
if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") {
|
||||
$xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true
|
||||
}
|
||||
if ($xcopyMSBuildToolsFolder -eq $null) {
|
||||
throw 'Unable to get xcopy downloadable version of msbuild'
|
||||
}
|
||||
|
||||
$global:_MSBuildExe = "$($xcopyMSBuildToolsFolder)\MSBuild\Current\Bin\MSBuild.exe"
|
||||
}
|
||||
|
||||
$taskProject = GetSdkTaskProject $task
|
||||
if (!(Test-Path $taskProject)) {
|
||||
Write-Host "Unknown task: $task" -ForegroundColor Red
|
||||
Write-PipelineTelemetryError -Category 'Build' -Message "Unknown task: $task"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
if ($restore) {
|
||||
Build "Restore"
|
||||
Build 'Restore'
|
||||
}
|
||||
|
||||
Build "Execute"
|
||||
Build 'Execute'
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Category 'Build' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<solution>
|
||||
<add key="disableSourceControlIntegration" value="true" />
|
||||
</solution>
|
||||
<packageSources>
|
||||
<clear />
|
||||
<add key="guardian" value="https://securitytools.pkgs.visualstudio.com/_packaging/Guardian/nuget/v3/index.json" />
|
||||
</packageSources>
|
||||
<disabledPackageSources>
|
||||
<clear />
|
||||
</disabledPackageSources>
|
||||
</configuration>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<solution>
|
||||
<add key="disableSourceControlIntegration" value="true" />
|
||||
</solution>
|
||||
<packageSources>
|
||||
<clear />
|
||||
<add key="guardian" value="https://securitytools.pkgs.visualstudio.com/_packaging/Guardian/nuget/v3/index.json" />
|
||||
</packageSources>
|
||||
<disabledPackageSources>
|
||||
<clear />
|
||||
</disabledPackageSources>
|
||||
</configuration>
|
||||
|
|
|
@ -0,0 +1,116 @@
|
|||
Param(
|
||||
[string] $GuardianCliLocation,
|
||||
[string] $WorkingDirectory,
|
||||
[string] $TargetDirectory,
|
||||
[string] $GdnFolder,
|
||||
# The list of Guardian tools to configure. For each object in the array:
|
||||
# - If the item is a [hashtable], it must contain these entries:
|
||||
# - Name = The tool name as Guardian knows it.
|
||||
# - Scenario = (Optional) Scenario-specific name for this configuration entry. It must be unique
|
||||
# among all tool entries with the same Name.
|
||||
# - Args = (Optional) Array of Guardian tool configuration args, like '@("Target > C:\temp")'
|
||||
# - If the item is a [string] $v, it is treated as '@{ Name="$v" }'
|
||||
[object[]] $ToolsList,
|
||||
[string] $GuardianLoggerLevel='Standard',
|
||||
# Optional: Additional params to add to any tool using CredScan.
|
||||
[string[]] $CrScanAdditionalRunConfigParams,
|
||||
# Optional: Additional params to add to any tool using PoliCheck.
|
||||
[string[]] $PoliCheckAdditionalRunConfigParams,
|
||||
# Optional: Additional params to add to any tool using CodeQL/Semmle.
|
||||
[string[]] $CodeQLAdditionalRunConfigParams
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
Set-StrictMode -Version 2.0
|
||||
$disableConfigureToolsetImport = $true
|
||||
$global:LASTEXITCODE = 0
|
||||
|
||||
try {
|
||||
# `tools.ps1` checks $ci to perform some actions. Since the SDL
|
||||
# scripts don't necessarily execute in the same agent that run the
|
||||
# build.ps1/sh script this variable isn't automatically set.
|
||||
$ci = $true
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
# Normalize tools list: all in [hashtable] form with defined values for each key.
|
||||
$ToolsList = $ToolsList |
|
||||
ForEach-Object {
|
||||
if ($_ -is [string]) {
|
||||
$_ = @{ Name = $_ }
|
||||
}
|
||||
|
||||
if (-not ($_['Scenario'])) { $_.Scenario = "" }
|
||||
if (-not ($_['Args'])) { $_.Args = @() }
|
||||
$_
|
||||
}
|
||||
|
||||
Write-Host "List of tools to configure:"
|
||||
$ToolsList | ForEach-Object { $_ | Out-String | Write-Host }
|
||||
|
||||
# We store config files in the r directory of .gdn
|
||||
$gdnConfigPath = Join-Path $GdnFolder 'r'
|
||||
$ValidPath = Test-Path $GuardianCliLocation
|
||||
|
||||
if ($ValidPath -eq $False)
|
||||
{
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Invalid Guardian CLI Location."
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
foreach ($tool in $ToolsList) {
|
||||
# Put together the name and scenario to make a unique key.
|
||||
$toolConfigName = $tool.Name
|
||||
if ($tool.Scenario) {
|
||||
$toolConfigName += "_" + $tool.Scenario
|
||||
}
|
||||
|
||||
Write-Host "=== Configuring $toolConfigName..."
|
||||
|
||||
$gdnConfigFile = Join-Path $gdnConfigPath "$toolConfigName-configure.gdnconfig"
|
||||
|
||||
# For some tools, add default and automatic args.
|
||||
if ($tool.Name -eq 'credscan') {
|
||||
if ($targetDirectory) {
|
||||
$tool.Args += "`"TargetDirectory < $TargetDirectory`""
|
||||
}
|
||||
$tool.Args += "`"OutputType < pre`""
|
||||
$tool.Args += $CrScanAdditionalRunConfigParams
|
||||
} elseif ($tool.Name -eq 'policheck') {
|
||||
if ($targetDirectory) {
|
||||
$tool.Args += "`"Target < $TargetDirectory`""
|
||||
}
|
||||
$tool.Args += $PoliCheckAdditionalRunConfigParams
|
||||
} elseif ($tool.Name -eq 'semmle' -or $tool.Name -eq 'codeql') {
|
||||
if ($targetDirectory) {
|
||||
$tool.Args += "`"SourceCodeDirectory < $TargetDirectory`""
|
||||
}
|
||||
$tool.Args += $CodeQLAdditionalRunConfigParams
|
||||
}
|
||||
|
||||
# Create variable pointing to the args array directly so we can use splat syntax later.
|
||||
$toolArgs = $tool.Args
|
||||
|
||||
# Configure the tool. If args array is provided or the current tool has some default arguments
|
||||
# defined, add "--args" and splat each element on the end. Arg format is "{Arg id} < {Value}",
|
||||
# one per parameter. Doc page for "guardian configure":
|
||||
# https://dev.azure.com/securitytools/SecurityIntegration/_wiki/wikis/Guardian/1395/configure
|
||||
Exec-BlockVerbosely {
|
||||
& $GuardianCliLocation configure `
|
||||
--working-directory $WorkingDirectory `
|
||||
--tool $tool.Name `
|
||||
--output-path $gdnConfigFile `
|
||||
--logger-level $GuardianLoggerLevel `
|
||||
--noninteractive `
|
||||
--force `
|
||||
$(if ($toolArgs) { "--args" }) @toolArgs
|
||||
Exit-IfNZEC "Sdl"
|
||||
}
|
||||
|
||||
Write-Host "Created '$toolConfigName' configuration file: $gdnConfigFile"
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
|
@ -1,100 +1,165 @@
|
|||
Param(
|
||||
[string] $GuardianPackageName, # Required: the name of guardian CLI package (not needed if GuardianCliLocation is specified)
|
||||
[string] $NugetPackageDirectory, # Required: directory where NuGet packages are installed (not needed if GuardianCliLocation is specified)
|
||||
[string] $GuardianCliLocation, # Optional: Direct location of Guardian CLI executable if GuardianPackageName & NugetPackageDirectory are not specified
|
||||
[string] $Repository=$env:BUILD_REPOSITORY_NAME, # Required: the name of the repository (e.g. dotnet/arcade)
|
||||
[string] $BranchName=$env:BUILD_SOURCEBRANCH, # Optional: name of branch or version of gdn settings; defaults to master
|
||||
[string] $SourceDirectory=$env:BUILD_SOURCESDIRECTORY, # Required: the directory where source files are located
|
||||
[string] $ArtifactsDirectory = (Join-Path $env:BUILD_SOURCESDIRECTORY ("artifacts")), # Required: the directory where build artifacts are located
|
||||
[string] $AzureDevOpsAccessToken, # Required: access token for dnceng; should be provided via KeyVault
|
||||
[string[]] $SourceToolsList, # Optional: list of SDL tools to run on source code
|
||||
[string[]] $ArtifactToolsList, # Optional: list of SDL tools to run on built artifacts
|
||||
[bool] $TsaPublish=$False, # Optional: true will publish results to TSA; only set to true after onboarding to TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaBranchName=$env:BUILD_SOURCEBRANCH, # Optional: required for TSA publish; defaults to $(Build.SourceBranchName); TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaRepositoryName=$env:BUILD_REPOSITORY_NAME, # Optional: TSA repository name; will be generated automatically if not submitted; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $BuildNumber=$env:BUILD_BUILDNUMBER, # Optional: required for TSA publish; defaults to $(Build.BuildNumber)
|
||||
[bool] $UpdateBaseline=$False, # Optional: if true, will update the baseline in the repository; should only be run after fixing any issues which need to be fixed
|
||||
[bool] $TsaOnboard=$False, # Optional: if true, will onboard the repository to TSA; should only be run once; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaInstanceUrl, # Optional: only needed if TsaOnboard or TsaPublish is true; the instance-url registered with TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaCodebaseName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the codebase registered with TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaProjectName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the project registered with TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaNotificationEmail, # Optional: only needed if TsaOnboard is true; the email(s) which will receive notifications of TSA bug filings (e.g. alias@microsoft.com); TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaCodebaseAdmin, # Optional: only needed if TsaOnboard is true; the aliases which are admins of the TSA codebase (e.g. DOMAIN\alias); TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaBugAreaPath, # Optional: only needed if TsaOnboard is true; the area path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaIterationPath, # Optional: only needed if TsaOnboard is true; the iteration path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $GuardianLoggerLevel="Standard", # Optional: the logger level for the Guardian CLI; options are Trace, Verbose, Standard, Warning, and Error
|
||||
[string[]] $CrScanAdditionalRunConfigParams, # Optional: Additional Params to custom build a CredScan run config in the format @("xyz:abc","sdf:1")
|
||||
[string[]] $PoliCheckAdditionalRunConfigParams # Optional: Additional Params to custom build a Policheck run config in the format @("xyz:abc","sdf:1")
|
||||
[string] $GuardianPackageName, # Required: the name of guardian CLI package (not needed if GuardianCliLocation is specified)
|
||||
[string] $NugetPackageDirectory, # Required: directory where NuGet packages are installed (not needed if GuardianCliLocation is specified)
|
||||
[string] $GuardianCliLocation, # Optional: Direct location of Guardian CLI executable if GuardianPackageName & NugetPackageDirectory are not specified
|
||||
[string] $Repository=$env:BUILD_REPOSITORY_NAME, # Required: the name of the repository (e.g. dotnet/arcade)
|
||||
[string] $BranchName=$env:BUILD_SOURCEBRANCH, # Optional: name of branch or version of gdn settings; defaults to master
|
||||
[string] $SourceDirectory=$env:BUILD_SOURCESDIRECTORY, # Required: the directory where source files are located
|
||||
[string] $ArtifactsDirectory = (Join-Path $env:BUILD_ARTIFACTSTAGINGDIRECTORY ('artifacts')), # Required: the directory where build artifacts are located
|
||||
[string] $AzureDevOpsAccessToken, # Required: access token for dnceng; should be provided via KeyVault
|
||||
|
||||
# Optional: list of SDL tools to run on source code. See 'configure-sdl-tool.ps1' for tools list
|
||||
# format.
|
||||
[object[]] $SourceToolsList,
|
||||
# Optional: list of SDL tools to run on built artifacts. See 'configure-sdl-tool.ps1' for tools
|
||||
# list format.
|
||||
[object[]] $ArtifactToolsList,
|
||||
# Optional: list of SDL tools to run without automatically specifying a target directory. See
|
||||
# 'configure-sdl-tool.ps1' for tools list format.
|
||||
[object[]] $CustomToolsList,
|
||||
|
||||
[bool] $TsaPublish=$False, # Optional: true will publish results to TSA; only set to true after onboarding to TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaBranchName=$env:BUILD_SOURCEBRANCH, # Optional: required for TSA publish; defaults to $(Build.SourceBranchName); TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaRepositoryName=$env:BUILD_REPOSITORY_NAME, # Optional: TSA repository name; will be generated automatically if not submitted; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $BuildNumber=$env:BUILD_BUILDNUMBER, # Optional: required for TSA publish; defaults to $(Build.BuildNumber)
|
||||
[bool] $UpdateBaseline=$False, # Optional: if true, will update the baseline in the repository; should only be run after fixing any issues which need to be fixed
|
||||
[bool] $TsaOnboard=$False, # Optional: if true, will onboard the repository to TSA; should only be run once; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaInstanceUrl, # Optional: only needed if TsaOnboard or TsaPublish is true; the instance-url registered with TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaCodebaseName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the codebase registered with TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaProjectName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the project registered with TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaNotificationEmail, # Optional: only needed if TsaOnboard is true; the email(s) which will receive notifications of TSA bug filings (e.g. alias@microsoft.com); TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaCodebaseAdmin, # Optional: only needed if TsaOnboard is true; the aliases which are admins of the TSA codebase (e.g. DOMAIN\alias); TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaBugAreaPath, # Optional: only needed if TsaOnboard is true; the area path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaIterationPath, # Optional: only needed if TsaOnboard is true; the iteration path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $GuardianLoggerLevel='Standard', # Optional: the logger level for the Guardian CLI; options are Trace, Verbose, Standard, Warning, and Error
|
||||
[string[]] $CrScanAdditionalRunConfigParams, # Optional: Additional Params to custom build a CredScan run config in the format @("xyz:abc","sdf:1")
|
||||
[string[]] $PoliCheckAdditionalRunConfigParams, # Optional: Additional Params to custom build a Policheck run config in the format @("xyz:abc","sdf:1")
|
||||
[string[]] $CodeQLAdditionalRunConfigParams, # Optional: Additional Params to custom build a Semmle/CodeQL run config in the format @("xyz < abc","sdf < 1")
|
||||
[bool] $BreakOnFailure=$False # Optional: Fail the build if there were errors during the run
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
$LASTEXITCODE = 0
|
||||
try {
|
||||
$ErrorActionPreference = 'Stop'
|
||||
Set-StrictMode -Version 2.0
|
||||
$disableConfigureToolsetImport = $true
|
||||
$global:LASTEXITCODE = 0
|
||||
|
||||
#Replace repo names to the format of org/repo
|
||||
if (!($Repository.contains('/'))) {
|
||||
$RepoName = $Repository -replace '(.*?)-(.*)', '$1/$2';
|
||||
# `tools.ps1` checks $ci to perform some actions. Since the SDL
|
||||
# scripts don't necessarily execute in the same agent that run the
|
||||
# build.ps1/sh script this variable isn't automatically set.
|
||||
$ci = $true
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
#Replace repo names to the format of org/repo
|
||||
if (!($Repository.contains('/'))) {
|
||||
$RepoName = $Repository -replace '(.*?)-(.*)', '$1/$2';
|
||||
}
|
||||
else{
|
||||
$RepoName = $Repository;
|
||||
}
|
||||
|
||||
if ($GuardianPackageName) {
|
||||
$guardianCliLocation = Join-Path $NugetPackageDirectory (Join-Path $GuardianPackageName (Join-Path 'tools' 'guardian.cmd'))
|
||||
} else {
|
||||
$guardianCliLocation = $GuardianCliLocation
|
||||
}
|
||||
|
||||
$workingDirectory = (Split-Path $SourceDirectory -Parent)
|
||||
$ValidPath = Test-Path $guardianCliLocation
|
||||
|
||||
if ($ValidPath -eq $False)
|
||||
{
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message 'Invalid Guardian CLI Location.'
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
Exec-BlockVerbosely {
|
||||
& $(Join-Path $PSScriptRoot 'init-sdl.ps1') -GuardianCliLocation $guardianCliLocation -Repository $RepoName -BranchName $BranchName -WorkingDirectory $workingDirectory -AzureDevOpsAccessToken $AzureDevOpsAccessToken -GuardianLoggerLevel $GuardianLoggerLevel
|
||||
}
|
||||
$gdnFolder = Join-Path $workingDirectory '.gdn'
|
||||
|
||||
if ($TsaOnboard) {
|
||||
if ($TsaCodebaseName -and $TsaNotificationEmail -and $TsaCodebaseAdmin -and $TsaBugAreaPath) {
|
||||
Exec-BlockVerbosely {
|
||||
& $guardianCliLocation tsa-onboard --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel
|
||||
}
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian tsa-onboard failed with exit code $LASTEXITCODE."
|
||||
ExitWithExitCode $LASTEXITCODE
|
||||
}
|
||||
} else {
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message 'Could not onboard to TSA -- not all required values ($TsaCodebaseName, $TsaNotificationEmail, $TsaCodebaseAdmin, $TsaBugAreaPath) were specified.'
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
|
||||
# Configure a list of tools with a default target directory. Populates the ".gdn/r" directory.
|
||||
function Configure-ToolsList([object[]] $tools, [string] $targetDirectory) {
|
||||
if ($tools -and $tools.Count -gt 0) {
|
||||
Exec-BlockVerbosely {
|
||||
& $(Join-Path $PSScriptRoot 'configure-sdl-tool.ps1') `
|
||||
-GuardianCliLocation $guardianCliLocation `
|
||||
-WorkingDirectory $workingDirectory `
|
||||
-TargetDirectory $targetDirectory `
|
||||
-GdnFolder $gdnFolder `
|
||||
-ToolsList $tools `
|
||||
-AzureDevOpsAccessToken $AzureDevOpsAccessToken `
|
||||
-GuardianLoggerLevel $GuardianLoggerLevel `
|
||||
-CrScanAdditionalRunConfigParams $CrScanAdditionalRunConfigParams `
|
||||
-PoliCheckAdditionalRunConfigParams $PoliCheckAdditionalRunConfigParams `
|
||||
-CodeQLAdditionalRunConfigParams $CodeQLAdditionalRunConfigParams
|
||||
if ($BreakOnFailure) {
|
||||
Exit-IfNZEC "Sdl"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Configure Artifact and Source tools with default Target directories.
|
||||
Configure-ToolsList $ArtifactToolsList $ArtifactsDirectory
|
||||
Configure-ToolsList $SourceToolsList $SourceDirectory
|
||||
# Configure custom tools with no default Target directory.
|
||||
Configure-ToolsList $CustomToolsList $null
|
||||
|
||||
# At this point, all tools are configured in the ".gdn" directory. Run them all in a single call.
|
||||
# (If we used "run" multiple times, each run would overwrite data from earlier runs.)
|
||||
Exec-BlockVerbosely {
|
||||
& $(Join-Path $PSScriptRoot 'run-sdl.ps1') `
|
||||
-GuardianCliLocation $guardianCliLocation `
|
||||
-WorkingDirectory $SourceDirectory `
|
||||
-UpdateBaseline $UpdateBaseline `
|
||||
-GdnFolder $gdnFolder
|
||||
}
|
||||
|
||||
if ($TsaPublish) {
|
||||
if ($TsaBranchName -and $BuildNumber) {
|
||||
if (-not $TsaRepositoryName) {
|
||||
$TsaRepositoryName = "$($Repository)-$($BranchName)"
|
||||
}
|
||||
Exec-BlockVerbosely {
|
||||
& $guardianCliLocation tsa-publish --all-tools --repository-name "$TsaRepositoryName" --branch-name "$TsaBranchName" --build-number "$BuildNumber" --onboard $True --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel
|
||||
}
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian tsa-publish failed with exit code $LASTEXITCODE."
|
||||
ExitWithExitCode $LASTEXITCODE
|
||||
}
|
||||
} else {
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message 'Could not publish to TSA -- not all required values ($TsaBranchName, $BuildNumber) were specified.'
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
|
||||
if ($BreakOnFailure) {
|
||||
Write-Host "Failing the build in case of breaking results..."
|
||||
Exec-BlockVerbosely {
|
||||
& $guardianCliLocation break --working-directory $workingDirectory --logger-level $GuardianLoggerLevel
|
||||
}
|
||||
} else {
|
||||
Write-Host "Letting the build pass even if there were breaking results..."
|
||||
}
|
||||
}
|
||||
else{
|
||||
$RepoName = $Repository;
|
||||
}
|
||||
|
||||
if ($GuardianPackageName) {
|
||||
$guardianCliLocation = Join-Path $NugetPackageDirectory (Join-Path $GuardianPackageName (Join-Path "tools" "guardian.cmd"))
|
||||
} else {
|
||||
$guardianCliLocation = $GuardianCliLocation
|
||||
}
|
||||
|
||||
$workingDirectory = (Split-Path $SourceDirectory -Parent)
|
||||
$ValidPath = Test-Path $guardianCliLocation
|
||||
|
||||
if ($ValidPath -eq $False)
|
||||
{
|
||||
Write-Host "Invalid Guardian CLI Location."
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_
|
||||
exit 1
|
||||
}
|
||||
|
||||
& $(Join-Path $PSScriptRoot "init-sdl.ps1") -GuardianCliLocation $guardianCliLocation -Repository $RepoName -BranchName $BranchName -WorkingDirectory $workingDirectory -AzureDevOpsAccessToken $AzureDevOpsAccessToken -GuardianLoggerLevel $GuardianLoggerLevel
|
||||
$gdnFolder = Join-Path $workingDirectory ".gdn"
|
||||
|
||||
if ($TsaOnboard) {
|
||||
if ($TsaCodebaseName -and $TsaNotificationEmail -and $TsaCodebaseAdmin -and $TsaBugAreaPath) {
|
||||
Write-Host "$guardianCliLocation tsa-onboard --codebase-name `"$TsaCodebaseName`" --notification-alias `"$TsaNotificationEmail`" --codebase-admin `"$TsaCodebaseAdmin`" --instance-url `"$TsaInstanceUrl`" --project-name `"$TsaProjectName`" --area-path `"$TsaBugAreaPath`" --iteration-path `"$TsaIterationPath`" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel"
|
||||
& $guardianCliLocation tsa-onboard --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Guardian tsa-onboard failed with exit code $LASTEXITCODE."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
} else {
|
||||
Write-Host "Could not onboard to TSA -- not all required values ($$TsaCodebaseName, $$TsaNotificationEmail, $$TsaCodebaseAdmin, $$TsaBugAreaPath) were specified."
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
if ($ArtifactToolsList -and $ArtifactToolsList.Count -gt 0) {
|
||||
& $(Join-Path $PSScriptRoot "run-sdl.ps1") -GuardianCliLocation $guardianCliLocation -WorkingDirectory $workingDirectory -TargetDirectory $ArtifactsDirectory -GdnFolder $gdnFolder -ToolsList $ArtifactToolsList -AzureDevOpsAccessToken $AzureDevOpsAccessToken -UpdateBaseline $UpdateBaseline -GuardianLoggerLevel $GuardianLoggerLevel -CrScanAdditionalRunConfigParams $CrScanAdditionalRunConfigParams -PoliCheckAdditionalRunConfigParams $PoliCheckAdditionalRunConfigParams
|
||||
}
|
||||
if ($SourceToolsList -and $SourceToolsList.Count -gt 0) {
|
||||
& $(Join-Path $PSScriptRoot "run-sdl.ps1") -GuardianCliLocation $guardianCliLocation -WorkingDirectory $workingDirectory -TargetDirectory $SourceDirectory -GdnFolder $gdnFolder -ToolsList $SourceToolsList -AzureDevOpsAccessToken $AzureDevOpsAccessToken -UpdateBaseline $UpdateBaseline -GuardianLoggerLevel $GuardianLoggerLevel -CrScanAdditionalRunConfigParams $CrScanAdditionalRunConfigParams -PoliCheckAdditionalRunConfigParams $PoliCheckAdditionalRunConfigParams
|
||||
}
|
||||
|
||||
if ($UpdateBaseline) {
|
||||
& (Join-Path $PSScriptRoot "push-gdn.ps1") -Repository $RepoName -BranchName $BranchName -GdnFolder $GdnFolder -AzureDevOpsAccessToken $AzureDevOpsAccessToken -PushReason "Update baseline"
|
||||
}
|
||||
|
||||
if ($TsaPublish) {
|
||||
if ($TsaBranchName -and $BuildNumber) {
|
||||
if (-not $TsaRepositoryName) {
|
||||
$TsaRepositoryName = "$($Repository)-$($BranchName)"
|
||||
}
|
||||
Write-Host "$guardianCliLocation tsa-publish --all-tools --repository-name `"$TsaRepositoryName`" --branch-name `"$TsaBranchName`" --build-number `"$BuildNumber`" --codebase-name `"$TsaCodebaseName`" --notification-alias `"$TsaNotificationEmail`" --codebase-admin `"$TsaCodebaseAdmin`" --instance-url `"$TsaInstanceUrl`" --project-name `"$TsaProjectName`" --area-path `"$TsaBugAreaPath`" --iteration-path `"$TsaIterationPath`" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel"
|
||||
& $guardianCliLocation tsa-publish --all-tools --repository-name "$TsaRepositoryName" --branch-name "$TsaBranchName" --build-number "$BuildNumber" --onboard $True --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Guardian tsa-publish failed with exit code $LASTEXITCODE."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
} else {
|
||||
Write-Host "Could not publish to TSA -- not all required values ($$TsaBranchName, $$BuildNumber) were specified."
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
# This script looks for each archive file in a directory and extracts it into the target directory.
|
||||
# For example, the file "$InputPath/bin.tar.gz" extracts to "$ExtractPath/bin.tar.gz.extracted/**".
|
||||
# Uses the "tar" utility added to Windows 10 / Windows 2019 that supports tar.gz and zip.
|
||||
param(
|
||||
# Full path to directory where archives are stored.
|
||||
[Parameter(Mandatory=$true)][string] $InputPath,
|
||||
# Full path to directory to extract archives into. May be the same as $InputPath.
|
||||
[Parameter(Mandatory=$true)][string] $ExtractPath
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
$disableConfigureToolsetImport = $true
|
||||
|
||||
try {
|
||||
# `tools.ps1` checks $ci to perform some actions. Since the SDL
|
||||
# scripts don't necessarily execute in the same agent that run the
|
||||
# build.ps1/sh script this variable isn't automatically set.
|
||||
$ci = $true
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
Measure-Command {
|
||||
$jobs = @()
|
||||
|
||||
# Find archive files for non-Windows and Windows builds.
|
||||
$archiveFiles = @(
|
||||
Get-ChildItem (Join-Path $InputPath "*.tar.gz")
|
||||
Get-ChildItem (Join-Path $InputPath "*.zip")
|
||||
)
|
||||
|
||||
foreach ($targzFile in $archiveFiles) {
|
||||
$jobs += Start-Job -ScriptBlock {
|
||||
$file = $using:targzFile
|
||||
$fileName = [System.IO.Path]::GetFileName($file)
|
||||
$extractDir = Join-Path $using:ExtractPath "$fileName.extracted"
|
||||
|
||||
New-Item $extractDir -ItemType Directory -Force | Out-Null
|
||||
|
||||
Write-Host "Extracting '$file' to '$extractDir'..."
|
||||
|
||||
# Pipe errors to stdout to prevent PowerShell detecting them and quitting the job early.
|
||||
# This type of quit skips the catch, so we wouldn't be able to tell which file triggered the
|
||||
# error. Save output so it can be stored in the exception string along with context.
|
||||
$output = tar -xf $file -C $extractDir 2>&1
|
||||
# Handle NZEC manually rather than using Exit-IfNZEC: we are in a background job, so we
|
||||
# don't have access to the outer scope.
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "Error extracting '$file': non-zero exit code ($LASTEXITCODE). Output: '$output'"
|
||||
}
|
||||
|
||||
Write-Host "Extracted to $extractDir"
|
||||
}
|
||||
}
|
||||
|
||||
Receive-Job $jobs -Wait
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
|
@ -1,77 +1,80 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where artifact packages are stored
|
||||
[Parameter(Mandatory=$true)][string] $ExtractPath # Full path to directory where the packages will be extracted
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
# `tools.ps1` checks $ci to perform some actions. Since the post-build
|
||||
# scripts don't necessarily execute in the same agent that run the
|
||||
# build.ps1/sh script this variable isn't automatically set.
|
||||
$ci = $true
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
$ExtractPackage = {
|
||||
param(
|
||||
[string] $PackagePath # Full path to a NuGet package
|
||||
)
|
||||
|
||||
if (!(Test-Path $PackagePath)) {
|
||||
Write-PipelineTaskError "Input file does not exist: $PackagePath"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
$RelevantExtensions = @(".dll", ".exe", ".pdb")
|
||||
Write-Host -NoNewLine "Extracting" ([System.IO.Path]::GetFileName($PackagePath)) "... "
|
||||
|
||||
$PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath)
|
||||
$ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageId
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
[System.IO.Directory]::CreateDirectory($ExtractPath);
|
||||
|
||||
try {
|
||||
$zip = [System.IO.Compression.ZipFile]::OpenRead($PackagePath)
|
||||
|
||||
$zip.Entries |
|
||||
Where-Object {$RelevantExtensions -contains [System.IO.Path]::GetExtension($_.Name)} |
|
||||
ForEach-Object {
|
||||
$TargetFile = Join-Path -Path $ExtractPath -ChildPath $_.Name
|
||||
|
||||
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile, $true)
|
||||
}
|
||||
}
|
||||
catch {
|
||||
|
||||
}
|
||||
finally {
|
||||
$zip.Dispose()
|
||||
}
|
||||
}
|
||||
function ExtractArtifacts {
|
||||
if (!(Test-Path $InputPath)) {
|
||||
Write-Host "Input Path does not exist: $InputPath"
|
||||
ExitWithExitCode 0
|
||||
}
|
||||
$Jobs = @()
|
||||
Get-ChildItem "$InputPath\*.nupkg" |
|
||||
ForEach-Object {
|
||||
$Jobs += Start-Job -ScriptBlock $ExtractPackage -ArgumentList $_.FullName
|
||||
}
|
||||
|
||||
foreach ($Job in $Jobs) {
|
||||
Wait-Job -Id $Job.Id | Receive-Job
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Measure-Command { ExtractArtifacts }
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where artifact packages are stored
|
||||
[Parameter(Mandatory=$true)][string] $ExtractPath # Full path to directory where the packages will be extracted
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
$disableConfigureToolsetImport = $true
|
||||
|
||||
function ExtractArtifacts {
|
||||
if (!(Test-Path $InputPath)) {
|
||||
Write-Host "Input Path does not exist: $InputPath"
|
||||
ExitWithExitCode 0
|
||||
}
|
||||
$Jobs = @()
|
||||
Get-ChildItem "$InputPath\*.nupkg" |
|
||||
ForEach-Object {
|
||||
$Jobs += Start-Job -ScriptBlock $ExtractPackage -ArgumentList $_.FullName
|
||||
}
|
||||
|
||||
foreach ($Job in $Jobs) {
|
||||
Wait-Job -Id $Job.Id | Receive-Job
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
# `tools.ps1` checks $ci to perform some actions. Since the SDL
|
||||
# scripts don't necessarily execute in the same agent that run the
|
||||
# build.ps1/sh script this variable isn't automatically set.
|
||||
$ci = $true
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
$ExtractPackage = {
|
||||
param(
|
||||
[string] $PackagePath # Full path to a NuGet package
|
||||
)
|
||||
|
||||
if (!(Test-Path $PackagePath)) {
|
||||
Write-PipelineTelemetryError -Category 'Build' -Message "Input file does not exist: $PackagePath"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
$RelevantExtensions = @('.dll', '.exe', '.pdb')
|
||||
Write-Host -NoNewLine 'Extracting ' ([System.IO.Path]::GetFileName($PackagePath)) '...'
|
||||
|
||||
$PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath)
|
||||
$ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageId
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
[System.IO.Directory]::CreateDirectory($ExtractPath);
|
||||
|
||||
try {
|
||||
$zip = [System.IO.Compression.ZipFile]::OpenRead($PackagePath)
|
||||
|
||||
$zip.Entries |
|
||||
Where-Object {$RelevantExtensions -contains [System.IO.Path]::GetExtension($_.Name)} |
|
||||
ForEach-Object {
|
||||
$TargetFile = Join-Path -Path $ExtractPath -ChildPath $_.Name
|
||||
|
||||
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile, $true)
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
finally {
|
||||
$zip.Dispose()
|
||||
}
|
||||
}
|
||||
Measure-Command { ExtractArtifacts }
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
|
|
@ -1,51 +1,55 @@
|
|||
Param(
|
||||
[string] $GuardianCliLocation,
|
||||
[string] $Repository,
|
||||
[string] $BranchName="master",
|
||||
[string] $WorkingDirectory,
|
||||
[string] $AzureDevOpsAccessToken,
|
||||
[string] $GuardianLoggerLevel="Standard"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
$LASTEXITCODE = 0
|
||||
|
||||
# Don't display the console progress UI - it's a huge perf hit
|
||||
$ProgressPreference = 'SilentlyContinue'
|
||||
|
||||
# Construct basic auth from AzDO access token; construct URI to the repository's gdn folder stored in that repository; construct location of zip file
|
||||
$encodedPat = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$AzureDevOpsAccessToken"))
|
||||
$escapedRepository = [Uri]::EscapeDataString("/$Repository/$BranchName/.gdn")
|
||||
$uri = "https://dev.azure.com/dnceng/internal/_apis/git/repositories/sdl-tool-cfg/Items?path=$escapedRepository&versionDescriptor[versionOptions]=0&`$format=zip&api-version=5.0-preview.1"
|
||||
$zipFile = "$WorkingDirectory/gdn.zip"
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
$gdnFolder = (Join-Path $WorkingDirectory ".gdn")
|
||||
Try
|
||||
{
|
||||
# We try to download the zip; if the request fails (e.g. the file doesn't exist), we catch it and init guardian instead
|
||||
Write-Host "Downloading gdn folder from internal config repostiory..."
|
||||
Invoke-WebRequest -Headers @{ "Accept"="application/zip"; "Authorization"="Basic $encodedPat" } -Uri $uri -OutFile $zipFile
|
||||
if (Test-Path $gdnFolder) {
|
||||
# Remove the gdn folder if it exists (it shouldn't unless there's too much caching; this is just in case)
|
||||
Remove-Item -Force -Recurse $gdnFolder
|
||||
}
|
||||
[System.IO.Compression.ZipFile]::ExtractToDirectory($zipFile, $WorkingDirectory)
|
||||
Write-Host $gdnFolder
|
||||
} Catch [System.Net.WebException] {
|
||||
# if the folder does not exist, we'll do a guardian init and push it to the remote repository
|
||||
Write-Host "Initializing Guardian..."
|
||||
Write-Host "$GuardianCliLocation init --working-directory $WorkingDirectory --logger-level $GuardianLoggerLevel"
|
||||
& $GuardianCliLocation init --working-directory $WorkingDirectory --logger-level $GuardianLoggerLevel
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Guardian init failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
# We create the mainbaseline so it can be edited later
|
||||
Write-Host "$GuardianCliLocation baseline --working-directory $WorkingDirectory --name mainbaseline"
|
||||
& $GuardianCliLocation baseline --working-directory $WorkingDirectory --name mainbaseline
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Guardian baseline failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
& $(Join-Path $PSScriptRoot "push-gdn.ps1") -Repository $Repository -BranchName $BranchName -GdnFolder $gdnFolder -AzureDevOpsAccessToken $AzureDevOpsAccessToken -PushReason "Initialize gdn folder"
|
||||
}
|
||||
Param(
|
||||
[string] $GuardianCliLocation,
|
||||
[string] $Repository,
|
||||
[string] $BranchName='master',
|
||||
[string] $WorkingDirectory,
|
||||
[string] $AzureDevOpsAccessToken,
|
||||
[string] $GuardianLoggerLevel='Standard'
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
Set-StrictMode -Version 2.0
|
||||
$disableConfigureToolsetImport = $true
|
||||
$global:LASTEXITCODE = 0
|
||||
|
||||
# `tools.ps1` checks $ci to perform some actions. Since the SDL
|
||||
# scripts don't necessarily execute in the same agent that run the
|
||||
# build.ps1/sh script this variable isn't automatically set.
|
||||
$ci = $true
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
# Don't display the console progress UI - it's a huge perf hit
|
||||
$ProgressPreference = 'SilentlyContinue'
|
||||
|
||||
# Construct basic auth from AzDO access token; construct URI to the repository's gdn folder stored in that repository; construct location of zip file
|
||||
$encodedPat = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$AzureDevOpsAccessToken"))
|
||||
$escapedRepository = [Uri]::EscapeDataString("/$Repository/$BranchName/.gdn")
|
||||
$uri = "https://dev.azure.com/dnceng/internal/_apis/git/repositories/sdl-tool-cfg/Items?path=$escapedRepository&versionDescriptor[versionOptions]=0&`$format=zip&api-version=5.0"
|
||||
$zipFile = "$WorkingDirectory/gdn.zip"
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
$gdnFolder = (Join-Path $WorkingDirectory '.gdn')
|
||||
|
||||
try {
|
||||
# if the folder does not exist, we'll do a guardian init and push it to the remote repository
|
||||
Write-Host 'Initializing Guardian...'
|
||||
Write-Host "$GuardianCliLocation init --working-directory $WorkingDirectory --logger-level $GuardianLoggerLevel"
|
||||
& $GuardianCliLocation init --working-directory $WorkingDirectory --logger-level $GuardianLoggerLevel
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-PipelineTelemetryError -Force -Category 'Build' -Message "Guardian init failed with exit code $LASTEXITCODE."
|
||||
ExitWithExitCode $LASTEXITCODE
|
||||
}
|
||||
# We create the mainbaseline so it can be edited later
|
||||
Write-Host "$GuardianCliLocation baseline --working-directory $WorkingDirectory --name mainbaseline"
|
||||
& $GuardianCliLocation baseline --working-directory $WorkingDirectory --name mainbaseline
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-PipelineTelemetryError -Force -Category 'Build' -Message "Guardian baseline failed with exit code $LASTEXITCODE."
|
||||
ExitWithExitCode $LASTEXITCODE
|
||||
}
|
||||
ExitWithExitCode 0
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.Guardian.Cli.win10-x64" version="0.20.1"/>
|
||||
<package id="Microsoft.Guardian.Cli" version="0.109.0"/>
|
||||
</packages>
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
Param(
|
||||
[string] $Repository,
|
||||
[string] $BranchName="master",
|
||||
[string] $GdnFolder,
|
||||
[string] $AzureDevOpsAccessToken,
|
||||
[string] $PushReason
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
$LASTEXITCODE = 0
|
||||
|
||||
# We create the temp directory where we'll store the sdl-config repository
|
||||
$sdlDir = Join-Path $env:TEMP "sdl"
|
||||
if (Test-Path $sdlDir) {
|
||||
Remove-Item -Force -Recurse $sdlDir
|
||||
}
|
||||
|
||||
Write-Host "git clone https://dnceng:`$AzureDevOpsAccessToken@dev.azure.com/dnceng/internal/_git/sdl-tool-cfg $sdlDir"
|
||||
git clone https://dnceng:$AzureDevOpsAccessToken@dev.azure.com/dnceng/internal/_git/sdl-tool-cfg $sdlDir
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Git clone failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
# We copy the .gdn folder from our local run into the git repository so it can be committed
|
||||
$sdlRepositoryFolder = Join-Path (Join-Path (Join-Path $sdlDir $Repository) $BranchName) ".gdn"
|
||||
if (Get-Command Robocopy) {
|
||||
Robocopy /S $GdnFolder $sdlRepositoryFolder
|
||||
} else {
|
||||
rsync -r $GdnFolder $sdlRepositoryFolder
|
||||
}
|
||||
# cd to the sdl-config directory so we can run git there
|
||||
Push-Location $sdlDir
|
||||
# git add . --> git commit --> git push
|
||||
Write-Host "git add ."
|
||||
git add .
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Git add failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
Write-Host "git -c user.email=`"dn-bot@microsoft.com`" -c user.name=`"Dotnet Bot`" commit -m `"$PushReason for $Repository/$BranchName`""
|
||||
git -c user.email="dn-bot@microsoft.com" -c user.name="Dotnet Bot" commit -m "$PushReason for $Repository/$BranchName"
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Git commit failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
Write-Host "git push"
|
||||
git push
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Git push failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
|
||||
# Return to the original directory
|
||||
Pop-Location
|
|
@ -1,59 +1,49 @@
|
|||
Param(
|
||||
[string] $GuardianCliLocation,
|
||||
[string] $WorkingDirectory,
|
||||
[string] $TargetDirectory,
|
||||
[string] $GdnFolder,
|
||||
[string[]] $ToolsList,
|
||||
[string] $UpdateBaseline,
|
||||
[string] $GuardianLoggerLevel="Standard",
|
||||
[string[]] $CrScanAdditionalRunConfigParams,
|
||||
[string[]] $PoliCheckAdditionalRunConfigParams
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
$LASTEXITCODE = 0
|
||||
|
||||
# We store config files in the r directory of .gdn
|
||||
Write-Host $ToolsList
|
||||
$gdnConfigPath = Join-Path $GdnFolder "r"
|
||||
$ValidPath = Test-Path $GuardianCliLocation
|
||||
|
||||
if ($ValidPath -eq $False)
|
||||
{
|
||||
Write-Host "Invalid Guardian CLI Location."
|
||||
exit 1
|
||||
}
|
||||
|
||||
$configParam = @("--config")
|
||||
|
||||
foreach ($tool in $ToolsList) {
|
||||
$gdnConfigFile = Join-Path $gdnConfigPath "$tool-configure.gdnconfig"
|
||||
Write-Host $tool
|
||||
# We have to manually configure tools that run on source to look at the source directory only
|
||||
if ($tool -eq "credscan") {
|
||||
Write-Host "$GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args `" TargetDirectory < $TargetDirectory `" `" OutputType < pre `" $(If ($CrScanAdditionalRunConfigParams) {$CrScanAdditionalRunConfigParams})"
|
||||
& $GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args " TargetDirectory < $TargetDirectory " "OutputType < pre" $(If ($CrScanAdditionalRunConfigParams) {$CrScanAdditionalRunConfigParams})
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Guardian configure for $tool failed with exit code $LASTEXITCODE."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
}
|
||||
if ($tool -eq "policheck") {
|
||||
Write-Host "$GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args `" Target < $TargetDirectory `" $(If ($PoliCheckAdditionalRunConfigParams) {$PoliCheckAdditionalRunConfigParams})"
|
||||
& $GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args " Target < $TargetDirectory " $(If ($PoliCheckAdditionalRunConfigParams) {$PoliCheckAdditionalRunConfigParams})
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Guardian configure for $tool failed with exit code $LASTEXITCODE."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
}
|
||||
|
||||
$configParam+=$gdnConfigFile
|
||||
}
|
||||
|
||||
Write-Host "$GuardianCliLocation run --working-directory $WorkingDirectory --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel $configParam"
|
||||
& $GuardianCliLocation run --working-directory $WorkingDirectory --tool $tool --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel $configParam
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Guardian run for $ToolsList using $configParam failed with exit code $LASTEXITCODE."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
Param(
|
||||
[string] $GuardianCliLocation,
|
||||
[string] $WorkingDirectory,
|
||||
[string] $GdnFolder,
|
||||
[string] $UpdateBaseline,
|
||||
[string] $GuardianLoggerLevel='Standard'
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
Set-StrictMode -Version 2.0
|
||||
$disableConfigureToolsetImport = $true
|
||||
$global:LASTEXITCODE = 0
|
||||
|
||||
try {
|
||||
# `tools.ps1` checks $ci to perform some actions. Since the SDL
|
||||
# scripts don't necessarily execute in the same agent that run the
|
||||
# build.ps1/sh script this variable isn't automatically set.
|
||||
$ci = $true
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
# We store config files in the r directory of .gdn
|
||||
$gdnConfigPath = Join-Path $GdnFolder 'r'
|
||||
$ValidPath = Test-Path $GuardianCliLocation
|
||||
|
||||
if ($ValidPath -eq $False)
|
||||
{
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Invalid Guardian CLI Location."
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
$gdnConfigFiles = Get-ChildItem $gdnConfigPath -Recurse -Include '*.gdnconfig'
|
||||
Write-Host "Discovered Guardian config files:"
|
||||
$gdnConfigFiles | Out-String | Write-Host
|
||||
|
||||
Exec-BlockVerbosely {
|
||||
& $GuardianCliLocation run `
|
||||
--working-directory $WorkingDirectory `
|
||||
--baseline mainbaseline `
|
||||
--update-baseline $UpdateBaseline `
|
||||
--logger-level $GuardianLoggerLevel `
|
||||
--config @gdnConfigFiles
|
||||
Exit-IfNZEC "Sdl"
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
|
|
@ -1,73 +1,131 @@
|
|||
parameters:
|
||||
enable: 'false' # Whether the SDL validation job should execute or not
|
||||
overrideParameters: '' # Optional: to override values for parameters.
|
||||
additionalParameters: '' # Optional: parameters that need user specific values eg: '-SourceToolsList @("abc","def") -ArtifactToolsList @("ghi","jkl")'
|
||||
# Optional: if specified, restore and use this version of Guardian instead of the default.
|
||||
overrideGuardianVersion: ''
|
||||
# Optional: if true, publish the '.gdn' folder as a pipeline artifact. This can help with in-depth
|
||||
# diagnosis of problems with specific tool configurations.
|
||||
publishGuardianDirectoryToPipeline: false
|
||||
# The script to run to execute all SDL tools. Use this if you want to use a script to define SDL
|
||||
# parameters rather than relying on YAML. It may be better to use a local script, because you can
|
||||
# reproduce results locally without piecing together a command based on the YAML.
|
||||
executeAllSdlToolsScript: 'eng/common/sdl/execute-all-sdl-tools.ps1'
|
||||
# There is some sort of bug (has been reported) in Azure DevOps where if this parameter is named
|
||||
# 'continueOnError', the parameter value is not correctly picked up.
|
||||
# This can also be remedied by the caller (post-build.yml) if it does not use a nested parameter
|
||||
sdlContinueOnError: false # optional: determines whether to continue the build if the step errors;
|
||||
# optional: determines if build artifacts should be downloaded.
|
||||
downloadArtifacts: true
|
||||
# optional: determines if this job should search the directory of downloaded artifacts for
|
||||
# 'tar.gz' and 'zip' archive files and extract them before running SDL validation tasks.
|
||||
extractArchiveArtifacts: false
|
||||
dependsOn: '' # Optional: dependencies of the job
|
||||
artifactNames: '' # Optional: patterns supplied to DownloadBuildArtifacts
|
||||
# Usage:
|
||||
# artifactNames:
|
||||
# - 'BlobArtifacts'
|
||||
# - 'Artifacts_Windows_NT_Release'
|
||||
# Optional: download a list of pipeline artifacts. 'downloadArtifacts' controls build artifacts,
|
||||
# not pipeline artifacts, so doesn't affect the use of this parameter.
|
||||
pipelineArtifactNames: []
|
||||
|
||||
jobs:
|
||||
- job: Run_SDL
|
||||
dependsOn: ${{ parameters.dependsOn }}
|
||||
displayName: Run SDL tool
|
||||
condition: eq( ${{ parameters.enable }}, 'true')
|
||||
variables:
|
||||
- group: DotNet-VSTS-Bot
|
||||
- name: AzDOProjectName
|
||||
value: ${{ parameters.AzDOProjectName }}
|
||||
- name: AzDOPipelineId
|
||||
value: ${{ parameters.AzDOPipelineId }}
|
||||
- name: AzDOBuildId
|
||||
value: ${{ parameters.AzDOBuildId }}
|
||||
- template: /eng/common/templates/variables/sdl-variables.yml
|
||||
- name: GuardianVersion
|
||||
value: ${{ coalesce(parameters.overrideGuardianVersion, '$(DefaultGuardianVersion)') }}
|
||||
pool:
|
||||
name: Hosted VS2017
|
||||
# We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
|
||||
${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
|
||||
name: VSEngSS-MicroBuild2022-1ES
|
||||
demands: Cmd
|
||||
# If it's not devdiv, it's dnceng
|
||||
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
|
||||
name: NetCore1ESPool-Internal
|
||||
demands: ImageOverride -equals Build.Server.Amd64.VS2019
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
- ${{ if ne(parameters.artifactNames, '') }}:
|
||||
- ${{ each artifactName in parameters.artifactNames }}:
|
||||
|
||||
- template: /eng/common/templates/post-build/setup-maestro-vars.yml
|
||||
|
||||
- ${{ if ne(parameters.downloadArtifacts, 'false')}}:
|
||||
- ${{ if ne(parameters.artifactNames, '') }}:
|
||||
- ${{ each artifactName in parameters.artifactNames }}:
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Build Artifacts
|
||||
inputs:
|
||||
buildType: specific
|
||||
buildVersionToDownload: specific
|
||||
project: $(AzDOProjectName)
|
||||
pipeline: $(AzDOPipelineId)
|
||||
buildId: $(AzDOBuildId)
|
||||
artifactName: ${{ artifactName }}
|
||||
downloadPath: $(Build.ArtifactStagingDirectory)\artifacts
|
||||
checkDownloadedFiles: true
|
||||
- ${{ if eq(parameters.artifactNames, '') }}:
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Build Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: ${{ artifactName }}
|
||||
buildType: specific
|
||||
buildVersionToDownload: specific
|
||||
project: $(AzDOProjectName)
|
||||
pipeline: $(AzDOPipelineId)
|
||||
buildId: $(AzDOBuildId)
|
||||
downloadType: specific files
|
||||
itemPattern: "**"
|
||||
downloadPath: $(Build.ArtifactStagingDirectory)\artifacts
|
||||
- ${{ if eq(parameters.artifactNames, '') }}:
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Build Artifacts
|
||||
checkDownloadedFiles: true
|
||||
|
||||
- ${{ each artifactName in parameters.pipelineArtifactNames }}:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download Pipeline Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
downloadType: specific files
|
||||
itemPattern: "**"
|
||||
buildType: specific
|
||||
buildVersionToDownload: specific
|
||||
project: $(AzDOProjectName)
|
||||
pipeline: $(AzDOPipelineId)
|
||||
buildId: $(AzDOBuildId)
|
||||
artifactName: ${{ artifactName }}
|
||||
downloadPath: $(Build.ArtifactStagingDirectory)\artifacts
|
||||
checkDownloadedFiles: true
|
||||
|
||||
- powershell: eng/common/sdl/extract-artifact-packages.ps1
|
||||
-InputPath $(Build.SourcesDirectory)\artifacts\BlobArtifacts
|
||||
-ExtractPath $(Build.SourcesDirectory)\artifacts\BlobArtifacts
|
||||
-InputPath $(Build.ArtifactStagingDirectory)\artifacts\BlobArtifacts
|
||||
-ExtractPath $(Build.ArtifactStagingDirectory)\artifacts\BlobArtifacts
|
||||
displayName: Extract Blob Artifacts
|
||||
continueOnError: ${{ parameters.sdlContinueOnError }}
|
||||
|
||||
- powershell: eng/common/sdl/extract-artifact-packages.ps1
|
||||
-InputPath $(Build.SourcesDirectory)\artifacts\PackageArtifacts
|
||||
-ExtractPath $(Build.SourcesDirectory)\artifacts\PackageArtifacts
|
||||
-InputPath $(Build.ArtifactStagingDirectory)\artifacts\PackageArtifacts
|
||||
-ExtractPath $(Build.ArtifactStagingDirectory)\artifacts\PackageArtifacts
|
||||
displayName: Extract Package Artifacts
|
||||
continueOnError: ${{ parameters.sdlContinueOnError }}
|
||||
- task: NuGetToolInstaller@1
|
||||
displayName: 'Install NuGet.exe'
|
||||
- task: NuGetCommand@2
|
||||
displayName: 'Install Guardian'
|
||||
inputs:
|
||||
restoreSolution: $(Build.SourcesDirectory)\eng\common\sdl\packages.config
|
||||
feedsToUse: config
|
||||
nugetConfigPath: $(Build.SourcesDirectory)\eng\common\sdl\NuGet.config
|
||||
externalFeedCredentials: GuardianConnect
|
||||
restoreDirectory: $(Build.SourcesDirectory)\.packages
|
||||
- ${{ if ne(parameters.overrideParameters, '') }}:
|
||||
- powershell: eng/common/sdl/execute-all-sdl-tools.ps1 ${{ parameters.overrideParameters }}
|
||||
displayName: Execute SDL
|
||||
continueOnError: ${{ parameters.sdlContinueOnError }}
|
||||
- ${{ if eq(parameters.overrideParameters, '') }}:
|
||||
- powershell: eng/common/sdl/execute-all-sdl-tools.ps1
|
||||
-GuardianPackageName Microsoft.Guardian.Cli.win10-x64.0.20.1
|
||||
-NugetPackageDirectory $(Build.SourcesDirectory)\.packages
|
||||
-AzureDevOpsAccessToken $(dn-bot-dotnet-build-rw-code-rw)
|
||||
${{ parameters.additionalParameters }}
|
||||
displayName: Execute SDL
|
||||
|
||||
- ${{ if ne(parameters.extractArchiveArtifacts, 'false') }}:
|
||||
- powershell: eng/common/sdl/extract-artifact-archives.ps1
|
||||
-InputPath $(Build.ArtifactStagingDirectory)\artifacts
|
||||
-ExtractPath $(Build.ArtifactStagingDirectory)\artifacts
|
||||
displayName: Extract Archive Artifacts
|
||||
continueOnError: ${{ parameters.sdlContinueOnError }}
|
||||
|
||||
- template: /eng/common/templates/steps/execute-sdl.yml
|
||||
parameters:
|
||||
overrideGuardianVersion: ${{ parameters.overrideGuardianVersion }}
|
||||
executeAllSdlToolsScript: ${{ parameters.executeAllSdlToolsScript }}
|
||||
overrideParameters: ${{ parameters.overrideParameters }}
|
||||
additionalParameters: ${{ parameters.additionalParameters }}
|
||||
publishGuardianDirectoryToPipeline: ${{ parameters.publishGuardianDirectoryToPipeline }}
|
||||
sdlContinueOnError: ${{ parameters.sdlContinueOnError }}
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
parameters:
|
||||
# Optional: dependencies of the job
|
||||
dependsOn: ''
|
||||
|
||||
# Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool
|
||||
pool: {}
|
||||
|
||||
# Optional: Include toolset dependencies in the generated graph files
|
||||
includeToolset: false
|
||||
|
||||
jobs:
|
||||
- job: Generate_Graph_Files
|
||||
|
||||
dependsOn: ${{ parameters.dependsOn }}
|
||||
|
||||
displayName: Generate Graph Files
|
||||
|
||||
pool: ${{ parameters.pool }}
|
||||
|
||||
variables:
|
||||
# Publish-Build-Assets provides: MaestroAccessToken, BotAccount-dotnet-maestro-bot-PAT
|
||||
# DotNet-AllOrgs-Darc-Pats provides: dn-bot-devdiv-dnceng-rw-code-pat
|
||||
- group: Publish-Build-Assets
|
||||
- group: DotNet-AllOrgs-Darc-Pats
|
||||
- name: _GraphArguments
|
||||
value: -gitHubPat $(BotAccount-dotnet-maestro-bot-PAT)
|
||||
-azdoPat $(dn-bot-devdiv-dnceng-rw-code-pat)
|
||||
-barToken $(MaestroAccessToken)
|
||||
-outputFolder '$(Build.StagingDirectory)/GraphFiles/'
|
||||
- ${{ if ne(parameters.includeToolset, 'false') }}:
|
||||
- name: _GraphArguments
|
||||
value: ${{ variables._GraphArguments }} -includeToolset
|
||||
|
||||
steps:
|
||||
- task: PowerShell@2
|
||||
displayName: Generate Graph Files
|
||||
inputs:
|
||||
filePath: eng\common\generate-graph-files.ps1
|
||||
arguments: $(_GraphArguments)
|
||||
continueOnError: true
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish Graph to Artifacts
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.StagingDirectory)/GraphFiles'
|
||||
PublishLocation: Container
|
||||
ArtifactName: GraphFiles
|
||||
continueOnError: true
|
||||
condition: always()
|
|
@ -1,66 +1,40 @@
|
|||
# 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.
|
||||
|
||||
parameters:
|
||||
# Job schema parameters - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job
|
||||
cancelTimeoutInMinutes: ''
|
||||
|
||||
condition: ''
|
||||
|
||||
continueOnError: false
|
||||
|
||||
container: ''
|
||||
|
||||
continueOnError: false
|
||||
dependsOn: ''
|
||||
|
||||
displayName: ''
|
||||
|
||||
steps: []
|
||||
|
||||
pool: ''
|
||||
|
||||
steps: []
|
||||
strategy: ''
|
||||
|
||||
timeoutInMinutes: ''
|
||||
|
||||
variables: []
|
||||
|
||||
workspace: ''
|
||||
|
||||
# Job base template specific parameters
|
||||
# Optional: Enable installing Microbuild plugin
|
||||
# if 'true', these "variables" must be specified in the variables object or as part of the queue matrix
|
||||
# _TeamName - the name of your team
|
||||
# _SignType - 'test' or 'real'
|
||||
# Job base template specific parameters
|
||||
# See schema documentation - https://github.com/dotnet/arcade/blob/master/Documentation/AzureDevOps/TemplateSchema.md
|
||||
artifacts: ''
|
||||
enableMicrobuild: false
|
||||
|
||||
# Optional: Include PublishBuildArtifacts task
|
||||
enablePublishBuildArtifacts: false
|
||||
|
||||
# Optional: Enable publishing to the build asset registry
|
||||
enablePublishBuildAssets: false
|
||||
|
||||
# Optional: Prevent gather/push manifest from executing when using publishing pipelines
|
||||
enablePublishUsingPipelines: false
|
||||
|
||||
# Optional: Include PublishTestResults task
|
||||
enablePublishTestResults: false
|
||||
|
||||
# Optional: enable sending telemetry
|
||||
enableTelemetry: false
|
||||
|
||||
# Optional: define the helix repo for telemetry (example: 'dotnet/arcade')
|
||||
helixRepo: ''
|
||||
|
||||
# Optional: define the helix type for telemetry (example: 'build/product/')
|
||||
helixType: ''
|
||||
|
||||
# Required: name of the job
|
||||
enablePublishUsingPipelines: false
|
||||
disableComponentGovernance: false
|
||||
mergeTestResults: false
|
||||
testRunTitle: ''
|
||||
testResultsFormat: ''
|
||||
name: ''
|
||||
|
||||
# Optional: should run as a public build even in the internal project
|
||||
# if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects.
|
||||
preSteps: []
|
||||
runAsPublic: false
|
||||
|
||||
# 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.
|
||||
# Sbom related params
|
||||
enableSbom: true
|
||||
PackageVersion: 7.0.0
|
||||
BuildDropPath: '$(Build.SourcesDirectory)/artifacts'
|
||||
|
||||
jobs:
|
||||
- job: ${{ parameters.name }}
|
||||
|
@ -93,9 +67,12 @@ jobs:
|
|||
timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
|
||||
|
||||
variables:
|
||||
- ${{ if eq(parameters.enableTelemetry, 'true') }}:
|
||||
- ${{ if ne(parameters.enableTelemetry, 'false') }}:
|
||||
- name: DOTNET_CLI_TELEMETRY_PROFILE
|
||||
value: '$(Build.Repository.Uri)'
|
||||
- ${{ if eq(parameters.enableRichCodeNavigation, 'true') }}:
|
||||
- name: EnableRichCodeNavigation
|
||||
value: 'true'
|
||||
- ${{ each variable in parameters.variables }}:
|
||||
# handle name-value variable syntax
|
||||
# example:
|
||||
|
@ -125,22 +102,13 @@ jobs:
|
|||
workspace: ${{ parameters.workspace }}
|
||||
|
||||
steps:
|
||||
- ${{ if eq(parameters.enableTelemetry, 'true') }}:
|
||||
# Telemetry tasks are built from https://github.com/dotnet/arcade-extensions
|
||||
- task: sendStartTelemetry@0
|
||||
displayName: 'Send Helix Start Telemetry'
|
||||
inputs:
|
||||
helixRepo: ${{ parameters.helixRepo }}
|
||||
${{ if ne(parameters.helixType, '') }}:
|
||||
helixType: ${{ parameters.helixType }}
|
||||
buildConfig: $(_BuildConfig)
|
||||
runAsPublic: ${{ parameters.runAsPublic }}
|
||||
continueOnError: ${{ parameters.continueOnError }}
|
||||
condition: always()
|
||||
- ${{ if ne(parameters.preSteps, '') }}:
|
||||
- ${{ each preStep in parameters.preSteps }}:
|
||||
- ${{ preStep }}
|
||||
|
||||
- ${{ if eq(parameters.enableMicrobuild, 'true') }}:
|
||||
- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
|
||||
- task: MicroBuildSigningPlugin@2
|
||||
- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
|
||||
- ${{ if eq(parameters.enableMicrobuild, 'true') }}:
|
||||
- task: MicroBuildSigningPlugin@3
|
||||
displayName: Install MicroBuild plugin
|
||||
inputs:
|
||||
signType: $(_SignType)
|
||||
|
@ -151,12 +119,33 @@ jobs:
|
|||
continueOnError: ${{ parameters.continueOnError }}
|
||||
condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT'))
|
||||
|
||||
- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
|
||||
- ${{ if and(eq(parameters.runAsPublic, 'false'), eq(variables['System.TeamProject'], 'internal')) }}:
|
||||
- task: NuGetAuthenticate@0
|
||||
|
||||
- ${{ if or(eq(parameters.artifacts.download, 'true'), ne(parameters.artifacts.download, '')) }}:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: ${{ coalesce(parameters.artifacts.download.name, 'Artifacts_$(Agent.OS)_$(_BuildConfig)') }}
|
||||
targetPath: ${{ coalesce(parameters.artifacts.download.path, 'artifacts') }}
|
||||
itemPattern: ${{ coalesce(parameters.artifacts.download.pattern, '**') }}
|
||||
|
||||
- ${{ each step in parameters.steps }}:
|
||||
- ${{ step }}
|
||||
|
||||
- ${{ if eq(parameters.enableRichCodeNavigation, true) }}:
|
||||
- task: RichCodeNavIndexer@0
|
||||
displayName: RichCodeNav Upload
|
||||
inputs:
|
||||
languages: ${{ coalesce(parameters.richCodeNavigationLanguage, 'csharp') }}
|
||||
environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'production') }}
|
||||
richNavLogOutputDirectory: $(Build.SourcesDirectory)/artifacts/bin
|
||||
continueOnError: true
|
||||
|
||||
- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), ne(parameters.disableComponentGovernance, 'true')) }}:
|
||||
- task: ComponentGovernanceComponentDetection@0
|
||||
continueOnError: true
|
||||
|
||||
- ${{ if eq(parameters.enableMicrobuild, 'true') }}:
|
||||
- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
|
||||
- task: MicroBuildCleanup@1
|
||||
|
@ -166,30 +155,83 @@ jobs:
|
|||
env:
|
||||
TeamName: $(_TeamName)
|
||||
|
||||
- ${{ if eq(parameters.enableTelemetry, 'true') }}:
|
||||
# Telemetry tasks are built from https://github.com/dotnet/arcade-extensions
|
||||
- task: sendEndTelemetry@0
|
||||
displayName: 'Send Helix End Telemetry'
|
||||
continueOnError: ${{ parameters.continueOnError }}
|
||||
condition: always()
|
||||
- ${{ if ne(parameters.artifacts.publish, '') }}:
|
||||
- ${{ if or(eq(parameters.artifacts.publish.artifacts, 'true'), ne(parameters.artifacts.publish.artifacts, '')) }}:
|
||||
- task: CopyFiles@2
|
||||
displayName: Gather binaries for publish to artifacts
|
||||
inputs:
|
||||
SourceFolder: 'artifacts/bin'
|
||||
Contents: '**'
|
||||
TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/bin'
|
||||
- task: CopyFiles@2
|
||||
displayName: Gather packages for publish to artifacts
|
||||
inputs:
|
||||
SourceFolder: 'artifacts/packages'
|
||||
Contents: '**'
|
||||
TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/packages'
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish pipeline artifacts
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts'
|
||||
PublishLocation: Container
|
||||
ArtifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }}
|
||||
continueOnError: true
|
||||
condition: always()
|
||||
- ${{ if or(eq(parameters.artifacts.publish.logs, 'true'), ne(parameters.artifacts.publish.logs, '')) }}:
|
||||
- publish: artifacts/log
|
||||
artifact: ${{ coalesce(parameters.artifacts.publish.logs.name, 'Logs_Build_$(Agent.Os)_$(_BuildConfig)') }}
|
||||
displayName: Publish logs
|
||||
continueOnError: true
|
||||
condition: always()
|
||||
- ${{ if or(eq(parameters.artifacts.publish.manifests, 'true'), ne(parameters.artifacts.publish.manifests, '')) }}:
|
||||
- ${{ if and(ne(parameters.enablePublishUsingPipelines, 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
|
||||
- task: CopyFiles@2
|
||||
displayName: Gather Asset Manifests
|
||||
inputs:
|
||||
SourceFolder: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/AssetManifest'
|
||||
TargetFolder: '$(Build.ArtifactStagingDirectory)/AssetManifests'
|
||||
continueOnError: ${{ parameters.continueOnError }}
|
||||
condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true'))
|
||||
|
||||
- ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}:
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Push Asset Manifests
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.ArtifactStagingDirectory)/AssetManifests'
|
||||
PublishLocation: Container
|
||||
ArtifactName: AssetManifests
|
||||
continueOnError: ${{ parameters.continueOnError }}
|
||||
condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true'))
|
||||
|
||||
- ${{ if ne(parameters.enablePublishBuildArtifacts, 'false') }}:
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish Logs
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)'
|
||||
PublishLocation: Container
|
||||
ArtifactName: $(Agent.Os)_$(Agent.JobName)
|
||||
ArtifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)' ) }}
|
||||
continueOnError: true
|
||||
condition: always()
|
||||
|
||||
- ${{ if eq(parameters.enablePublishTestResults, 'true') }}:
|
||||
- ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'xunit')) }}:
|
||||
- task: PublishTestResults@2
|
||||
displayName: Publish Test Results
|
||||
displayName: Publish XUnit Test Results
|
||||
inputs:
|
||||
testResultsFormat: 'xUnit'
|
||||
testResultsFiles: '*.xml'
|
||||
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
|
||||
testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-xunit
|
||||
mergeTestResults: ${{ parameters.mergeTestResults }}
|
||||
continueOnError: true
|
||||
condition: always()
|
||||
- ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'vstest')) }}:
|
||||
- task: PublishTestResults@2
|
||||
displayName: Publish TRX Test Results
|
||||
inputs:
|
||||
testResultsFormat: 'VSTest'
|
||||
testResultsFiles: '*.trx'
|
||||
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
|
||||
testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-trx
|
||||
mergeTestResults: ${{ parameters.mergeTestResults }}
|
||||
continueOnError: true
|
||||
condition: always()
|
||||
|
||||
|
@ -210,3 +252,10 @@ jobs:
|
|||
ArtifactName: AssetManifests
|
||||
continueOnError: ${{ parameters.continueOnError }}
|
||||
condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true'))
|
||||
|
||||
- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.enableSbom, 'true')) }}:
|
||||
- template: /eng/common/templates/steps/generate-sbom.yml
|
||||
parameters:
|
||||
PackageVersion: ${{ parameters.packageVersion}}
|
||||
BuildDropPath: ${{ parameters.buildDropPath }}
|
||||
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
parameters:
|
||||
# Optional: dependencies of the job
|
||||
dependsOn: ''
|
||||
|
||||
# Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool
|
||||
pool: ''
|
||||
|
||||
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)
|
||||
CreatePr: true
|
||||
AutoCompletePr: false
|
||||
ReusePr: true
|
||||
UseLfLineEndings: true
|
||||
UseCheckedInLocProjectJson: false
|
||||
LanguageSet: VS_Main_Languages
|
||||
LclSource: lclFilesInRepo
|
||||
LclPackageId: ''
|
||||
RepoType: gitHub
|
||||
GitHubOrg: dotnet
|
||||
MirrorRepo: ''
|
||||
MirrorBranch: main
|
||||
condition: ''
|
||||
|
||||
jobs:
|
||||
- job: OneLocBuild
|
||||
|
||||
dependsOn: ${{ parameters.dependsOn }}
|
||||
|
||||
displayName: OneLocBuild
|
||||
|
||||
${{ if ne(parameters.pool, '') }}:
|
||||
pool: ${{ parameters.pool }}
|
||||
${{ if eq(parameters.pool, '') }}:
|
||||
pool:
|
||||
# We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
|
||||
${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
|
||||
name: VSEngSS-MicroBuild2022-1ES
|
||||
demands: Cmd
|
||||
# If it's not devdiv, it's dnceng
|
||||
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
|
||||
name: NetCore1ESPool-Internal
|
||||
demands: ImageOverride -equals Build.Server.Amd64.VS2019
|
||||
|
||||
variables:
|
||||
- group: OneLocBuildVariables # Contains the CeapexPat and GithubPat
|
||||
- name: _GenerateLocProjectArguments
|
||||
value: -SourcesDirectory ${{ parameters.SourcesDirectory }}
|
||||
-LanguageSet "${{ parameters.LanguageSet }}"
|
||||
-CreateNeutralXlfs
|
||||
- ${{ if eq(parameters.UseCheckedInLocProjectJson, 'true') }}:
|
||||
- name: _GenerateLocProjectArguments
|
||||
value: ${{ variables._GenerateLocProjectArguments }} -UseCheckedInLocProjectJson
|
||||
|
||||
|
||||
steps:
|
||||
- task: Powershell@2
|
||||
inputs:
|
||||
filePath: $(Build.SourcesDirectory)/eng/common/generate-locproject.ps1
|
||||
arguments: $(_GenerateLocProjectArguments)
|
||||
displayName: Generate LocProject.json
|
||||
condition: ${{ parameters.condition }}
|
||||
|
||||
- task: OneLocBuild@2
|
||||
displayName: OneLocBuild
|
||||
env:
|
||||
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
|
||||
inputs:
|
||||
locProj: eng/Localize/LocProject.json
|
||||
outDir: $(Build.ArtifactStagingDirectory)
|
||||
lclSource: ${{ parameters.LclSource }}
|
||||
lclPackageId: ${{ parameters.LclPackageId }}
|
||||
isCreatePrSelected: ${{ parameters.CreatePr }}
|
||||
${{ if eq(parameters.CreatePr, true) }}:
|
||||
isAutoCompletePrSelected: ${{ parameters.AutoCompletePr }}
|
||||
isUseLfLineEndingsSelected: ${{ parameters.UseLfLineEndings }}
|
||||
${{ if eq(parameters.RepoType, 'gitHub') }}:
|
||||
isShouldReusePrSelected: ${{ parameters.ReusePr }}
|
||||
packageSourceAuth: patAuth
|
||||
patVariable: ${{ parameters.CeapexPat }}
|
||||
${{ if eq(parameters.RepoType, 'gitHub') }}:
|
||||
repoType: ${{ parameters.RepoType }}
|
||||
gitHubPatVariable: "${{ parameters.GithubPat }}"
|
||||
${{ if ne(parameters.MirrorRepo, '') }}:
|
||||
isMirrorRepoSelected: true
|
||||
gitHubOrganization: ${{ parameters.GitHubOrg }}
|
||||
mirrorRepo: ${{ parameters.MirrorRepo }}
|
||||
mirrorBranch: ${{ parameters.MirrorBranch }}
|
||||
condition: ${{ parameters.condition }}
|
||||
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish Localization Files
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.ArtifactStagingDirectory)/loc'
|
||||
PublishLocation: Container
|
||||
ArtifactName: Loc
|
||||
condition: ${{ parameters.condition }}
|
||||
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish LocProject.json
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.SourcesDirectory)/eng/Localize/'
|
||||
PublishLocation: Container
|
||||
ArtifactName: Loc
|
||||
condition: ${{ parameters.condition }}
|
|
@ -1,95 +0,0 @@
|
|||
parameters:
|
||||
steps: [] # optional -- any additional steps that need to happen before pulling down the performance repo and sending the performance benchmarks to helix (ie building your repo)
|
||||
variables: [] # optional -- list of additional variables to send to the template
|
||||
jobName: '' # required -- job name
|
||||
displayName: '' # optional -- display name for the job. Will use jobName if not passed
|
||||
pool: '' # required -- name of the Build pool
|
||||
container: '' # required -- name of the container
|
||||
osGroup: '' # required -- operating system for the job
|
||||
extraSetupParameters: '' # optional -- extra arguments to pass to the setup script
|
||||
frameworks: ['netcoreapp3.0'] # optional -- list of frameworks to run against
|
||||
continueOnError: 'false' # optional -- determines whether to continue the build if the step errors
|
||||
dependsOn: '' # optional -- dependencies of the job
|
||||
timeoutInMinutes: 320 # optional -- timeout for the job
|
||||
enableTelemetry: false # optional -- enable for telemetry
|
||||
|
||||
jobs:
|
||||
- template: ../jobs/jobs.yml
|
||||
parameters:
|
||||
dependsOn: ${{ parameters.dependsOn }}
|
||||
enableTelemetry: ${{ parameters.enableTelemetry }}
|
||||
enablePublishBuildArtifacts: true
|
||||
continueOnError: ${{ parameters.continueOnError }}
|
||||
|
||||
jobs:
|
||||
- job: '${{ parameters.jobName }}'
|
||||
|
||||
${{ if ne(parameters.displayName, '') }}:
|
||||
displayName: '${{ parameters.displayName }}'
|
||||
${{ if eq(parameters.displayName, '') }}:
|
||||
displayName: '${{ parameters.jobName }}'
|
||||
|
||||
timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
|
||||
|
||||
variables:
|
||||
|
||||
- ${{ each variable in parameters.variables }}:
|
||||
- ${{ if ne(variable.name, '') }}:
|
||||
- name: ${{ variable.name }}
|
||||
value: ${{ variable.value }}
|
||||
- ${{ if ne(variable.group, '') }}:
|
||||
- group: ${{ variable.group }}
|
||||
|
||||
- IsInternal: ''
|
||||
- HelixApiAccessToken: ''
|
||||
- HelixPreCommand: ''
|
||||
|
||||
- ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
|
||||
- ${{ if eq( parameters.osGroup, 'Windows_NT') }}:
|
||||
- HelixPreCommand: 'set "PERFLAB_UPLOAD_TOKEN=$(PerfCommandUploadToken)"'
|
||||
- IsInternal: -Internal
|
||||
- ${{ if ne(parameters.osGroup, 'Windows_NT') }}:
|
||||
- HelixPreCommand: 'export PERFLAB_UPLOAD_TOKEN="$(PerfCommandUploadTokenLinux)"'
|
||||
- IsInternal: --internal
|
||||
|
||||
- group: DotNet-HelixApi-Access
|
||||
- group: dotnet-benchview
|
||||
|
||||
workspace:
|
||||
clean: all
|
||||
pool:
|
||||
${{ parameters.pool }}
|
||||
container: ${{ parameters.container }}
|
||||
strategy:
|
||||
matrix:
|
||||
${{ each framework in parameters.frameworks }}:
|
||||
${{ framework }}:
|
||||
_Framework: ${{ framework }}
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
# Run all of the steps to setup repo
|
||||
- ${{ each step in parameters.steps }}:
|
||||
- ${{ step }}
|
||||
- powershell: $(Build.SourcesDirectory)\eng\common\performance\performance-setup.ps1 $(IsInternal) -Framework $(_Framework) ${{ parameters.extraSetupParameters }}
|
||||
displayName: Performance Setup (Windows)
|
||||
condition: and(succeeded(), eq(variables['Agent.Os'], 'Windows_NT'))
|
||||
continueOnError: ${{ parameters.continueOnError }}
|
||||
- script: $(Build.SourcesDirectory)/eng/common/performance/performance-setup.sh $(IsInternal) --framework $(_Framework) ${{ parameters.extraSetupParameters }}
|
||||
displayName: Performance Setup (Unix)
|
||||
condition: and(succeeded(), ne(variables['Agent.Os'], 'Windows_NT'))
|
||||
continueOnError: ${{ parameters.continueOnError }}
|
||||
- script: $(Python) $(PerformanceDirectory)/scripts/ci_setup.py $(SetupArguments)
|
||||
displayName: Run ci setup script
|
||||
# Run perf testing in helix
|
||||
- template: /eng/common/templates/steps/perf-send-to-helix.yml
|
||||
parameters:
|
||||
HelixSource: '$(HelixSourcePrefix)/$(Build.Repository.Name)/$(Build.SourceBranch)' # sources must start with pr/, official/, prodcon/, or agent/
|
||||
HelixType: 'test/performance/$(Kind)/$(_Framework)/$(Architecture)'
|
||||
HelixAccessToken: $(HelixApiAccessToken)
|
||||
HelixTargetQueues: $(Queue)
|
||||
HelixPreCommands: $(HelixPreCommand)
|
||||
Creator: $(Creator)
|
||||
WorkItemTimeout: 4:00 # 4 hours
|
||||
WorkItemDirectory: '$(WorkItemDirectory)' # WorkItemDirectory can not be empty, so we send it some docs to keep it happy
|
||||
CorrelationPayloadDirectory: '$(PayloadDirectory)' # it gets checked out to a folder with shorter path than WorkItemDirectory so we can avoid file name too long exceptions
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче