Skip to content

Commit 49986ec

Browse files
Add extension PR builds with registry and install comment
- Add publish-extension-pr.yml stage for PR builds - Add update-extension-pr-registry.yml step for per-extension PR registry - Wire PR publish into release-azd-extension.yml pipeline - Add PR number validation guard for empty/unexpanded values - Add unsigned binary warning to PR comment - Add ConvertTo-JsonSafeString for JSON-safe template replacements - Bump azure.ai.agents version to 0.1.22-preview Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent fdb24a5 commit 49986ec

6 files changed

Lines changed: 179 additions & 7 deletions

File tree

cli/azd/extensions/azure.ai.agents/extension.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ displayName: Foundry agents (Preview)
55
description: Ship agents with Microsoft Foundry from your terminal. (Preview)
66
usage: azd ai agent <command> [options]
77
# NOTE: Make sure version.txt is in sync with this version.
8-
version: 0.1.21-preview
8+
version: 0.1.22-preview
99
requiredAzdVersion: ">1.23.13"
1010
language: go
1111
capabilities:
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.1.21-preview
1+
0.1.22-preview
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
parameters:
2+
- name: SanitizedExtensionId
3+
type: string
4+
- name: AzdExtensionId
5+
type: string
6+
7+
stages:
8+
- stage: PublishForPR
9+
dependsOn: Sign
10+
condition: >-
11+
and(
12+
succeeded(),
13+
ne(variables['Skip.Release'], 'true'),
14+
or(
15+
eq('PullRequest', variables['BuildReasonOverride']),
16+
and(
17+
eq('', variables['BuildReasonOverride']),
18+
eq(variables['Build.Reason'], 'PullRequest')
19+
)
20+
)
21+
)
22+
23+
variables:
24+
- template: /eng/pipelines/templates/variables/image.yml
25+
- template: /eng/pipelines/templates/variables/globals.yml
26+
27+
jobs:
28+
- deployment: Publish_Extension_For_PR
29+
environment: none
30+
31+
pool:
32+
name: azsdk-pool
33+
image: ubuntu-22.04
34+
os: linux
35+
36+
templateContext:
37+
type: releaseJob
38+
isProduction: false
39+
inputs:
40+
- input: pipelineArtifact
41+
artifactName: release
42+
targetPath: release
43+
- input: pipelineArtifact
44+
artifactName: release-metadata
45+
targetPath: release-metadata
46+
47+
strategy:
48+
runOnce:
49+
deploy:
50+
steps:
51+
- pwsh: |
52+
$PRNumber = '$(System.PullRequest.PullRequestNumber)'
53+
if ($env:PRNUMBEROVERRIDE) {
54+
Write-Host "PR Number override: $($env:PRNUMBEROVERRIDE)"
55+
$PRNumber = "$($env:PRNUMBEROVERRIDE)"
56+
}
57+
if (-not $PRNumber -or $PRNumber -match '^\$\(') {
58+
Write-Error "PR number could not be determined. Ensure this runs in a PR build or set PRNUMBEROVERRIDE."
59+
exit 1
60+
}
61+
Write-Host "##vso[task.setvariable variable=PRNumber]$PRNumber"
62+
displayName: Set PR Number Variable
63+
64+
- template: /eng/pipelines/templates/steps/extension-set-metadata-variables.yml
65+
parameters:
66+
Use1ESArtifactTask: true
67+
68+
- template: /eng/pipelines/templates/steps/publish-extension.yml
69+
parameters:
70+
PublishUploadLocations: ${{ parameters.SanitizedExtensionId }}/pr/$(PRNumber)
71+
CreateGitHubRelease: false
72+
73+
- template: /eng/pipelines/templates/steps/update-extension-pr-registry.yml
74+
parameters:
75+
SanitizedExtensionId: ${{ parameters.SanitizedExtensionId }}
76+
AzdExtensionId: ${{ parameters.AzdExtensionId }}
77+
PRNumber: $(PRNumber)
78+
79+
- pwsh: |
80+
$storageHost = "$(publish-storage-static-host)"
81+
$extId = "${{ parameters.AzdExtensionId }}"
82+
$sanitizedId = "${{ parameters.SanitizedExtensionId }}"
83+
$prNumber = "$(PRNumber)"
84+
$registryUrl = "$storageHost/azd/extensions/pr-registry-entries/$prNumber/$extId.json"
85+
$binaryBase = "$storageHost/azd/extensions/$sanitizedId/pr/$prNumber"
86+
87+
$content = @"
88+
<!-- #comment-ext-pr-$extId -->
89+
## azd Extension Install Instructions — ``$extId``
90+
91+
> :warning: **These are unsigned PR builds for testing only.** Do not use in production.
92+
93+
### Install from PR build
94+
95+
``````bash
96+
azd ext source add -n pr-$prNumber -t url -l "$registryUrl"
97+
azd ext install $extId --source pr-$prNumber
98+
``````
99+
100+
### Standalone Binaries
101+
102+
| Platform | Download |
103+
|----------|----------|
104+
| Linux x86_64 | $binaryBase/$sanitizedId-linux-amd64.tar.gz |
105+
| Linux ARM64 | $binaryBase/$sanitizedId-linux-arm64.tar.gz |
106+
| macOS x86_64 | $binaryBase/$sanitizedId-darwin-amd64.zip |
107+
| macOS ARM64 | $binaryBase/$sanitizedId-darwin-arm64.zip |
108+
| Windows x86_64 | $binaryBase/$sanitizedId-windows-amd64.zip |
109+
| Windows ARM64 | $binaryBase/$sanitizedId-windows-arm64.zip |
110+
"@
111+
$file = New-TemporaryFile
112+
Set-Content -Path $file -Value $content
113+
Write-Host "##vso[task.setvariable variable=CommentBodyFile]$file"
114+
displayName: Generate PR comment body
115+
116+
- template: /eng/pipelines/templates/steps/update-prcomment.yml
117+
parameters:
118+
PrNumber: $(PRNumber)
119+
BodyFile: $(CommentBodyFile)
120+
Tag: '<!-- #comment-ext-pr-${{ parameters.AzdExtensionId }} -->'

