aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/scripts/azure-pipelines/linux/azure-pipelines.yml
blob: 0da2b03715632a4304367cfa7a0ae6c53039f2c8 (plain)
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
    default: 'x64_linux'
  - 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: 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
        # Persist the binary SAS as a secret pipeline variable for the owners-db step
        echo "##vso[task.setvariable variable=BCACHE_SAS_TOKEN;issecret=true]$binarySas"
        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 \
        --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" \
        --workdir /vcpkg \
        ${{ variables.LINUX_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
      # Construct the blob base url using the secret SAS token set earlier
      blob="https://vcpkgbinarycachewus.blob.core.windows.net/cache?${BCACHE_SAS_TOKEN}"
      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 "$blob" --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, '_', '-') }}
      configuration: static