Skip to content

Commit ba7459f

Browse files
committed
Add EngSys from djurek/esrp-publish
1 parent 44d4d3c commit ba7459f

20 files changed

+712
-421
lines changed

eng/common/pipelines/templates/archetype-typespec-emitter.yml

Lines changed: 72 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -137,17 +137,56 @@ extends:
137137
$sourceBranch = '$(Build.SourceBranch)'
138138
$buildReason = '$(Build.Reason)'
139139
$buildNumber = '$(Build.BuildNumber)'
140+
$emitterPackagePath = '${{ parameters.EmitterPackagePath }}'
141+
142+
# Create emitter identifier from package path for disambiguation
143+
$emitterIdentifier = ""
144+
if (-not [string]::IsNullOrWhiteSpace($emitterPackagePath)) {
145+
# Resolve emitterPackagePath to absolute path (it's relative to repo root)
146+
# EmitterPackagePath is a directory, so append package.json
147+
$absoluteEmitterPackagePath = Join-Path '$(Build.SourcesDirectory)' $emitterPackagePath
148+
$packageJsonPath = Join-Path $absoluteEmitterPackagePath 'package.json'
149+
150+
# Read the package name from package.json
151+
if (Test-Path $packageJsonPath) {
152+
try {
153+
$packageJson = Get-Content $packageJsonPath -Raw | ConvertFrom-Json
154+
if ($packageJson.name) {
155+
$emitterIdentifier = $packageJson.name
156+
}
157+
} catch {
158+
Write-Host "Warning: Could not read package name from $packageJsonPath"
159+
}
160+
}
161+
162+
# If we still don't have an identifier, fall back to filename
163+
if ([string]::IsNullOrWhiteSpace($emitterIdentifier)) {
164+
Write-Host "Warning: Could not read emitter name from package.json, falling back to package path"
165+
$emitterIdentifier = [System.IO.Path]::GetFileNameWithoutExtension($emitterPackagePath)
166+
}
167+
168+
# Clean up the identifier: remove @ prefix, replace invalid chars
169+
$emitterIdentifier = $emitterIdentifier -replace '^@', ''
170+
$emitterIdentifier = $emitterIdentifier -replace '[^a-zA-Z0-9\-_/]', '-'
171+
$emitterIdentifier = $emitterIdentifier.Trim('-').ToLower()
172+
173+
if (-not [string]::IsNullOrWhiteSpace($emitterIdentifier)) {
174+
$emitterIdentifier = "-$emitterIdentifier"
175+
}
176+
}
140177
141178
if ($buildReason -eq 'Schedule') {
142-
$branchName = 'validate-typespec-scheduled'
179+
$branchName = "validate-typespec-scheduled$emitterIdentifier"
143180
} elseif ($sourceBranch -match "^refs/pull/(\d+)/(head|merge)$") {
144-
$branchName = "validate-typespec-pr-$($Matches[1])"
181+
$branchName = "validate-typespec-pr-$($Matches[1])$emitterIdentifier"
145182
} else {
146-
$branchName = "validate-typespec-$buildNumber"
183+
$branchName = "validate-typespec-$buildNumber$emitterIdentifier"
147184
}
148185
149186
Write-Host "Setting variable 'branchName' to '$branchName'"
150187
Write-Host "##vso[task.setvariable variable=branchName;isOutput=true]$branchName"
188+
Write-Host "Setting variable 'emitterIdentifier' to '$emitterIdentifier'"
189+
Write-Host "##vso[task.setvariable variable=emitterIdentifier;isOutput=true]$emitterIdentifier"
151190
displayName: Set branch name
152191
name: set_branch_name
153192
@@ -259,27 +298,34 @@ extends:
259298
displayName: Download pipeline artifacts
260299

261300
- pwsh: |
262-
npm install -g @azure-tools/typespec-client-generator-cli@latest
301+
npm ci
263302
displayName: Install tsp-client
303+
workingDirectory: $(Build.SourcesDirectory)/eng/common/tsp-client
264304
265305
- pwsh: |
306+
# Resolve EmitterPackageJsonOutputPath to absolute path if it's relative
307+
$emitterPath = '${{ parameters.EmitterPackageJsonOutputPath }}'
308+
if (-not [System.IO.Path]::IsPathRooted($emitterPath)) {
309+
$emitterPath = Join-Path '$(Build.SourcesDirectory)' $emitterPath
310+
}
311+
266312
Write-Host "Overrides location: $(buildArtifactsPath)/packages/overrides.json"
313+
Write-Host "Resolved emitter package path: $emitterPath"
267314
268315
if (Test-Path -Path '$(buildArtifactsPath)/packages/overrides.json') {
269316
Write-Host "Using overrides.json to generate emitter-package.json"
270-
tsp-client generate-config-files `
271-
--package-json '$(buildArtifactsPath)/lock-files/package.json' `
272-
--emitter-package-json-path '${{ parameters.EmitterPackageJsonOutputPath }}' `
273-
--overrides '$(buildArtifactsPath)/packages/overrides.json'
317+
npm exec --no -- tsp-client generate-config-files `
318+
--package-json '$(buildArtifactsPath)/lock-files/package.json' `
319+
--emitter-package-json-path "$emitterPath" `
320+
--overrides '$(buildArtifactsPath)/packages/overrides.json'
274321
} else {
275322
Write-Host "No overrides.json found. Running tsp-client without overrides."
276-
277-
tsp-client generate-config-files `
278-
--package-json '$(buildArtifactsPath)/lock-files/package.json' `
279-
--emitter-package-json-path '${{ parameters.EmitterPackageJsonOutputPath }}'
323+
npm exec --no -- tsp-client generate-config-files `
324+
--package-json '$(buildArtifactsPath)/lock-files/package.json' `
325+
--emitter-package-json-path "$emitterPath"
280326
}
281327
displayName: Generate emitter-package.json and emitter-package-lock files
282-
workingDirectory: $(Build.SourcesDirectory)
328+
workingDirectory: $(Build.SourcesDirectory)/eng/common/tsp-client
283329
284330
- ${{ parameters.InitializationSteps }}
285331