eng/pipelines/templates/stages/release-azd-extension.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,14 @@ stages:
9595
parameters:
9696
SanitizedExtensionId: ${{ parameters.SanitizedExtensionId }}
9797
AzdExtensionId: ${{ parameters.AzdExtensionId }}
98+
99+
# Publish PR builds to storage and post install instructions as PR comment
100+
- ${{ if and(eq(variables['System.TeamProject'], 'internal'), eq(variables['Build.Reason'], 'PullRequest')) }}:
101+
- template: /eng/pipelines/templates/stages/sign-extension.yml
102+
parameters:
103+
SanitizedExtensionId: ${{ parameters.SanitizedExtensionId }}
104+
105+
- template: /eng/pipelines/templates/stages/publish-extension-pr.yml
106+
parameters:
107+
SanitizedExtensionId: ${{ parameters.SanitizedExtensionId }}
108+
AzdExtensionId: ${{ parameters.AzdExtensionId }}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
parameters:
2+
- name: SanitizedExtensionId
3+
type: string
4+
- name: AzdExtensionId
5+
type: string
6+
- name: PRNumber
7+
type: string
8+
9+
steps:
10+
- task: AzurePowerShell@5
11+
displayName: Upload per-extension PR registry entry
12+
inputs:
13+
azureSubscription: 'Azure SDK Artifacts'
14+
azurePowerShellVersion: LatestVersion
15+
pwsh: true
16+
ScriptType: InlineScript
17+
Inline: |
18+
$storageHost = "$(publish-storage-static-host)"
19+
$prBaseUrl = "$storageHost/azd/extensions/${{ parameters.SanitizedExtensionId }}/pr/${{ parameters.PRNumber }}"
20+
$entryBlobPath = "$(publish-storage-location)/`$web/azd/extensions/pr-registry-entries/${{ parameters.PRNumber }}/${{ parameters.AzdExtensionId }}.json"
21+
$templatePath = "release-metadata/extensions-registry-daily.json.template"
22+
23+
& "release-metadata/Update-ExtensionDailyRegistry.ps1" `
24+
-SanitizedExtensionId "${{ parameters.SanitizedExtensionId }}" `
25+
-AzdExtensionId "${{ parameters.AzdExtensionId }}" `
26+
-Version "$(EXT_VERSION)" `
27+
-StorageBaseUrl $prBaseUrl `
28+
-RegistryEntryBlobPath $entryBlobPath `
29+
-TemplatePath $templatePath `
30+
-ReleasePath "release" `
31+
-MetadataPath "release-metadata"
32+
env:
33+
AZCOPY_AUTO_LOGIN_TYPE: 'PSCRED'

eng/scripts/Update-ExtensionDailyRegistry.ps1

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,21 @@ Write-Host " capabilities: $($capabilities -join ', ')"
151151
Write-Host " providers: $($providers.Count)"
152152

153153
# Load template and replace placeholders
154+
# JSON-escape string values that are inserted into JSON string literals.
155+
# This prevents characters like " \ and control chars from producing invalid JSON.
156+
function ConvertTo-JsonSafeString([string]$value) {
157+
# Use ConvertTo-Json to get a properly escaped JSON string, then strip the surrounding quotes
158+
$escaped = $value | ConvertTo-Json
159+
return $escaped.Substring(1, $escaped.Length - 2)
160+
}
161+
154162
$template = Get-Content $TemplatePath -Raw
155163
$replacements = @{
156-
'${EXT_VERSION}' = $Version
157-
'${REQUIRED_AZD_VERSION}' = if ($extMeta.requiredAzdVersion) { $extMeta.requiredAzdVersion } else { "" }
158-
'${USAGE}' = $extMeta.usage
159-
'${SANITIZED_ID}' = $SanitizedExtensionId
160-
'${STORAGE_BASE_URL}' = $StorageBaseUrl
164+
'${EXT_VERSION}' = ConvertTo-JsonSafeString $Version
165+
'${REQUIRED_AZD_VERSION}' = ConvertTo-JsonSafeString ($(if ($extMeta.requiredAzdVersion) { $extMeta.requiredAzdVersion } else { "" }))
166+
'${USAGE}' = ConvertTo-JsonSafeString $extMeta.usage
167+
'${SANITIZED_ID}' = ConvertTo-JsonSafeString $SanitizedExtensionId
168+
'${STORAGE_BASE_URL}' = ConvertTo-JsonSafeString $StorageBaseUrl
161169
'${CHECKSUM_DARWIN_AMD64}' = $checksums["DARWIN_AMD64"]
162170
'${CHECKSUM_DARWIN_ARM64}' = $checksums["DARWIN_ARM64"]
163171
'${CHECKSUM_LINUX_AMD64}' = $checksums["LINUX_AMD64"]

0 commit comments

Comments
 (0)