Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion eng/pipelines/templates/common.yml
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,8 @@ extends:
- template: /eng/pipelines/templates/variables/image.yml
- template: /eng/pipelines/templates/variables/globals.yml
jobs:
- template: /eng/pipelines/templates/jobs/release.yml
# TODO: Revert to release.yml after Docker ARM64 testing
- template: /eng/pipelines/templates/jobs/release-anu.yml
parameters:
ServerName: ${{ parameters.ServerName }}
IncludeNative: false
Expand Down
10 changes: 5 additions & 5 deletions eng/pipelines/templates/jobs/docker/build-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ jobs:
strategy:
matrix: $[ ${{ parameters.ServerMatrix }}]
pool:
name: $(LINUXPOOL)
image: $(LINUXVMIMAGE)
name: $(Pool)
image: $(VMImage)
os: linux

steps:
Expand All @@ -30,7 +30,7 @@ jobs:
echo "Listing $(ArtifactPath) contents:"
ls -la "$(Pipeline.Workspace)/docker_staging/$(ArtifactPath)/"
echo ""
echo "Listing linux-x64 contents:"
echo "Listing $(Platform) contents:"
ls -la "$(Pipeline.Workspace)/docker_staging/$(ArtifactPath)/$(Platform)"
echo ""
echo "Listing dist contents:"
Expand Down Expand Up @@ -67,8 +67,8 @@ jobs:

# Save image as .tar
echo "Saving image"
docker save "$(DockerLocalTag)" -o "$(Build.ArtifactStagingDirectory)/$(CliName)-image.tar"
ls -lh "$(Build.ArtifactStagingDirectory)/$(CliName)-image.tar"
docker save "$(DockerLocalTag)" -o "$(Build.ArtifactStagingDirectory)/$(CliName)-$(Architecture)-image.tar"
ls -lh "$(Build.ArtifactStagingDirectory)/$(CliName)-$(Architecture)-image.tar"
displayName: Capture image digest and save as .tar

- task: 1ES.PublishPipelineArtifact@1
Expand Down
52 changes: 10 additions & 42 deletions eng/pipelines/templates/jobs/docker/release-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,45 +63,13 @@ jobs:
Write-Host "##vso[task.setvariable variable=DockerImageName;isOutput=true]$dockerImageName"
name: SetReleaseVariables
- script: |
set -euo pipefail
# Load image from tar
echo "Loading image tar for ${{ parameters.ServerName }}"
LOADED_IMAGE=$(docker load -i $(Pipeline.Workspace)/docker_output/$(SetReleaseVariables.CliName)-image.tar | grep -oP 'Loaded image: \K.*')
echo "Loaded image: $LOADED_IMAGE"
# Verify the loaded image exists
docker image inspect "$LOADED_IMAGE" >/dev/null 2>&1 || {
echo "ERROR: Loaded image $LOADED_IMAGE not found after load";
exit 1;
}
# Prepare tags
BASE_REPO="${{ parameters.ContainerRegistry }}.azurecr.io/${{ parameters.DeploymentEnvironment }}/$(SetReleaseVariables.DockerImageName)"
VERSIONED_TAG="$BASE_REPO:$(SetReleaseVariables.DockerImageVersion)"
LATEST_TAG="$BASE_REPO:latest"
echo "Tagging $LOADED_IMAGE as:"
echo " Versioned tag: $VERSIONED_TAG"
echo " Latest tag: $LATEST_TAG"
# Tag the images
docker tag "$LOADED_IMAGE" "$VERSIONED_TAG"
docker tag "$LOADED_IMAGE" "$LATEST_TAG"
# Verify tags exist before pushing
docker image inspect "$VERSIONED_TAG" >/dev/null 2>&1 || {
echo "ERROR: Versioned tag $VERSIONED_TAG not found after tagging";
exit 1;
}
docker image inspect "$LATEST_TAG" >/dev/null 2>&1 || {
echo "ERROR: Latest tag $LATEST_TAG not found after tagging";
exit 1;
}
# Push both tags
echo "Pushing versioned tag..."; docker push "$VERSIONED_TAG"
echo "Pushing latest tag..."; docker push "$LATEST_TAG"
echo "Publish complete for ${{ parameters.ServerName }}"
displayName: Load, tag, and push image
- task: PowerShell@2
displayName: Load, tag, and push Docker images
inputs:
pwsh: true
filePath: $(Build.SourcesDirectory)/eng/scripts/Publish-DockerImages.ps1
arguments: >
-CliName '$(SetReleaseVariables.CliName)'
-Version '$(SetReleaseVariables.DockerImageVersion)'
-BaseRepo '${{ parameters.ContainerRegistry }}.azurecr.io/${{ parameters.DeploymentEnvironment }}/$(SetReleaseVariables.DockerImageName)'
-TarDirectory '$(Pipeline.Workspace)/docker_output'
23 changes: 23 additions & 0 deletions eng/pipelines/templates/jobs/release-anu.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Temporary release pipeline for Docker ARM64 testing
# Only runs Docker release to azuresdkimages.azurecr.io/anu/...
# DELETE THIS FILE after testing is complete

