Skip to content

Commit f7b874d

Browse files
authored
Dependency track for V13 pipeline (#20702)
* Dependency track for V13 pipeline * Rename bom-backend to bom-build
1 parent dedc77c commit f7b874d

File tree

3 files changed

+184
-26
lines changed

3 files changed

+184
-26
lines changed

build/azure-pipelines.yml

Lines changed: 81 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ parameters:
2525
displayName: Upload API docs
2626
type: boolean
2727
default: false
28+
- name: uploadDependencyTrack
29+
displayName: Upload BOMs to Dependency Track
30+
type: boolean
31+
default: false
2832
- name: forceReleaseTestFilter
2933
displayName: Force to use the release test filters
3034
type: boolean
@@ -93,6 +97,11 @@ stages:
9397
- script: npm ci --no-fund --no-audit --prefer-offline
9498
workingDirectory: src/Umbraco.Web.UI.Client
9599
displayName: Run npm ci (Backoffice)
100+
- powershell: |
101+
npm install --global @cyclonedx/cyclonedx-npm
102+
cyclonedx-npm -o $(Build.ArtifactStagingDirectory)\bom\bom-backoffice.xml --ignore-npm-errors --verbose
103+
displayName: Generate Backoffice UI BOM
104+
workingDirectory: src/Umbraco.Web.UI.Client
96105
- task: gulp@0
97106
displayName: Run gulp build (Backoffice)
98107
inputs:
@@ -106,6 +115,10 @@ stages:
106115
workingDir: src/Umbraco.Web.UI.Login
107116
verbose: false
108117
customCommand: ci
118+
- powershell: |
119+
cyclonedx-npm -o $(Build.ArtifactStagingDirectory)\bom\bom-login.xml --ignore-npm-errors --verbose
120+
displayName: Generate Login UI BOM
121+
workingDirectory: src/Umbraco.Web.UI.Login
109122
- task: npm@1
110123
displayName: Run npm build (Login)
111124
inputs:
@@ -129,6 +142,10 @@ stages:
129142
command: build
130143
projects: $(solution)
131144
arguments: '--configuration $(buildConfiguration) --no-restore --property:ContinuousIntegrationBuild=true --property:GeneratePackageOnBuild=true --property:PackageOutputPath=$(Build.ArtifactStagingDirectory)/nupkg'
145+
- powershell: |
146+
dotnet tool install --global CycloneDX
147+
dotnet-CycloneDX $(solution) --output $(Build.ArtifactStagingDirectory)/bom --filename bom-dotnet.xml
148+
displayName: 'Generate Backend BOM'
132149
- task: PublishPipelineArtifact@1
133150
displayName: Publish nupkg
134151
inputs:
@@ -139,6 +156,35 @@ stages:
139156
inputs:
140157
targetPath: $(Build.SourcesDirectory)
141158
artifactName: build_output
159+
- task: PublishPipelineArtifact@1
160+
displayName: Publish Backend BOM
161+
inputs:
162+
targetPath: $(Build.ArtifactStagingDirectory)/bom
163+
artifactName: bom-build
164+
165+
- stage: E2E_BOM
166+
displayName: E2E Tests BOM Generation
167+
dependsOn: []
168+
jobs:
169+
- job:
170+
displayName: E2E Generate BOM
171+
pool:
172+
vmImage: "ubuntu-latest"
173+
steps:
174+
- checkout: self
175+
fetchDepth: 500
176+
- template: templates/e2e-install.yml
177+
parameters:
178+
nodeVersion: ${{ variables.nodeVersion }}
179+
npm_config_cache: ${{ variables.npm_config_cache }}
180+
- powershell: |
181+
npm install --global @cyclonedx/cyclonedx-npm
182+
cyclonedx-npm -o $(Build.ArtifactStagingDirectory)/bom/bom-e2e.xml --ignore-npm-errors --verbose
183+
displayName: Generate E2E Tests BOM
184+
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
185+
- publish: $(Build.ArtifactStagingDirectory)/bom
186+
artifact: bom-e2e
187+
displayName: 'Publish E2E BOM'
142188

143189
- stage: Build_Docs
144190
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.buildApiDocs}}))
@@ -464,37 +510,18 @@ stages:
464510
artifact: nupkg
465511
path: $(Agent.BuildDirectory)/app/nupkg
466512

