1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: MIT
#
parameters:
- name: vcpkgToolSha
displayName: 'Custom SHA of vcpkg-tool to use rather than bootstrap'
type: string
default: 'use default'
- name: jobName
type: string
- name: tripletPattern
displayName: 'Enable the triplets which contain this substring'
type: string
default: ''
jobs:
- job: ${{ parameters.jobName }}
condition: and(succeeded(), contains('^${{ replace(parameters.jobName, '_', '-') }}$', '${{ parameters.tripletPattern }}'))
pool:
name: PrAzureLinux3Docker
timeoutInMinutes: 1440 # 1 day
variables:
- name: WORKING_ROOT
value: /mnt/vcpkg-ci
- name: VCPKG_DOWNLOADS
value: /mnt/vcpkg-ci/downloads
- name: ANDROID_NDK_HOME
value: /android-ndk-r28c
- name: ANDROID_DOCKER_IMAGE
value: 'vcpkgandroidwus.azurecr.io/vcpkg-android:2025-10-16'
- name: LINUX_DOCKER_IMAGE
value: 'vcpkgandroidwus.azurecr.io/vcpkg-linux:2025-10-16'
steps:
# Note: /mnt is the Azure machines' temporary disk.
- bash: |
sudo mkdir /home/agent -m=777
sudo chown `id -u` /home/agent
sudo mkdir ${{ variables.WORKING_ROOT }} -m=777
sudo rm -rf ${{ variables.WORKING_ROOT }}/failure-logs
sudo mkdir ${{ variables.WORKING_ROOT }}/failure-logs -m=777
sudo mkdir ${{ variables.VCPKG_DOWNLOADS }} -m=777
# Move the docker layers to the temp disk.
sudo mkdir -p /etc/docker
echo '{"data-root": "/mnt/docker"}' | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker
exit 0
displayName: 'Create working directories'
- bash: ./bootstrap-vcpkg.sh -skipDependencyChecks
displayName: 'Bootstrap vcpkg'
condition: eq('use default', '${{ parameters.vcpkgToolSha }}')
- task: AzureCLI@2
displayName: 'Build vcpkg with CMake'
condition: ne('use default', '${{ parameters.vcpkgToolSha }}')
inputs:
azureSubscription: 'vcpkg-pr-fleet-wus'
scriptType: bash
scriptLocation: 'inlineScript'
inlineScript: |
# This is a second pull but the vcpkgToolSha setting is used rarely.
USER=$(id --user)
az acr login --name vcpkgandroidwus
docker pull ${{ variables.LINUX_DOCKER_IMAGE }}
docker run --init -i --rm \
-a stderr \
-a stdout \
--user $USER \
--mount type=bind,source=$(Build.Repository.LocalPath),target=/vcpkg \
--workdir /vcpkg \
${{ variables.LINUX_DOCKER_IMAGE }} \
/vcpkg/scripts/azure-pipelines/bootstrap-from-source.sh ${{ parameters.vcpkgToolSha }}
- task: AzureCLI@2
displayName: '*** Test Modified Ports'
inputs:
azureSubscription: 'vcpkg-pr-fleet-wus'
scriptType: bash
scriptLocation: 'inlineScript' # Be very very careful that the exit code from the last pwsh is reported correctly
inlineScript: |
end=`date -u -d "2 days" '+%Y-%m-%dT%H:%MZ'`
assetSas=`az storage container generate-sas --name cache --account-name vcpkgassetcachewus --as-user --auth-mode login --https-only --permissions rcl --expiry $end -o tsv`
binarySas=`az storage container generate-sas --name cache --account-name vcpkgbinarycachewus --as-user --auth-mode login --https-only --permissions rclw --expiry $end -o tsv`
echo Minting SAS tokens valid through $end
echo "##vso[task.setvariable variable=BCACHE_SAS_TOKEN;issecret=true]$binarySas"
USER=$(id --user)
az acr login --name vcpkgandroidwus
docker pull ${{ variables.ANDROID_DOCKER_IMAGE }}
docker run --init -i --rm \
-a stderr \
-a stdout \
--user $USER \
--mount type=bind,source=$(Build.Repository.LocalPath),target=/vcpkg \
--mount type=bind,source=$(WORKING_ROOT)/failure-logs,target=/vcpkg/failure-logs \
--mount type=bind,source=/mnt/vcpkg-ci,target=/mnt/vcpkg-ci \
--env X_VCPKG_ASSET_SOURCES="x-azurl,https://vcpkgassetcachewus.blob.core.windows.net/cache,$assetSas,readwrite" \
--env ANDROID_NDK_HOME="${{ variables.ANDROID_NDK_HOME }}" \
--workdir /vcpkg \
${{ variables.ANDROID_DOCKER_IMAGE }} \
pwsh \
-File scripts/azure-pipelines/test-modified-ports.ps1 \
-Triplet ${{ replace(parameters.jobName, '_', '-') }} \
-BuildReason $(Build.Reason) \
-BinarySourceStub "x-azcopy-sas,https://vcpkgbinarycachewus.blob.core.windows.net/cache,$binarySas" \
-WorkingRoot ${{ variables.WORKING_ROOT }}
- task: PublishPipelineArtifact@1
displayName: "Publish Artifact: failure logs for ${{ replace(parameters.jobName, '_', '-') }}"
inputs:
targetPath: '$(WORKING_ROOT)/failure-logs'
artifact: "failure logs for ${{ replace(parameters.jobName, '_', '-') }}"
condition: ne(variables['FAILURE_LOGS_EMPTY'], 'True')
- task: PublishPipelineArtifact@1
displayName: "Publish Artifact: azcopy logs for ${{ replace(parameters.jobName, '_', '-') }}"
inputs:
targetPath: '$(WORKING_ROOT)/azcopy-logs'
artifactName: "z azcopy logs for ${{ replace(parameters.jobName, '_', '-') }}"
condition: ne(variables['AZCOPY_LOGS_EMPTY'], 'True')
- task: UseNode@1
displayName: 'Ensure Node.js is available'
condition: always()
inputs:
version: '22.x'
- bash: |
cd scripts/azure-pipelines/owners-db && npm ci || true
if [ "$(Build.Reason)" = "PullRequest" ]; then
echo "Running file_script_from_cache for PR"
npx --yes ts-node ./file_script_from_cache.ts --pr-hashes "$(Build.Repository.LocalPath)/pr-hashes.json" --blob-base-url "https://vcpkgbinarycachewus.blob.core.windows.net/cache?${BCACHE_SAS_TOKEN}" --target-branch "origin/master" --out-dir ../../list_files
else
echo "Running file_script for CI"
npx --yes ts-node ./file_script.ts --info-dir /mnt/vcpkg-ci/installed/vcpkg/info/ --out-dir ../../list_files
fi
displayName: 'Build a file list for all packages'
condition: always()
env:
BCACHE_SAS_TOKEN: $(BCACHE_SAS_TOKEN)
- task: PublishPipelineArtifact@1
displayName: "Publish Artifact: file lists for ${{ replace(parameters.jobName, '_', '-') }}"
condition: always()
inputs:
targetPath: scripts/list_files
artifact: "file lists for ${{ replace(parameters.jobName, '_', '-') }}"
- task: PublishTestResults@2
displayName: 'Publish Test Results'
condition: ne(variables['XML_RESULTS_FILE'], '')
inputs:
testRunTitle: ${{ replace(parameters.jobName, '_', '-') }}
testResultsFormat: xUnit
testResultsFiles: $(XML_RESULTS_FILE)
platform: ${{ replace(parameters.jobName, '_', '-') }}
|