Skip to content

Commit 63de19d

Browse files
authored
Merge pull request #33 from microsoft/dev/saurabh/sync
Sync ADO with GH
2 parents e374c4a + ccdd41c commit 63de19d

66 files changed

Lines changed: 5204 additions & 418 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.pipeline/sync-container-images.yml

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ stages:
118118
steps:
119119
- checkout: none
120120
- task: AzureCLI@2
121-
displayName: 'Import manylinux x64'
121+
displayName: 'Import manylinux_2_34 x64'
122122
inputs:
123123
azureSubscription: 'Magnitude Test'
124124
scriptType: 'bash'
@@ -131,7 +131,7 @@ stages:
131131
--force
132132
retryCountOnTaskFailure: 3
133133
- task: AzureCLI@2
134-
displayName: 'Import manylinux arm64'
134+
displayName: 'Import manylinux_2_34 arm64'
135135
inputs:
136136
azureSubscription: 'Magnitude Test'
137137
scriptType: 'bash'
@@ -143,6 +143,32 @@ stages:
143143
--image import/python-build/manylinux_2_34_aarch64:latest \
144144
--force
145145
retryCountOnTaskFailure: 3
146+
- task: AzureCLI@2
147+
displayName: 'Import manylinux_2_28 x64'
148+
inputs:
149+
azureSubscription: 'Magnitude Test'
150+
scriptType: 'bash'
151+
scriptLocation: 'inlineScript'
152+
inlineScript: |
153+
az acr import \
154+
--name $(ACR_NAME) \
155+
--source quay.io/pypa/manylinux_2_28_x86_64:latest \
156+
--image import/python-build/manylinux_2_28_x86_64:latest \
157+
--force
158+
retryCountOnTaskFailure: 3
159+
- task: AzureCLI@2
160+
displayName: 'Import manylinux_2_28 arm64'
161+
inputs:
162+
azureSubscription: 'Magnitude Test'
163+
scriptType: 'bash'
164+
scriptLocation: 'inlineScript'
165+
inlineScript: |
166+
az acr import \
167+
--name $(ACR_NAME) \
168+
--source quay.io/pypa/manylinux_2_28_aarch64:latest \
169+
--image import/python-build/manylinux_2_28_aarch64:latest \
170+
--force
171+
retryCountOnTaskFailure: 3
146172

147173
# -----------------------------------------------------------------------------
148174
# Sync Stage 2: PyPA musllinux images (quay.io - no Docker Hub rate limit)
@@ -821,7 +847,7 @@ stages:
821847
echo "======================================================"
822848
echo "Vanilla PyPA Base Images:"
823849
echo "======================================================"
824-
for image in import/python-build/manylinux_2_34_x86_64 import/python-build/manylinux_2_34_aarch64 import/python-build/musllinux_1_2_x86_64 import/python-build/musllinux_1_2_aarch64; do
850+
for image in import/python-build/manylinux_2_34_x86_64 import/python-build/manylinux_2_34_aarch64 import/python-build/manylinux_2_28_x86_64 import/python-build/manylinux_2_28_aarch64 import/python-build/musllinux_1_2_x86_64 import/python-build/musllinux_1_2_aarch64; do
825851
echo ""
826852
echo "==> $image"
827853
az acr repository show-tags --name $(ACR_NAME) --repository $image --output table --orderby time_desc --top 3 || echo " (not found)"
@@ -871,10 +897,12 @@ stages:
871897
echo ""
872898
echo "Available images in ACR:"
873899
echo " Vanilla PyPA base images:"
874-
echo " - $(ACR_REGISTRY)/python-build/manylinux_2_34_x86_64:latest"
875-
echo " - $(ACR_REGISTRY)/python-build/manylinux_2_34_aarch64:latest"
876-
echo " - $(ACR_REGISTRY)/python-build/musllinux_1_2_x86_64:latest"
877-
echo " - $(ACR_REGISTRY)/python-build/musllinux_1_2_aarch64:latest"
900+
echo " - $(ACR_REGISTRY)/import/python-build/manylinux_2_34_x86_64:latest"
901+
echo " - $(ACR_REGISTRY)/import/python-build/manylinux_2_34_aarch64:latest"
902+
echo " - $(ACR_REGISTRY)/import/python-build/manylinux_2_28_x86_64:latest"
903+
echo " - $(ACR_REGISTRY)/import/python-build/manylinux_2_28_aarch64:latest"
904+
echo " - $(ACR_REGISTRY)/import/python-build/musllinux_1_2_x86_64:latest"
905+
echo " - $(ACR_REGISTRY)/import/python-build/musllinux_1_2_aarch64:latest"
878906
echo ""
879907
echo " Custom images with Rust (RECOMMENDED FOR CI/CD):"
880908
echo " - $(ACR_REGISTRY)/python-build/manylinux_2_34_x86_64_rust:latest"

