1+ # Docker
2+ # Build and push an image to Azure Container Registry
3+ # https://docs.microsoft.com/azure/devops/pipelines/languages/docker
4+ pr :
5+ drafts : false
6+ trigger :
7+ - none
8+
9+ resources :
10+ - repo : self
11+
12+ variables :
13+ # Container registry service connection established during pipeline creation
14+ # Agent VM image name
15+ - name : vmImageName
16+ value : ' windows-latest'
17+ - name : fullBuild
18+ value : $[ne(variables['Build.Reason'], 'PullRequest')]
19+ - name : securityScan
20+ value : $[or(eq(variables['Build.Reason'], 'Manual'), eq(variables['Build.Reason'], 'Schedule'))]
21+
22+ stages :
23+ - stage : Build
24+ displayName : Build and push stage
25+ jobs :
26+ - job : Build
27+ displayName : Build
28+ pool :
29+ vmImage : $(vmImageName)
30+ steps :
31+ - task : NodeTool@0
32+ inputs :
33+ versionSpec : ' 18.x'
34+ - task : Npm@1
35+ inputs :
36+ command : ' install'
37+ workingDir : ' react'
38+ - task : Npm@1
39+ inputs :
40+ command : ' custom'
41+ workingDir : ' react'
42+ customCommand : ' run pub'
43+ - task : CodeInspector@2
44+ displayName : " [Security Review] code inspector"
45+ inputs :
46+ ProductId : ' 606a5e0d-64b0-4237-9dca-eac200438452'
47+ condition : eq(variables.securityScan, 'true')
48+ - task : CodeQL3000Init@0
49+ displayName : " [Security Review] CodeQL Init"
50+ condition : eq(variables.securityScan, 'true')
51+ - task : CredScan@3
52+ displayName : " [Security Review] CredScan"
53+ condition : eq(variables.securityScan, 'true')
54+ - task : PowerShell@2
55+ displayName : Generate Env File
56+ inputs :
57+ targetType : ' inline'
58+ script : |
59+ if(Test-Path variable:BLOB_CONNECTION_STRING){
60+ New-Item -Path common/src/test/resources -Name ".env" -ItemType "file" -Value "BLOB_CONNECTION_STRING = $(BLOB_CONNECTION_STRING)"
61+ }else{
62+ Write-Host "No BLOB_CONNECTION_STRING found"
63+ }
64+ workingDirectory : ' $(Build.Repository.LocalPath)'
65+ condition : eq(variables.fullBuild, 'false')
66+ - task : PowerShell@2
67+ displayName : Set center/agent version
68+ inputs :
69+ targetType : ' inline'
70+ script : |
71+ $PSDefaultParameterValues['*:Encoding'] = 'utf8'
72+ $hydraVersionCode = $(Build.BuildId)
73+ $hydraVersion = "$(Build.SourceBranchName).$(Build.BuildId)"
74+ $branchName = "$(Build.SourceBranch)"
75+
76+ (Get-Content agent/src/main/resources/version.properties) -Replace '1000000', "$hydraVersionCode"| Set-Content agent/src/main/resources/version.properties
77+ (Get-Content center/src/main/resources/version.properties) -Replace '1000000', "$hydraVersionCode"| Set-Content center/src/main/resources/version.properties
78+
79+ if($branchName -like '*Release*'){
80+ (Get-Content agent/src/main/resources/version.properties) -Replace '0.0.0', $hydraVersion| Set-Content agent/src/main/resources/version.properties
81+ (Get-Content center/src/main/resources/version.properties) -Replace '0.0.0', $hydraVersion| Set-Content center/src/main/resources/version.properties
82+ }
83+ echo "##vso[task.setvariable variable=hydraVersionCode;]$hydraVersionCode"
84+ echo "##vso[task.setvariable variable=hydraVersion;]$hydraVersion"
85+ workingDirectory : ' $(Build.Repository.LocalPath)'
86+ - task : Gradle@3
87+ displayName : Run JUnit Test
88+ inputs :
89+ gradleWrapperFile : ' gradlew'
90+ tasks : ' test jacocoRootReport --stacktrace'
91+ publishJUnitResults : true
92+ testResultsFiles : ' **/TEST-*.xml'
93+ # codeCoverageToolOption: 'JaCoCo'
94+ # codeCoverageClassFilesDirectories: 'build/classes/java/main'
95+ javaHomeOption : ' JDKVersion'
96+ jdkVersionOption : ' 1.11'
97+ sonarQubeRunAnalysis : false
98+ spotBugsAnalysis : false
99+ condition : eq(variables.fullBuild, 'false')
100+ - task : PowerShell@2
101+ displayName : Delete Env File
102+ inputs :
103+ targetType : ' inline'
104+ script : |
105+ if(Test-Path common/src/test/resources/.env){
106+ Remove-Item -Path common/src/test/resources/.env -Force
107+ }else{
108+ Write-Host "No .env file found"
109+ }
110+ workingDirectory : ' $(Build.Repository.LocalPath)'
111+ condition : eq(variables.fullBuild, 'false')
112+ - task : PublishCodeCoverageResults@1
113+ displayName : Publich Code Coverage
114+ inputs :
115+ codeCoverageTool : ' JaCoCo'
116+ summaryFileLocation : ' build/reports/jacoco/jacocoRootReport/*.xml'
117+ reportDirectory : ' build/reports/jacoco/jacocoRootReport/html'
118+ condition : eq(variables.fullBuild, 'false')
119+ - task : Gradle@2
120+ displayName : Package Android client APK
121+ inputs :
122+ workingDirectory : ' android_client'
123+ gradleWrapperFile : ' android_client/gradlew'
124+ tasks : ' assembleRelease --stacktrace'
125+ publishJUnitResults : false
126+ javaHomeOption : ' JDKVersion'
127+ jdkVersionOption : ' 1.11'
128+ options : ' -PclientVersionCode=$(hydraVersionCode) -PclientVersionNumber=$(hydraVersion)'
129+ - task : Gradle@2
130+ displayName : Package Android client APK
131+ inputs :
132+ workingDirectory : ' android_client'
133+ gradleWrapperFile : ' android_client/gradlew'
134+ tasks : ' assembleAndroidTest --stacktrace'
135+ publishJUnitResults : false
136+ javaHomeOption : ' JDKVersion'
137+ jdkVersionOption : ' 1.11'
138+ options : ' -PclientVersionCode=$(hydraVersionCode) -PclientVersionNumber=$(hydraVersion)'
139+ - task : PowerShell@2
140+ displayName : Copy APK to folder for deployment
141+ inputs :
142+ targetType : ' inline'
143+ script : |
144+ cp android_client/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk common/src/main/resources/record_androidTest.apk -force
145+ - task : PowerShell@2
146+ displayName : Copy APK to folder for deployment
147+ inputs :
148+ targetType : ' inline'
149+ script : |
150+ cp android_client/app/build/outputs/apk/release/app-release.apk common/src/main/resources/record_release.apk -force
151+ - task : Gradle@2
152+ displayName : Build center
153+ inputs :
154+ gradleWrapperFile : ' gradlew'
155+ tasks : ' center:bootJar --stacktrace'
156+ publishJUnitResults : false
157+ javaHomeOption : ' JDKVersion'
158+ jdkVersionOption : ' 1.11'
159+ sonarQubeRunAnalysis : false
160+ spotBugsAnalysis : false
161+ - task : Gradle@2
162+ displayName : Build agent
163+ inputs :
164+ gradleWrapperFile : ' gradlew'
165+ tasks : ' agent:bootJar --stacktrace'
166+ publishJUnitResults : false
167+ javaHomeOption : ' JDKVersion'
168+ jdkVersionOption : ' 1.11'
169+ sonarQubeRunAnalysis : false
170+ spotBugsAnalysis : false
171+ - task : CopyFiles@2
172+ displayName : Copy deploy center files
173+ inputs :
174+ SourceFolder : ' center/'
175+ Contents : ' Dockerfile'
176+ TargetFolder : ' $(Build.ArtifactStagingDirectory)/center_deploy'
177+ condition : eq(variables.fullBuild, 'true')
178+ - task : CopyFiles@2
179+ displayName : Copy deploy center files 2
180+ inputs :
181+ SourceFolder : ' center/deploy_startup/'
182+ Contents : ' **'
183+ TargetFolder : ' $(Build.ArtifactStagingDirectory)/center_deploy/deploy_startup'
184+ condition : eq(variables.fullBuild, 'true')
185+ - task : CopyFiles@2
186+ displayName : Copy deploy center files 3
187+ inputs :
188+ SourceFolder : ' center/uber_image/'
189+ Contents : ' hydra_lab_center_docker_db.sqlite'
190+ TargetFolder : ' $(Build.ArtifactStagingDirectory)/center_deploy/deploy_startup'
191+ condition : eq(variables.fullBuild, 'true')
192+ - task : CopyFiles@2
193+ displayName : Copy deploy center files 4
194+ inputs :
195+ SourceFolder : ' common/src/main/resources/'
196+ Contents : |
197+ record_release.apk
198+ record_androidTest.apk
199+ TargetFolder : ' $(Build.ArtifactStagingDirectory)/center_deploy/deploy_startup'
200+ condition : eq(variables.fullBuild, 'true')
201+ - task : CopyFiles@2
202+ displayName : Copy center jar
203+ inputs :
204+ SourceFolder : ' center/build/libs/'
205+ Contents : ' *.jar'
206+ TargetFolder : ' $(Build.ArtifactStagingDirectory)/center_deploy'
207+ condition : eq(variables.fullBuild, 'true')
208+ - task : Gradle@2
209+ displayName : Package Mac installer
210+ inputs :
211+ gradleWrapperFile : ' gradlew'
212+ tasks : ' packageMacInstaller --stacktrace'
213+ publishJUnitResults : false
214+ javaHomeOption : ' JDKVersion'
215+ jdkVersionOption : ' 1.11'
216+ sonarQubeRunAnalysis : false
217+ spotBugsAnalysis : false
218+ condition : eq(variables.fullBuild, 'true')
219+ - task : Gradle@2
220+ displayName : Package Windows installer
221+ inputs :
222+ gradleWrapperFile : ' gradlew'
223+ tasks : ' packageWindowsInstaller --stacktrace'
224+ publishJUnitResults : false
225+ javaHomeOption : ' JDKVersion'
226+ jdkVersionOption : ' 1.11'
227+ sonarQubeRunAnalysis : false
228+ spotBugsAnalysis : false
229+ condition : eq(variables.fullBuild, 'true')
230+ - task : PowerShell@2
231+ displayName : Copy APK & Mapping file to artifact
232+ inputs :
233+ targetType : ' inline'
234+ script : |
235+ mkdir -p $(Build.ArtifactStagingDirectory)/android_client
236+ cp android_client/app/build/outputs/apk/release/app-release.apk $(Build.ArtifactStagingDirectory)/android_client/app-release-$(hydraVersion).apk
237+ if(Test-Path android_client/app/build/outputs/mapping/release/mapping.txt){
238+ cp android_client/app/build/outputs/mapping/release/mapping.txt $(Build.ArtifactStagingDirectory)/android_client/
239+ }
240+ condition : eq(variables.fullBuild, 'true')
241+ - task : CopyFiles@2
242+ displayName : Copy agent jar
243+ inputs :
244+ SourceFolder : ' agent/build/libs/'
245+ Contents : ' *.jar'
246+ TargetFolder : ' $(Build.ArtifactStagingDirectory)/agent_deploy'
247+ condition : eq(variables.fullBuild, 'true')
248+ - task : CopyFiles@2
249+ displayName : Copy agent installer
250+ inputs :
251+ SourceFolder : ' build/installer/'
252+ Contents : ' *.zip'
253+ TargetFolder : ' $(Build.ArtifactStagingDirectory)/agent_deploy'
254+ condition : eq(variables.fullBuild, 'true')
255+ - task : CopyFiles@2
256+ displayName : Copy deploy uber files 1
257+ inputs :
258+ SourceFolder : ' common/src/main/resources/'
259+ Contents : |
260+ record_release.apk
261+ record_androidTest.apk
262+ TargetFolder : ' $(Build.ArtifactStagingDirectory)/uber_image'
263+ condition : eq(variables.fullBuild, 'true')
264+ - task : CopyFiles@2
265+ displayName : Copy deploy uber files 2
266+ inputs :
267+ SourceFolder : ' center/uber_image/'
268+ Contents : ' **'
269+ TargetFolder : ' $(Build.ArtifactStagingDirectory)/uber_image'
270+ condition : eq(variables.fullBuild, 'true')
271+ - task : PowerShell@2
272+ displayName : Add Release Tag
273+ inputs :
274+ targetType : ' inline'
275+ script : |
276+ Write-Host "##vso[build.addbuildtag]Release"
277+ workingDirectory : ' $(Build.Repository.LocalPath)'
278+ condition : and(eq(variables.fullBuild, 'true'), contains(variables['Build.SourceBranch'], 'Release/'))
279+ - task : PublishBuildArtifacts@1
280+ inputs :
281+ PathtoPublish : ' $(Build.ArtifactStagingDirectory)'
282+ ArtifactName : ' HydraLabRelease'
283+ publishLocation : ' Container'
284+ condition : eq(variables.fullBuild, 'true')
285+ - task : CodeQL3000Finalize@0
286+ displayName : " [Security Review] CodeQL Finalize"
287+ condition : eq(variables.securityScan, 'true')
288+ - task : securedevelopmentteam.vss-secure-development-tools.build-task-report.SdtReport@2
289+ # https://strikecommunity.azurewebsites.net/articles/8216/how-to-enable-build-break-on-credscan-detections.html
290+ displayName : " [Security Review] Create CredScan Security Analysis Report"
291+ inputs :
292+ GdnExportHtmlFile : true
293+ GdnExportAllTools : false
294+ GdnExportGdnToolBinSkim : true
295+ GdnExportGdnToolCredScan : true
296+ GdnExportGdnToolSemmle : true
297+ condition : eq(variables.securityScan, 'true')
0 commit comments