Skip to content
This repository was archived by the owner on Jan 10, 2025. It is now read-only.

Commit 6e1caac

Browse files
committed
Create yaml pipeline
Stages: - Build - Tests - Compliance - Package
1 parent 5ff57b7 commit 6e1caac

14 files changed

+400
-104
lines changed

NuGet.Config

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<configuration>
3+
<config>
4+
<add key="repositoryPath" value=".nuget\packages" />
5+
</config>
6+
<packageSources>
7+
<clear />
8+
<add key="xvs" value="https://devdiv.pkgs.visualstudio.com/_packaging/xamarin-xvs/nuget/v3/index.json" />
9+
</packageSources>
10+
</configuration>

build.proj

Lines changed: 0 additions & 90 deletions
This file was deleted.

build/CredScanSuppressions.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"tool": "Credential Scanner",
3+
"suppressions": [
4+
{
5+
"file": "src\\IntegrationTests\\AuthenticationSpec.cs",
6+
"_justification": "Dummy credentials for testing purposes"
7+
}
8+
]
9+
}

build/PoliCheckExclusions.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<!-- Upper case must be used. All values will be compared only to the upper case strings -->
2+
<PoliCheckExclusions>
3+
</PoliCheckExclusions>

build/stages/build.yml

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
# Build Stage
2+
3+
stages:
4+
- stage: Build
5+
jobs:
6+
- job: Windows
7+
timeoutInMinutes: 10
8+
pool:
9+
name: $(WindowsPoolName)
10+
11+
steps:
12+
- checkout: self
13+
clean: true
14+
15+
- task: UseDotNet@2
16+
displayName: 'Use .Net Core SDK $(DotNetCoreVersion)'
17+
inputs:
18+
version: '$(DotNetCoreVersion)'
19+
condition: always()
20+
21+
- script: 'mkdir "$(Build.ArtifactStagingDirectory)\binlogs"'
22+
displayName: 'Create Logs Dir'
23+
condition: always()
24+
25+
# Ensure we clear bot-provided feeds, for reliability
26+
- powershell: |
27+
$configPath = "$(Build.SourcesDirectory)\NuGet.Config"
28+
[xml]$config = get-content $configPath
29+
$config.configuration.packageSources.PrependChild($config.CreateElement("clear"))
30+
$config.Save($configPath)
31+
displayName: 'Ensure Clean NuGet Sources'
32+
condition: always()
33+
34+
- task: NuGetCommand@2
35+
displayName: 'Restore Packages'
36+
inputs:
37+
restoreSolution: '$(Build.SourcesDirectory)/src/Hermes.sln'
38+
feedsToUse: config
39+
nugetConfigPath: '$(Build.SourcesDirectory)/NuGet.Config'
40+
condition: always()
41+
42+
- task: MSBuild@1
43+
displayName: 'Build Solution'
44+
inputs:
45+
solution: '$(Build.SourcesDirectory)/src/Hermes.sln'
46+
msbuildArguments: /t:Build /noautoresponse /bl:"$(Build.ArtifactStagingDirectory)\binlogs\build.binlog"
47+
condition: always()
48+
49+
- task: PublishBuildArtifacts@1
50+
displayName: 'Publish Artifact: packages'
51+
inputs:
52+
PathtoPublish: '$(Build.SourcesDirectory)\pack'
53+
ArtifactName: packages
54+
continueOnError: true
55+
condition: always()
56+
57+
- task: PublishBuildArtifacts@1
58+
displayName: 'Publish Artifact: unit-tests'
59+
inputs:
60+
PathtoPublish: '$(Build.SourcesDirectory)\src\Tests\bin\$(Configuration)'
61+
ArtifactName: unit-tests
62+
continueOnError: true
63+
condition: always()
64+
65+
- task: PublishBuildArtifacts@1
66+
displayName: 'Publish Artifact: integration-tests'
67+
inputs:
68+
PathtoPublish: '$(Build.SourcesDirectory)\src\IntegrationTests\bin\$(Configuration)'
69+
ArtifactName: integration-tests
70+
continueOnError: true
71+
condition: always()
72+
73+
- task: PublishBuildArtifacts@1
74+
displayName: 'Publish Artifact: logs'
75+
inputs:
76+
PathtoPublish: '$(Build.ArtifactStagingDirectory)\binlogs'
77+
ArtifactName: logs
78+
continueOnError: true
79+
condition: always()
80+
81+
- task: CopyFiles@2
82+
displayName: 'Copy Symbols'
83+
inputs:
84+
SourceFolder: '$(Build.SourcesDirectory)/src/Server/bin/$(Configuration)'
85+
Contents: |
86+
**/System.Net.Mqtt.?(dll|pdb)
87+
**/System.Net.Mqtt.Server.?(dll|pdb)
88+
TargetFolder: '$(Build.ArtifactStagingDirectory)/Symbols'
89+
CleanTargetFolder: true
90+
FlattenFolders: true
91+
OverWrite: true # Check if we should copy to $(TargetFramework) subfolders instead
92+
condition: always()
93+
94+
- task: PublishBuildArtifacts@1
95+
displayName: 'Publish Artifact: symbols'
96+
inputs:
97+
PathtoPublish: '$(Build.ArtifactStagingDirectory)/Symbols'
98+
ArtifactName: symbols
99+
condition: always()
100+
101+
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
102+
displayName: 'Component Governance'
103+
condition: and(succeeded(), eq(variables['Build.SourceBranch'], variables['MainBranch']))
104+
105+
- powershell: |
106+
$complianceEnabled = if ($env:COMPLIANCEENABLED) { $env:COMPLIANCEENABLED } else { '' }
107+
108+
if ($complianceEnabled -eq '') {
109+
$branch = '$(Build.SourceBranch)'
110+
$reason = '$(Build.Reason)'
111+
112+
if($branch -eq '$(MainBranch)' -or $reason -eq 'PullRequest') {
113+
$complianceEnabled = 'true'
114+
} else {
115+
$complianceEnabled = 'false'
116+
}
117+
}
118+
119+
Write-Host "Source Branch: $branch, Build Reason: $reason"
120+
Write-Host "Requires Compliance Stage: $complianceEnabled"
121+
Write-Host "##vso[task.setvariable variable=Xamarin.ComplianceEnabled;isOutput=true]$complianceEnabled"
122+
name: 'SetComplianceNeed'
123+
displayName: 'Evaluate Compliance Need'
124+
condition: always()