.pipeline/templates/build-template-container.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ parameters:
3737
default: ''
3838

3939
steps:
40+
- template: generate-sql-password-template.yml
41+
parameters:
42+
osType: Linux
43+
4044
- task: DockerInstaller@0
4145
inputs:
4246
dockerVersion: '29.0.0'

.pipeline/templates/build-template.yml

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -36,26 +36,41 @@ parameters:
3636
type: boolean
3737
default: true
3838

39+
- name: enableRustBuild
40+
displayName: Enable standalone Rust Debug/Release build steps
41+
type: boolean
42+
default: true
43+
44+
- name: enableClippy
45+
displayName: Enable Rust Clippy lint step
46+
type: boolean
47+
default: true
48+
3949
steps:
50+
- template: generate-sql-password-template.yml
51+
parameters:
52+
osType: ${{ parameters.osType }}
53+
4054
- script: cargo fetch
4155
displayName: Fetch Crates
4256

43-
- script: |
44-
cargo build --frozen 2>&1
45-
displayName: Rust Debug Build
46-
condition: and(succeeded(), or(eq('${{parameters.buildType}}', 'Debug'), eq('${{parameters.buildType}}', 'Both')), eq(variables['Build.Reason'], 'PullRequest'))
57+
- ${{ if eq(parameters.enableRustBuild, true) }}:
58+
- script: |
59+
cargo build --frozen 2>&1
60+
displayName: Rust Debug Build
61+
condition: and(succeeded(), or(eq('${{parameters.buildType}}', 'Debug'), eq('${{parameters.buildType}}', 'Both')), eq(variables['Build.Reason'], 'PullRequest'))
4762
48-
- script: |
49-
cargo build --frozen --release 2>&1
50-
displayName: Rust Release Build
51-
condition: and(succeeded(), or(eq('${{parameters.buildType}}', 'Release'), eq('${{parameters.buildType}}', 'Both')), eq(variables['Build.Reason'], 'PullRequest'))
63+
- script: |
64+
cargo build --frozen --release 2>&1
65+
displayName: Rust Release Build
66+
condition: and(succeeded(), or(eq('${{parameters.buildType}}', 'Release'), eq('${{parameters.buildType}}', 'Both')), eq(variables['Build.Reason'], 'PullRequest'))
5267
53-
- ${{ if eq(parameters.osType, 'Windows') }}:
68+
- ${{ if and(eq(parameters.enableClippy, true), eq(parameters.osType, 'Windows')) }}:
5469
- pwsh: ./scripts/bclippy.ps1
5570
displayName: Rust Clippy Lint (workspace + mssql-py-core)
5671
condition: and(succeeded(), or(eq('${{parameters.buildType}}', 'Release'), eq('${{parameters.buildType}}', 'Both')), eq(variables['Build.Reason'], 'PullRequest'))
5772

58-
- ${{ if ne(parameters.osType, 'Windows') }}:
73+
- ${{ if and(eq(parameters.enableClippy, true), ne(parameters.osType, 'Windows')) }}:
5974
- script: ./scripts/bclippy.sh
6075
displayName: Rust Clippy Lint (workspace + mssql-py-core)
6176
condition: and(succeeded(), or(eq('${{parameters.buildType}}', 'Release'), eq('${{parameters.buildType}}', 'Both')), eq(variables['Build.Reason'], 'PullRequest'))
@@ -160,25 +175,26 @@ steps:
160175
summaryFileLocation: "$(Build.SourcesDirectory)/target/lcov.info"
161176
pathToSources: "$(Build.SourcesDirectory)"
162177