parameters:
- name: ServerName
type: string
- name: IncludeNative
type: boolean
- name: PackageDocker
type: boolean
- name: PackageVSIX
type: boolean
- name: IsTestPipeline
type: boolean

jobs:
- ${{ if parameters.PackageDocker }}:
- template: /eng/pipelines/templates/jobs/docker/release-docker.yml
parameters:
ContainerRegistry: 'azuresdkimages'
DeploymentEnvironment: 'anu' # TODO: Revert to 'public' after Docker ARM64 testing
ServerName: ${{ parameters.ServerName }}
4 changes: 4 additions & 0 deletions eng/pipelines/templates/variables/image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@
variables:
- name: LINUXPOOL
value: azsdk-pool
- name: LINUXARMPOOL
value: azsdk-pool-arm64
- name: WINDOWSPOOL
value: azsdk-pool
- name: MACPOOL
value: Azure Pipelines

- name: LINUXVMIMAGE
value: ubuntu-24.04
- name: LINUXARMVMIMAGE
value: azure-linux-3-arm64
- name: WINDOWSVMIMAGE
value: windows-2022
- name: MACVMIMAGE
Expand Down
66 changes: 53 additions & 13 deletions eng/scripts/New-BuildInfo.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@ $additionalPlatforms = @(
trimmed = $false
specialPurpose = 'docker'
}
@{
name = 'linux-musl-arm64-docker'
operatingSystem = 'linux'
architecture = 'musl-arm64'
native = $false
trimmed = $false
specialPurpose = 'docker'
}
)

if ($IncludeNative) {
Expand Down Expand Up @@ -593,23 +601,55 @@ function Get-ServerMatrix {
Write-Host "Forming server matrix"

$serverMatrix = [ordered]@{}
$platformName = "linux-musl-x64-docker"

# MCP Servers that should build ARM64 Docker images in addition to default AMD64
$arm64DockerServers = @("Azure.Mcp.Server")

# Docker architecture configurations
$dockerArchConfigs = @(
@{
Architecture = 'amd64'
PlatformName = 'linux-musl-x64-docker'
Pool = '$(LINUXPOOL)'
VMImage = '$(LINUXVMIMAGE)'
}
@{
Architecture = 'arm64'
PlatformName = 'linux-musl-arm64-docker'
Pool = '$(LINUXARMPOOL)'
VMImage = '$(LINUXARMVMIMAGE)'
}
)

foreach ($server in $servers) {
$platform = $server.platforms | Where-Object { $_.name -eq $platformName -and -not $_.native }
$executableExtension = $platform.extension
$imageName = $server.dockerImageName
if (-not $platform.extension) { $executableExtension = '' }
if (-not $server.dockerImageName) { $imageName = "microsoft/" + $server.cliName + "-mcp" }
$serverMatrix[$server.name] = [ordered]@{
ServerName = $server.name
CliName = $server.cliName
ArtifactPath = $server.artifactPath
Platform = $platformName
Version = $server.version
ImageName = $imageName
ExecutableName = $server.cliName + $executableExtension
DockerLocalTag = $imageName + ":" + $BuildId

foreach ($archConfig in $dockerArchConfigs) {
if ($archConfig.Architecture -eq 'arm64' -and $arm64DockerServers -notcontains $server.name) {
# Skip ARM64 for MCP servers not in the opt-in list
continue
}

$platform = $server.platforms | Where-Object { $_.name -eq $archConfig.PlatformName -and -not $_.native }
$executableExtension = $platform.extension ?? ''

$matrixKey = "$($server.name)_$($archConfig.Architecture)"

$serverMatrix[$matrixKey] = [ordered]@{
ServerName = $server.name
CliName = $server.cliName
ArtifactPath = $server.artifactPath
Version = $server.version
ImageName = $imageName
ExecutableName = $server.cliName + $executableExtension
DockerLocalTag = $imageName + ":" + $BuildId
# Docker build configuration
Platform = $archConfig.PlatformName
Architecture = $archConfig.Architecture
Pool = $archConfig.Pool
VMImage = $archConfig.VMImage
}
}
}

Expand Down
Loading
Loading