467-
- task: NodeTool@0
468-
displayName: Use Node.js $(nodeVersion)
469-
retryCountOnTaskFailure: 3
470-
inputs:
471-
versionSpec: $(nodeVersion)
472-
473513
- task: UseDotNet@2
474514
displayName: Use .NET SDK from global.json
475515
inputs:
476516
useGlobalJson: true
477517

478-
- pwsh: |
479-
"UMBRACO_USER_LOGIN=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSEREMAIL)
480-
UMBRACO_USER_PASSWORD=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD)
481-
URL=$(ASPNETCORE_URLS)" | Out-File .env
482-
displayName: Generate .env
483-
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
484-
485-
# Cache and restore NPM packages
486-
- task: Cache@2
487-
displayName: Cache NPM packages
488-
inputs:
489-
key: 'npm_e2e | "$(Agent.OS)" | $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/package-lock.json'
490-
restoreKeys: |
491-
npm_e2e | "$(Agent.OS)"
492-
npm_e2e
493-
path: $(npm_config_cache)
494-
495-
- script: npm ci --no-fund --no-audit --prefer-offline
496-
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
497-
displayName: Restore NPM packages
518+
- template: templates/e2e-install.yml
519+
parameters:
520+
nodeVersion: $(nodeVersion)
521+
npm_config_cache: $(npm_config_cache)
522+
PlaywrightUserEmail: $(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSEREMAIL)
523+
PlaywrightPassword: $(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD)
524+
ASPNETCORE_URLS: $(ASPNETCORE_URLS)
498525

499526
# Build application
500527
- pwsh: |
@@ -755,6 +782,34 @@ stages:
755782
searchFolder: "tests/Umbraco.Tests.AcceptanceTest/results"
756783
testRunTitle: "$(Agent.JobName)"
757784