163-
- task: CopyFiles@2
164-
displayName: Copy Rust Debug Build
165-
condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'), or(eq('${{parameters.buildType}}', 'Debug'), eq('${{parameters.buildType}}', 'Both')))
166-
inputs:
167-
SourceFolder: '$(CARGO_TARGET_DIR)/debug'
168-
Contents: |
169-
*
170-
!.cargo-lock
171-
TargetFolder: '$(Build.ArtifactStagingDirectory)/debug'
172-
173-
- task: CopyFiles@2
174-
displayName: Copy Rust Release Build
175-
condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'), or( eq('${{parameters.buildType}}', 'Release'), eq('${{parameters.buildType}}', 'Both')))
176-
inputs:
177-
SourceFolder: '$(CARGO_TARGET_DIR)/release'
178-
Contents: |
179-
*
180-
!.cargo-lock
181-
TargetFolder: '$(Build.ArtifactStagingDirectory)/release'
178+
- ${{ if eq(parameters.enableRustBuild, true) }}:
179+
- task: CopyFiles@2
180+
displayName: Copy Rust Debug Build
181+
condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'), or(eq('${{parameters.buildType}}', 'Debug'), eq('${{parameters.buildType}}', 'Both')))
182+
inputs:
183+
SourceFolder: '$(CARGO_TARGET_DIR)/debug'
184+
Contents: |
185+
*
186+
!.cargo-lock
187+
TargetFolder: '$(Build.ArtifactStagingDirectory)/debug'
188+
189+
- task: CopyFiles@2
190+
displayName: Copy Rust Release Build
191+
condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'), or( eq('${{parameters.buildType}}', 'Release'), eq('${{parameters.buildType}}', 'Both')))
192+
inputs:
193+
SourceFolder: '$(CARGO_TARGET_DIR)/release'
194+
Contents: |
195+
*
196+
!.cargo-lock
197+
TargetFolder: '$(Build.ArtifactStagingDirectory)/release'
182198

183199
- ${{ if eq(parameters.enableJsBuild, true) }}:
184200
- bash: |

.pipeline/templates/cargo-authenticate-template.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ steps:
1515
- ${{ if eq(parameters.osType, 'Windows') }}:
1616
- pwsh: .pipeline/scripts/apply-ci-cargo-config.ps1
1717
displayName: Apply CI cargo configuration
18+
condition: ne(variables['Build.Reason'], 'PullRequest')
1819

1920
- ${{ if ne(parameters.osType, 'Windows') }}:
2021
- script: bash .pipeline/scripts/apply-ci-cargo-config.sh
2122
displayName: Apply CI cargo configuration
23+
condition: ne(variables['Build.Reason'], 'PullRequest')
2224

