uhd/.ci/uhd-build-docker-container.yml
2025-01-31 08:25:31 +01:00

316 lines
13 KiB
YAML

#
# Copyright 2021 Ettus Research, a National Instruments Brand
#
# SPDX-License-Identifier: LGPL-3.0-or-later
#
trigger:
branches:
include:
- master
paths:
include:
- .ci/docker
- .ci/uhd-build-docker-container.yml
pr:
branches:
include:
- master
paths:
include:
- .ci/docker
- .ci/uhd-build-docker-container.yml
schedules:
- cron: "0 18 * * SAT"
displayName: Weekly Docker Build master branch
branches:
include:
- master
always: true
parameters:
- name: build_linux
type: boolean
displayName: Build Linux images
default: true
- name: build_windows
type: boolean
displayName: Build Windows images
default: true
variables:
- template: uhd-pipeline-vars.yml
- ${{ if parameters.build_linux }}:
- name: linuxDockerImages
value:
"{'Fedora-39-builder':{'buildOSName':'fedora39','dockerImageName':'uhd-builder-fedora39'},
'Fedora-40-builder':{'buildOSName':'fedora40','dockerImageName':'uhd-builder-fedora40'},
'Fedora-41-builder':{'buildOSName':'fedora41','dockerImageName':'uhd-builder-fedora41'},
'Ubuntu-1804-builder':{'buildOSName':'ubuntu1804','dockerImageName':'uhd-builder-ubuntu1804'},
'Ubuntu-2004-builder':{'buildOSName':'ubuntu2004','dockerImageName':'uhd-builder-ubuntu2004'},
'Ubuntu-2204-builder':{'buildOSName':'ubuntu2204','dockerImageName':'uhd-builder-ubuntu2204'},
'Ubuntu-2404-builder':{'buildOSName':'ubuntu2404','dockerImageName':'uhd-builder-ubuntu2404'}}"
- ${{ else }}:
- name: linuxDockerImages
value:
- ${{ if parameters.build_windows }}:
- name: winDockerImages
value:
"{'VS2019-x64-py310-builder':{'buildOSName':'win-vs19-v142-x64-py310','dockerImageName':'uhd-builder-vs2019-v142-x64-py310','cmakeCompiler':'Visual Studio 16 2019','cmakeArch':'x64','vsArch':'x64','vsYear':'2019','pythonVersion':'python310'},
'VS2019-x64-py312-builder':{'buildOSName':'win-vs19-v142-x64-py312','dockerImageName':'uhd-builder-vs2019-v142-x64-py312','cmakeCompiler':'Visual Studio 16 2019','cmakeArch':'x64','vsArch':'x64','vsYear':'2019','pythonVersion':'python312'},
'VS2022-x64-py310-builder':{'buildOSName':'win-vs22-v143-x64-py310','dockerImageName':'uhd-builder-vs2022-v143-x64-py310','cmakeCompiler':'Visual Studio 17 2022','cmakeArch':'x64','vsArch':'x64','vsYear':'2022','pythonVersion':'python310'},
'VS2022-x64-py312-builder':{'buildOSName':'win-vs22-v143-x64-py312','dockerImageName':'uhd-builder-vs2022-v143-x64-py312','cmakeCompiler':'Visual Studio 17 2022','cmakeArch':'x64','vsArch':'x64','vsYear':'2022','pythonVersion':'python312'}}"
- ${{ else }}:
- name: winDockerImages
value:
- name: ubuntuDebDockerImages
# Match with Ubuntu images in linuxDockerImages
value:
"{'Ubuntu-1804-builder':{'buildOSName':'ubuntu1804','dockerImageName':'uhd-builder-ubuntu1804','ubuntuReleaseName':'bionic'},
'Ubuntu-2004-builder':{'buildOSName':'ubuntu2004','dockerImageName':'uhd-builder-ubuntu2004','ubuntuReleaseName':'focal'},
'Ubuntu-2204-builder':{'buildOSName':'ubuntu2204','dockerImageName':'uhd-builder-ubuntu2204','ubuntuReleaseName':'jammy'},
'Ubuntu-2404-builder':{'buildOSName':'ubuntu2404','dockerImageName':'uhd-builder-ubuntu2404','ubuntuReleaseName':'noble'}}"
- name: macOSBuilders
value:
"{'macOS-15-x64':{'buildOSName':'macOS-15-x64', 'macOSVersionDemand':'15', 'macOSArchDemand': 'X64'}}"
- name: sourcePackageBuilders
# Match with one of the Ubuntu images in linuxDockerImages
value:
"{'Ubuntu-2004-builder':{'buildOSName':'ubuntu2004','dockerImageName':'uhd-builder-ubuntu2004','ubuntuReleaseName':'focal'}}"
- name: fedoraRpmDockerImages
# Match with Fedora images in linuxDockerImages
value:
"{'Fedora-39-builder':{'buildOSName':'fedora39','dockerImageName':'uhd-builder-fedora39','fedoraReleaseName':'39'},
'Fedora-40-builder':{'buildOSName':'fedora40','dockerImageName':'uhd-builder-fedora40','fedoraReleaseName':'40'},
'Fedora-41-builder':{'buildOSName':'fedora41','dockerImageName':'uhd-builder-fedora41','fedoraReleaseName':'41'}}"
- name: winDockerImagesPythonBuild
# Match with one of the images in winDockerImages
value:
"{}"
- ${{ if or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/UHD-')) }}:
- name: dockerImagePrefix
value: 'rnd-docker-ci/ni/rfsdr/'
- ${{ else }}:
- name: dockerImagePrefix
value: 'rnd-docker-pre/ni/rfsdr/'
jobs:
- job: set_uhd_docker_image_version
displayName: Set UHD Docker Image Version
pool:
name: Drivers-NIBuildFarm-RFMIBUILD
demands:
- agent.os -equals Linux
steps:
- checkout: self
clean: true
- script: |
cd $(Build.SourcesDirectory)
uhd_version_major=$(sed -nE "s/^set\(UHD_VERSION_MAJOR\s+([0-9]+)\)/\1/p" host/cmake/Modules/UHDVersion.cmake)
uhd_version_api=$(sed -nE "s/^set\(UHD_VERSION_API\s+([0-9]+)\)/\1/p" host/cmake/Modules/UHDVersion.cmake)
uhd_version_abi=$(sed -nE "s/^set\(UHD_VERSION_ABI\s+([0-9]+)\)/\1/p" host/cmake/Modules/UHDVersion.cmake)
if [[ -z $uhd_version_major || -z $uhd_version_api || -z $uhd_version_abi ]]
then
echo "Error parsing UHDVersion.cmake for UHD Version"
exit 1
fi
uhd_docker_image_version=${uhd_version_major}.${uhd_version_api}.${uhd_version_abi}_$(Build.BuildNumber)
echo "Using UHD version string: $uhd_docker_image_version"
echo "##vso[task.setvariable variable=uhdDockerImageVersion;isOutput=true;]$uhd_docker_image_version"
name: set_uhd_version
- job: build_image_linux
dependsOn: set_uhd_docker_image_version
displayName: Build Docker Image
variables:
uhdDockerImageVersion: $[ dependencies.set_uhd_docker_image_version.outputs['set_uhd_version.uhdDockerImageVersion'] ]
pool:
name: Drivers-NIBuildFarm-RFMIBUILD
demands:
- agent.os -equals Linux
- docker
condition: and(succeeded(), ${{ parameters.build_linux }})
strategy:
matrix: $[ variables.linuxDockerImages ]
steps:
- checkout: self
clean: true
- task: Docker@2
displayName: Build Image
inputs:
command: 'build'
Dockerfile: '$(Build.SourcesDirectory)/.ci/docker/$(dockerImageName).Dockerfile'
${{ if or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/UHD-')) }}:
containerRegistry: rnd-docker-niartifacts-sdr-ci-publish
${{ else }}:
containerRegistry: rnd-docker-niartifacts-pre-publish
repository: '$(dockerImagePrefix)$(dockerImageName)'
tags: $(uhdDockerImageVersion)
arguments: --no-cache --pull
- task: Docker@2
displayName: Push Image
inputs:
command: 'push'
${{ if or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/UHD-')) }}:
containerRegistry: rnd-docker-niartifacts-sdr-ci-publish
${{ else }}:
containerRegistry: rnd-docker-niartifacts-pre-publish
repository: '$(dockerImagePrefix)$(dockerImageName)'
tags: $(uhdDockerImageVersion)
- job: test_image_linux
displayName: Test Docker Image
dependsOn:
- build_image_linux
- set_uhd_docker_image_version
variables:
uhdDockerImageVersion: $[ dependencies.set_uhd_docker_image_version.outputs['set_uhd_version.uhdDockerImageVersion'] ]
pool:
name: Drivers-NIBuildFarm-RFMIBUILD
demands:
- agent.os -equals Linux
- docker
strategy:
matrix: $[ variables.linuxDockerImages ]
container:
image: "$(dockerImagePrefix)$(dockerImageName):$(uhdDockerImageVersion)"
${{ if or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/UHD-')) }}:
endpoint: rnd-docker-niartifacts-ci-readonly
${{ else }}:
endpoint: rnd-docker-niartifacts-pre-readonly
workspace:
clean: outputs
steps:
- checkout: self
clean: true
- script: |
cd $(Build.BinariesDirectory)
mkdir -p uhddev/build
cd uhddev/build
cmake $(Build.SourcesDirectory)/host
displayName: Test image with cmake uhd
- script: |
cd $(Build.BinariesDirectory)
mkdir -p uhddev/build-ninja
cd uhddev/build-ninja
cmake -G Ninja $(Build.SourcesDirectory)/host
displayName: Test image with cmake ninja uhd
- job: build_image_win
dependsOn: set_uhd_docker_image_version
displayName: Build Docker Image Windows
timeoutInMinutes: 120
variables:
uhdDockerImageVersion: $[ dependencies.set_uhd_docker_image_version.outputs['set_uhd_version.uhdDockerImageVersion'] ]
pool:
name: Drivers-NIBuildFarm-RFMIBUILD
demands:
- agent.os -equals Windows_NT
- docker
condition: and(succeeded(), ${{ parameters.build_windows }})
strategy:
matrix: $[ variables.winDockerImages ]
steps:
- checkout: self
clean: true
- task: Docker@2
displayName: Build Image
inputs:
command: 'build'
Dockerfile: '$(Build.SourcesDirectory)/.ci/docker/$(dockerImageName).Dockerfile'
${{ if or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/UHD-')) }}:
containerRegistry: rnd-docker-niartifacts-sdr-ci-publish
${{ else }}:
containerRegistry: rnd-docker-niartifacts-pre-publish
repository: '$(dockerImagePrefix)$(dockerImageName)'
tags: $(uhdDockerImageVersion)
buildContext: $(Build.SourcesDirectory)
arguments: --no-cache --pull
- task: Docker@2
displayName: Push Image
inputs:
command: 'push'
${{ if or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/UHD-')) }}:
containerRegistry: rnd-docker-niartifacts-sdr-ci-publish
${{ else }}:
containerRegistry: rnd-docker-niartifacts-pre-publish
repository: '$(dockerImagePrefix)$(dockerImageName)'
tags: $(uhdDockerImageVersion)
- job: test_image_win
displayName: Test Docker Image Windows
timeoutInMinutes: 90
dependsOn:
- build_image_win
- set_uhd_docker_image_version
variables:
uhdDockerImageVersion: $[ dependencies.set_uhd_docker_image_version.outputs['set_uhd_version.uhdDockerImageVersion'] ]
pool:
name: Drivers-NIBuildFarm-RFMIBUILD
demands:
- agent.os -equals Windows_NT
- docker
strategy:
matrix: $[ variables.winDockerImages ]
container:
image: "$(dockerImagePrefix)$(dockerImageName):$(uhdDockerImageVersion)"
options: --cpu-count 6 --memory 12G
${{ if or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/UHD-')) }}:
endpoint: rnd-docker-niartifacts-ci-readonly
${{ else }}:
endpoint: rnd-docker-niartifacts-pre-readonly
workspace:
clean: outputs
steps:
- checkout: self
clean: true
- script: |
mkdir c:\uhddev\build
cd c:\uhddev\build
cmake $(Build.SourcesDirectory)/host ^
-DVCPKG_TARGET_TRIPLET=uhd-$(vsArch)-windows-static-md ^
-DCMAKE_TOOLCHAIN_FILE=%VCPKG_INSTALL_DIR%\scripts\buildsystems\vcpkg.cmake ^
-DVCPKG_INSTALLED_DIR=c:\uhd-vcpkg\vcpkg_installed ^
-DVCPKG_MANIFEST_DIR=c:\uhd-vcpkg ^
-G "$(cmakeCompiler)" -A $(cmakeArch)
displayName: Test image with cmake uhd
- script: |
cd c:\uhddev\build
"C:\Program Files (x86)\Microsoft Visual Studio\$(vsYear)\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" $(vsArch)
displayName: Load Visual C++ Env
- job: export_build_number
dependsOn: set_uhd_docker_image_version
displayName: Export Image List to Artifacts
variables:
uhdDockerImageVersion: $[ dependencies.set_uhd_docker_image_version.outputs['set_uhd_version.uhdDockerImageVersion'] ]
pool:
name: Drivers-NIBuildFarm-RFMIBUILD
demands: sh
steps:
- checkout: none
- script: |
cd $(Build.ArtifactStagingDirectory)
touch $(UHDPipelineDockerImageArtifactName)
echo "$(uhdDockerImageVersion)" > $(UHDPipelineDockerImageArtifactName)
echo "${{ variables.dockerImagePrefix }}" >> $(UHDPipelineDockerImageArtifactName)
echo "${{ variables.linuxDockerImages }}" >> $(UHDPipelineDockerImageArtifactName)
echo "${{ variables.winDockerImages }}" >> $(UHDPipelineDockerImageArtifactName)
echo "${{ variables.ubuntuDebDockerImages }}" >> $(UHDPipelineDockerImageArtifactName)
echo "${{ variables.macOSBuilders }}" >> $(UHDPipelineDockerImageArtifactName)
echo "${{ variables.sourcePackageBuilders }}" >> $(UHDPipelineDockerImageArtifactName)
echo "${{ variables.fedoraRpmDockerImages }}" >> $(UHDPipelineDockerImageArtifactName)
echo "${{ variables.winDockerImagesPythonBuild }}" >> $(UHDPipelineDockerImageArtifactName)
displayName: Generate created image list
- task: PublishPipelineArtifact@1
inputs:
targetPath: $(Build.ArtifactStagingDirectory)
artifactName: $(UHDPipelineDockerImageArtifactName)
displayName: Upload image list artifact