@@ -361,15 +407,18 @@ extends:
361407
displayName: Create PR
362408
dependsOn:
363409
- Generate
410+
condition: succeededOrFailed()
364411
variables:
365412
generateJobResult: $[dependencies.Generate.result]
366413
emitterVersion: $[stageDependencies.Build.Build.outputs['initialize.emitterVersion']]
414+
emitterIdentifier: $[stageDependencies.Build.Build.outputs['set_branch_name.emitterIdentifier']]
367415
steps:
368416
- template: /eng/common/pipelines/templates/steps/sparse-checkout.yml
369417

370418
- pwsh: |
371419
$generateJobResult = '$(generateJobResult)'
372420
$emitterVersion = '$(emitterVersion)'
421+
$emitterIdentifier = '$(emitterIdentifier)'
373422
$collectionUri = '$(System.CollectionUri)'
374423
$project = '$(System.TeamProject)'
375424
$definitionName = '$(Build.DefinitionName)'
@@ -381,6 +430,12 @@ extends:
381430
$buildNumber = '$(Build.BuildNumber)'
382431
$preRelease = '${{ parameters.BuildPrereleaseVersion }}' -eq 'true'
383432
433+
# Use emitterIdentifier for PR title (remove leading dash if present)
434+
$emitterName = "TypeSpec emitter"
435+
if (-not [string]::IsNullOrWhiteSpace($emitterIdentifier)) {
436+
$emitterName = $emitterIdentifier.TrimStart('-')
437+
}
438+
384439
$prBody = "Generated by $definitionName build [$buildNumber]($collectionUri/$project/_build/results?buildId=$buildId)<br/>"
385440
386441
if ($sourceBranch -match "^refs/heads/(.+)$") {
@@ -397,9 +452,9 @@ extends:
397452
$prTitle = "Scheduled code regeneration test"
398453
} else {
399454
if ($preRelease) {
400-
$prTitle = "Update TypeSpec emitter version to prerelease $emitterVersion"
455+
$prTitle = "Update $emitterName version to prerelease $emitterVersion"
401456
} else {
402-
$prTitle = "Update TypeSpec emitter version to $emitterVersion"
457+
$prTitle = "Update $emitterName version to $emitterVersion"
403458
}
404459
405460
if ($generateJobResult -ne 'Succeeded') {
@@ -424,7 +479,8 @@ extends:
424479
Write-Error "Build.Repository.Name not in the expected {Owner}/{Name} format"
425480
}
426481
427-
$openAsDraft = -not ($reason -eq 'IndividualCI' -and $sourceBranch -eq 'refs/heads/main')
482+
# Open PR as draft if generation failed, or if it's not an IndividualCI build from main
483+
$openAsDraft = ($generateJobResult -ne 'Succeeded') -or (-not ($reason -eq 'IndividualCI' -and $sourceBranch -eq 'refs/heads/main'))
428484
Write-Host "Setting OpenAsDraftBool = $openAsDraft"
429485
Write-Host "##vso[task.setvariable variable=OpenAsDraft]$openAsDraft"
430486
if ($openAsDraft) {

eng/common/pipelines/templates/steps/create-apireview.yml

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,47 @@
11
parameters:
2-
ArtifactPath: $(Build.ArtifactStagingDirectory)
3-
Artifacts: []
4-
ConfigFileDir: $(Build.ArtifactStagingDirectory)/PackageInfo
5-
MarkPackageAsShipped: false
6-
GenerateApiReviewForManualOnly: false
7-
ArtifactName: 'packages'
8-
PackageName: ''
9-
SourceRootPath: $(Build.SourcesDirectory)
2+
- name: ArtifactPath
3+
type: string
4+
default: $(Build.ArtifactStagingDirectory)
5+
- name: Artifacts
6+
type: object
7+
default: []
8+
- name: ConfigFileDir
9+
type: string
10+
default: $(Build.ArtifactStagingDirectory)/PackageInfo
11+
- name: MarkPackageAsShipped
12+
type: boolean
13+
default: false
14+
- name: GenerateApiReviewForManualOnly
15+
type: boolean
16+
default: false
17+
- name: ArtifactName
18+
type: string
19+
default: 'packages'
20+
- name: PackageName
21+
type: string
22+
default: ''
23+
- name: SourceRootPath
24+
type: string
25+
default: $(Build.SourcesDirectory)
26+
- name: PackageInfoFiles
27+
type: object
28+
default: []
1029

1130
steps:
12-
# ideally this should be done as initial step of a job in caller template
13-
# We can remove this step later once it is added in caller
14-
- template: /eng/common/pipelines/templates/steps/set-default-branch.yml
15-
parameters:
16-
WorkingDirectory: ${{ parameters.SourceRootPath }}
17-
1831
# Automatic API review is generated for a package when pipeline runs irrespective of how pipeline gets triggered.
19-
# Below condition ensures that API review is generated only for manual pipeline runs when flag GenerateApiReviewForManualOnly is set to true.
32+
# Below condition ensures that API review is generated only for manual pipeline runs when flag GenerateApiReviewForManualOnly is set to true.
2033
- ${{ if or(ne(parameters.GenerateApiReviewForManualOnly, true), eq(variables['Build.Reason'], 'Manual')) }}:
34+
# ideally this should be done as initial step of a job in caller template
35+
# We can remove this step later once it is added in caller
36+
- template: /eng/common/pipelines/templates/steps/set-default-branch.yml
37+
parameters:
38+
WorkingDirectory: ${{ parameters.SourceRootPath }}
39+
2140
- task: Powershell@2
2241
inputs:
2342
filePath: ${{ parameters.SourceRootPath }}/eng/common/scripts/Create-APIReview.ps1
2443
arguments: >
44+
-PackageInfoFiles ('${{ convertToJson(parameters.PackageInfoFiles) }}' | ConvertFrom-Json -NoEnumerate)
2545
-ArtifactList ('${{ convertToJson(parameters.Artifacts) }}' | ConvertFrom-Json | Select-Object Name)
2646
-ArtifactPath '${{parameters.ArtifactPath}}'
2747
-ArtifactName ${{ parameters.ArtifactName }}
@@ -31,7 +51,7 @@ steps:
3151
-DefaultBranch '$(DefaultBranch)'
3252
-ConfigFileDir '${{parameters.ConfigFileDir}}'
3353
-BuildId '$(Build.BuildId)'
34-
-RepoName '$(Build.Repository.Name)'
54+
-RepoName '$(Build.Repository.Name)'
3555
-MarkPackageAsShipped $${{parameters.MarkPackageAsShipped}}
3656
pwsh: true
3757
displayName: Create API Review

eng/common/pipelines/templates/steps/detect-api-changes.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ steps:
1010
$apiChangeDetectRequestUrl = "https://apiview.dev/api/PullRequests/CreateAPIRevisionIfAPIHasChanges"
1111
echo "##vso[task.setvariable variable=ApiChangeDetectRequestUrl]$apiChangeDetectRequestUrl"
1212
displayName: "Set API change detect request URL"
13-
condition: and(succeeded(), ${{ parameters.Condition}}, eq(variables['ApiChangeDetectRequestUrl'], ''))
13+
condition: and(succeededOrFailed(), ${{ parameters.Condition}}, eq(variables['ApiChangeDetectRequestUrl'], ''))
1414
1515
- task: Powershell@2
1616
inputs:
Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
parameters:
2-
PackageName: ''
3-
PackageNames: ''
4-
ServiceDirectory: ''
5-
TagSeparator: '_'
6-
TestPipeline: false
2+
- name: PackageName
3+
type: string
4+
default: ''
5+
- name: PackageNames
6+
type: string
7+
default: ''
8+
- name: ServiceDirectory
9+
type: string
10+
default: ''
11+
- name: TagSeparator
12+
type: string
13+
default: '_'
14+
- name: TestPipeline
15+
type: boolean
16+
default: false
17+
- name: ArtifactsJson
18+
type: string
19+
default: ''
720

821
steps:
9-
- ${{ if eq(parameters.TestPipeline, 'true') }}:
22+
- ${{ if eq(parameters.TestPipeline, true) }}:
1023
- task: PowerShell@2
1124
displayName: Prep template pipeline for release
1225
condition: and(succeeded(), ne(variables['Skip.SetTestPipelineVersion'], 'true'))
@@ -18,4 +31,5 @@ steps:
1831
-PackageNames '${{ coalesce(parameters.PackageName, parameters.PackageNames) }}'
1932
-ServiceDirectory '${{ parameters.ServiceDirectory }}'
2033
-TagSeparator '${{ parameters.TagSeparator }}'
34+
-ArtifactsJson '${{ parameters.ArtifactsJson }}'
2135
pwsh: true

0 commit comments

Comments
 (0)