2325
- task: CargoAuthenticate@0
2426
inputs:
2527
configFile: '.cargo/config.toml'
2628
displayName: Authenticate cargo registries
29+
condition: ne(variables['Build.Reason'], 'PullRequest')
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Generates a strong random SQL Server password and exposes it as the
2+
# job-scoped runtime variable SQL_PASSWORD (secret-masked in logs).
3+
#
4+
# Idempotent within a single job: a non-secret marker variable
5+
# SQL_PASSWORD_GENERATED is set on first run and inspected on subsequent
6+
# invocations, so including this template from multiple step-templates
7+
# in the same job will only generate the password once.
8+
#
9+
# Subsequent steps in the job consume the value via the standard
10+
# `$(SQL_PASSWORD)` macro syntax — no caller changes required.
11+
12+
parameters:
13+
- name: osType
14+
type: string
15+
default: Linux
16+
values:
17+
- Windows
18+
- Linux
19+
- MacOS
20+
21+
steps:
22+
- ${{ if eq(parameters.osType, 'Windows') }}:
23+
- task: PowerShell@2
24+
displayName: 'Generate SQL_PASSWORD (job-scoped)'
25+
inputs:
26+
targetType: 'inline'
27+
script: |
28+
$ErrorActionPreference = 'Stop'
29+
if ($env:SQL_PASSWORD_GENERATED -eq '1') {
30+
Write-Host 'SQL_PASSWORD already generated for this job; skipping'
31+
exit 0
32+
}
33+
$bytes = New-Object byte[] 24
34+
$rng = [System.Security.Cryptography.RandomNumberGenerator]::Create()
35+
try {
36+
$rng.GetBytes($bytes)
37+
$rand = ([Convert]::ToBase64String($bytes)) -replace '[+/=]',''
38+
while ($rand.Length -lt 22) {
39+
$rng.GetBytes($bytes)
40+
$rand = $rand + (([Convert]::ToBase64String($bytes)) -replace '[+/=]','')
41+
}
42+
} finally {
43+
$rng.Dispose()
44+
}
45+
$rand = $rand.Substring(0, 22)
46+
# Prepend a known mix to guarantee SQL Server password-policy classes.
47+
$pwd = 'Aa1!' + $rand
48+
Write-Host "##vso[task.setvariable variable=SQL_PASSWORD;issecret=true]$pwd"
49+
Write-Host "##vso[task.setvariable variable=SQL_PASSWORD_GENERATED]1"
50+
Write-Host "Generated SQL_PASSWORD (length=$($pwd.Length))"
51+
52+
- ${{ if ne(parameters.osType, 'Windows') }}:
53+
- bash: |
54+
set -euo pipefail
55+
if [ "${SQL_PASSWORD_GENERATED:-}" = "1" ]; then
56+
echo "SQL_PASSWORD already generated for this job; skipping"
57+
exit 0
58+
fi
59+
rand=$(openssl rand -base64 24 | tr -d '=+/' | head -c 22)
60+
while [ "${#rand}" -lt 22 ]; do
61+
rand="${rand}$(openssl rand -base64 24 | tr -d '=+/' | head -c 4)"
62+
done
63+
rand="${rand:0:22}"
64+
# Prepend a known mix to guarantee SQL Server password-policy classes.
65+
pwd="Aa1!${rand}"
66+
echo "##vso[task.setvariable variable=SQL_PASSWORD;issecret=true]${pwd}"
67+
echo "##vso[task.setvariable variable=SQL_PASSWORD_GENERATED]1"
68+
echo "Generated SQL_PASSWORD (length=${#pwd})"
69+
displayName: 'Generate SQL_PASSWORD (job-scoped)'

.pipeline/templates/sql-setup-template.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ parameters:
88
- MacOS
99

1010
steps:
11+
- template: generate-sql-password-template.yml
12+
parameters:
13+
osType: ${{ parameters.buildTarget }}
14+
1115
- ${{ if eq(parameters.buildTarget, 'Windows') }}:
1216
- task: PowerShell@2
1317
displayName: 'Generate Certificate for TLS encryption '

.pipeline/templates/test-longhaul-template.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ parameters:
1313
default: 1000
1414

1515
steps:
16+
- template: generate-sql-password-template.yml
17+
parameters:
18+
osType: Linux
19+
1620
- task: DockerInstaller@0
1721
inputs:
1822
dockerVersion: '29.0.0'

.pipeline/templates/test-matrix-template-alpine.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ jobs:
1515
demands:
1616
- ${{ parameters.poolImageOverride }}
1717
steps:
18+
- template: generate-sql-password-template.yml
19+
parameters:
20+
osType: Linux
1821
- task: DockerInstaller@0
1922
inputs:
2023
dockerVersion: '29.0.0'

.pipeline/templates/test-matrix-template-alpine_arm64.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ jobs:
1414
demands:
1515
- ${{ parameters.poolImageOverride }}
1616
steps:
17+
- template: generate-sql-password-template.yml
18+
parameters:
19+
osType: Linux
1720
- task: DockerInstaller@0
1821
inputs:
1922
dockerVersion: '29.0.0'

.pipeline/templates/test-matrix-template-arm64.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ jobs:
1212
demands:
1313
- imageOverride -equals RUST-UBUNTU-ARM64
1414
steps:
15+
- template: generate-sql-password-template.yml
16+
parameters:
17+
osType: Linux
1518
- task: DockerInstaller@0
1619
inputs:
1720
dockerVersion: '29.0.0'

0 commit comments

Comments
 (0)