build/stages/compliance.yml

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# Compliance Stage
2+
3+
stages:
4+
- stage : Compliance
5+
dependsOn: Build
6+
condition: eq(stageDependencies.Build.outputs['Windows.SetComplianceNeed.Xamarin.ComplianceEnabled'], 'true')
7+
jobs:
8+
- job: CodeAnalysis
9+
displayName: Security & Analysis
10+
pool: $(WindowsPoolName)
11+
timeoutInMinutes: 60
12+
cancelTimeoutInMinutes: 5
13+
steps:
14+
- checkout: self
15+
clean: true
16+
submodules: recursive
17+
- task: DownloadBuildArtifacts@0
18+
displayName: Download Symbols
19+
inputs:
20+
artifactName: symbols
21+
downloadPath: '$(Build.ArtifactStagingDirectory)'
22+
- task: AntiMalware@3
23+
displayName: Run AntiMalware Scan
24+
inputs:
25+
FileDirPath: $(System.DefaultWorkingDirectory)
26+
EnableServices: true
27+
continueOnError: true
28+
condition: succeededOrFailed()
29+
- task: BinSkim@3
30+
displayName: Run BinSkim Analysis
31+
inputs:
32+
InputType: Basic
33+
AnalyzeTarget: '$(Build.ArtifactStagingDirectory)\Symbols\*.dll'
34+
AnalyzeVerbose: true
35+
continueOnError: true
36+
condition: succeededOrFailed()
37+
- template: security\credscan\v2.yml@templates # from xamarin/yaml-templates repository
38+
parameters:
39+
suppressionsFile: $(System.DefaultWorkingDirectory)\build\CredScanSuppressions.json
40+
- template: security\policheck\v1.yml@templates # from xamarin/yaml-templates repository
41+
parameters:
42+
exclusionFile: $(System.DefaultWorkingDirectory)\build\PoliCheckExclusions.xml
43+
- task: CodeInspector@2
44+
displayName: Run Code Inspector Analysis
45+
inputs:
46+
ProductId: '$(System.TeamProjectId)'
47+
continueOnError: true
48+
condition: succeededOrFailed()
49+
- task: SdtReport@1
50+
displayName: Create Security Analysis Report
51+
inputs:
52+
AntiMalware: true
53+
BinSkim: true
54+
CredScan: true
55+
RoslynAnalyzers: true
56+
PoliCheck: true
57+
CodeInspector: true
58+
continueOnError: true
59+
condition: succeededOrFailed()
60+
- task: PublishSecurityAnalysisLogs@2
61+
displayName: Publish Security Analysis Logs
62+
inputs:
63+
ArtifactName: ComplianceLogs
64+
continueOnError: true
65+
condition: succeededOrFailed()
66+
- task: PostAnalysis@1
67+
displayName: Run Security Post Analysis
68+
inputs:
69+
AntiMalware: true
70+
BinSkim: true
71+
CredScan: true
72+
RoslynAnalyzers: true
73+
PoliCheck: true
74+
CodeInspector: true
75+
continueOnError: true
76+
condition: succeededOrFailed()
77+
- task: TSAUpload@1
78+
inputs:
79+
tsaVersion: 'TsaV2'
80+
codebase: 'NewOrUpdate'
81+
tsaEnvironment: 'PROD'
82+
codeBaseName: 'mqtt_main'
83+
84+
notifyAlwaysV2: false
85+
codeBaseAdmins: 'REDMOND\maagno;REDMOND\vsengxamarin'
86+
instanceUrlForTsaV2: 'DEVDIV'
87+
projectNameDEVDIV: 'DevDiv'
88+
areaPath: 'DevDiv\Xamarin Tools\XamarinVS\XMA'
89+
iterationPath: 'DevDiv\OneVS'
90+
uploadAPIScan: true
91+
uploadBinSkim: true
92+
uploadCredScan: true
93+
uploadFortifySCA: true
94+
uploadFxCop: true
95+
uploadModernCop: true
96+
uploadPoliCheck: true
97+
uploadPREfast: true
98+
uploadRoslyn: true
99+
uploadTSLint: true
100+
uploadAsync: true
101+
condition: succeededOrFailed()

build/stages/push.yml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Upload Stage
2+
3+
stages:
4+
- stage : Package
5+
dependsOn:
6+
- Test
7+
- Compliance
8+
condition: and(succeeded(), eq(variables['Build.SourceBranch'], variables['MainBranch']))
9+
jobs:
10+
- job: Push
11+
displayName: Pack & Push
12+
timeoutInMinutes: 10
13+
pool:
14+
name: $(WindowsPoolName)
15+
steps:
16+
- checkout: self
17+
18+
- task: DownloadBuildArtifacts@0
19+
displayName: Download Packages
20+
inputs:
21+
artifactName: packages
22+
downloadPath: '$(Build.ArtifactStagingDirectory)'
23+
24+
- task: NuGetCommand@2
25+
displayName: 'NuGet Update'
26+
inputs:
27+
command: custom
28+
arguments: 'update -self'
29+
30+
- task: NuGetCommand@2
31+
displayName: Push Packages
32+
continueOnError: true
33+
inputs:
34+
command: push
35+
packagesToPush: '$(Build.ArtifactStagingDirectory)/packages/*.nupkg'
36+
nuGetFeedType: external
37+
publishFeedCredentials: '$(PackagesFeedCredentials)'

0 commit comments

Comments
 (0)