785+
- stage: Dependency_Track
786+
displayName: Dependency Track
787+
dependsOn:
788+
- Build
789+
- E2E_BOM
790+
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.uploadDependencyTrack}}))
791+
variables:
792+
# Determine Umbraco version based on whether it's a public release or not. If public release, use major version, else use full NuGet package version.
793+
umbracoVersion: $[ iif(eq(stageDependencies.Build.A.outputs['build.NBGV_PublicRelease'], 'True'), stageDependencies.Build.A.outputs['build.NBGV_VersionMajor'], stageDependencies.Build.A.outputs['build.NBGV_NuGetPackageVersion']) ]
794+
jobs:
795+
- template: templates/dependency-track.yml
796+
parameters:
797+
projectName: "Umbraco-CMS"
798+
umbracoVersion: $(umbracoVersion)
799+
projects:
800+
- name: "Backend"
801+
artifact: "bom-build"
802+
bomFilePath: "bom-dotnet.xml"
803+
- name: "Login"
804+
artifact: "bom-build"
805+
bomFilePath: "bom-login.xml"
806+
- name: "Backoffice"
807+
artifact: "bom-build"
808+
bomFilePath: "bom-backoffice.xml"
809+
- name: "E2E"
810+
artifact: "bom-e2e"
811+
bomFilePath: "bom-e2e.xml"
812+
758813
###############################################
759814
## Release
760815
###############################################
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
parameters:
2+
- name: projectName
3+
type: string
4+
- name: umbracoVersion
5+
type: string
6+
- name: projects
7+
type: object
8+
9+
jobs:
10+
- job: Create_DT_Project
11+
displayName: Create Dependency Track Project
12+
steps:
13+
- checkout: none
14+
15+
- bash: |
16+
project_id=$(curl --no-progress-meter -H "X-Api-Key: $(DT_API_KEY)" "$(DT_API_URL)/v1/project/lookup?name=${{ parameters.projectName }}&version=${{ parameters.umbracoVersion }}" | jq -r '.uuid')
17+
if [ "$project_id" != "null" ] && [ -n "$project_id" ]; then
18+
echo "Project '${{ parameters.projectName }}' with version '${{ parameters.umbracoVersion }}' already exists (ID: $project_id)."
19+
else
20+
project_id=$(curl --no-progress-meter \
21+
-X PUT "$(DT_API_URL)/v1/project" \
22+
-H "X-Api-Key: $(DT_API_KEY)" \
23+
-H "Content-Type: application/json" \
24+
-d '{"name": "${{ parameters.projectName }}", "version": "${{ parameters.umbracoVersion }}", "collectionLogic": "AGGREGATE_DIRECT_CHILDREN"}' \
25+
| jq -r '.uuid')
26+
if [ -z "$project_id" ] || [ "$project_id" == "null" ]; then
27+
echo "Failed to create project '${{ parameters.projectName }}' version '${{ parameters.umbracoVersion }}'."
28+
exit 1
29+
fi
30+
echo "Created project '${{ parameters.projectName }}' with version '${{ parameters.umbracoVersion }}' (ID: $project_id)."
31+
fi
32+
displayName: Ensure main project exists in Dependency Track
33+
34+
- ${{ each project in parameters.projects }}:
35+
- job:
36+
displayName: Upload ${{ project.name }} BOM
37+
dependsOn: Create_DT_Project
38+
steps:
39+
- checkout: none
40+
41+
- download: current
42+
artifact: ${{ project.artifact }}
43+
displayName: Download ${{ project.artifact }} artifact
44+
45+
- script: |
46+
curl --no-progress-meter --fail-with-body \
47+
-X POST "$(DT_API_URL)/v1/bom" \
48+
-H "X-Api-Key: $(DT_API_KEY)" \
49+
-H "Content-Type: multipart/form-data" \
50+
-F "autoCreate=true" \
51+
-F "projectName=${{ parameters.projectName }}-${{ project.name }}" \
52+
-F "projectVersion=${{ parameters.umbracoVersion }}" \
53+
-F "parentName=${{ parameters.projectName }}" \
54+
-F "parentVersion=${{ parameters.umbracoVersion }}" \
55+
-F "bom=@$(Pipeline.Workspace)/${{ project.artifact }}/${{ project.bomFilePath }}"
56+
displayName: Upload ${{ project.name }} BOM to Dependency Track

build/templates/e2e-install.yml

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
parameters:
2+
- name: nodeVersion
3+
type: string
4+
default: ''
5+
6+
- name: npm_config_cache
7+
type: string
8+
default: ''
9+
10+
- name: PlaywrightUserEmail
11+
type: string
12+
default: ''
13+
14+
- name: PlaywrightPassword
15+
type: string
16+
default: ''
17+
18+
- name: ASPNETCORE_URLS
19+
type: string
20+
default: ''
21+
22+
steps:
23+
- task: NodeTool@0
24+
displayName: Use Node.js $(nodeVersion)
25+
inputs:
26+
versionSpec: $(nodeVersion)
27+
28+
- pwsh: |
29+
"UMBRACO_USER_LOGIN=${{ parameters.PlaywrightUserEmail }}
30+
UMBRACO_USER_PASSWORD=${{ parameters.PlaywrightPassword }}
31+
URL=${{ parameters.ASPNETCORE_URLS }}" | Out-File .env
32+
displayName: Generate .env
33+
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
34+
35+
# Cache and restore NPM packages
36+
- task: Cache@2
37+
displayName: Cache NPM packages
38+
inputs:
39+
key: 'npm_e2e | "$(Agent.OS)" | $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/package-lock.json'
40+
restoreKeys: |
41+
npm_e2e | "$(Agent.OS)"
42+
npm_e2e
43+
path: ${{ parameters.npm_config_cache }}
44+
45+
- script: npm ci --no-fund --no-audit --prefer-offline
46+
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
47+
displayName: Restore NPM packages

0 commit comments

Comments
 (0)