uhd/.ci/templates/job-uhd-devtest.yml
Grant Meyerhoff a18579e3e5 ci: Add support for USRP B310
Co-authored-by: Virendra Kakade <virendra.kakade@ni.com>
Co-authored-by: Wade Fife <wade.fife@ettus.com>
Co-authored-by: Javier Valenzuela <javier.j.valenzuela@emerson.com>
2026-08-04 12:00:49 +02:00

322 lines
15 KiB
YAML

parameters:
- name: suiteName
type: string
- name: knownHost
type: string
- name: toolset
type: string
values:
- make
- name: uhdSrcDir
type: string
- name: uhdArtifactSource
type: string
- name: uhdFpgaArtifactSource
type: string
- name: fpga_imgs_source
type: string
- name: redisHost
type: string
default: ''
- name: dutMatrix
type: object
- name: vivado_dir
type: string
default: ''
jobs:
- job: uhd_devtest_${{ parameters.suiteName }}
displayName: uhd devtest ${{ parameters.suiteName }}
timeoutInMinutes: 90
pool:
name: de-dre-lab
demands:
- suiteName -equals ${{ parameters.suiteName }}
- device -equals $(devName)
variables:
- group: sdr-pipeline-vars
strategy:
matrix: ${{ parameters.dutMatrix }}
workspace:
clean: outputs
steps:
- checkout: ettus-rts
clean: true
- checkout: self
clean: true
- task: InstallSSHKey@0
displayName: 'Install Ettus SSH key'
inputs:
knownHostsEntry: '${{ parameters.knownHost }}'
sshPublicKey: '$(ettus_ssh_pubkey)'
sshKeySecureFile: 'id_rsa.ettus'
condition: and(succeeded(), ne('${{ parameters.knownHost }}', ''))
- script: |
if [ "${{ parameters.uhdArtifactSource }}" = "current" ]; then
echo '##vso[task.setvariable variable=uhd_artifact_directory]'$(Agent.BuildDirectory)
else
echo '##vso[task.setvariable variable=uhd_artifact_directory]'$(Agent.BuildDirectory)/${{ parameters.uhdArtifactSource }}
fi
displayName: Set uhddev pipeline artifact location
- script: |
if [ "${{ parameters.uhdFpgaArtifactSource }}" = "current" ]; then
echo '##vso[task.setvariable variable=uhd_fpga_artifact_directory]'$(Agent.BuildDirectory)
echo "uhd_fpga_artifact_directory=$(Agent.BuildDirectory)"
else
echo '##vso[task.setvariable variable=uhd_fpga_artifact_directory]'$(Agent.BuildDirectory)/${{ parameters.uhdFpgaArtifactSource }}
echo "uhd_fpga_artifact_directory=$(Agent.BuildDirectory)/${{ parameters.uhdFpgaArtifactSource }}"
fi
displayName: Set uhddev FPGA pipeline artifact location
condition: and(succeeded(), and(contains('${{ parameters.fpga_imgs_source }}', 'Pipeline'), ne(variables.devType, 'b200')))
#- script: |
#rm -rf $(uhd_fpga_artifact_directory)
#displayName: Cleanup from prior run
#condition: and(succeeded(), contains('${{ parameters.fpga_imgs_source }}', 'Pipeline'), ne(variables.devType, 'b200'))
- download: ${{ parameters.uhdArtifactSource }}
artifact: uhddev-$(testOS)-${{ parameters.toolset }}
displayName: Download uhddev-$(testOS)-${{ parameters.toolset }} artifact
- task: ExtractFiles@1
inputs:
archiveFilePatterns: $(uhd_artifact_directory)/uhddev-$(testOS)-${{ parameters.toolset }}/uhddev-$(testOS)-${{ parameters.toolset }}.tar.gz
destinationFolder: $(Build.BinariesDirectory)
cleanDestinationFolder: true
- download: ${{ parameters.uhdArtifactSource }}
artifact: n3xx-images
# Only sync the bz2 sdimg since the bmap
# is incompatible with mender
patterns: |
**/*.bz2
fitImage-manufacturing
displayName: Download $(devType)-images artifact
condition: and(succeeded(), eq(variables.devType, 'n3xx'))
- download: ${{ parameters.uhdArtifactSource }}
artifact: e320-images
# Only sync the bz2 sdimg since the bmap
# is incompatible with mender
patterns: |
**/*.bz2
fitImage-manufacturing
displayName: Download $(devType)-images artifact
condition: and(succeeded(), eq(variables.devModel, 'e320'))
- download: ${{ parameters.uhdFpgaArtifactSource }}
patterns: |
usrp_$(devModel)*.bit
usrp_$(devModel)*.dts
displayName: Download FPGA artifacts
condition: and(succeeded(), and(contains('${{ parameters.fpga_imgs_source }}', 'Pipeline'), ne(variables.devType, 'b200')))
- script: |
mkdir -p $(Build.BinariesDirectory)/uhddev/build/fpga_images/
cd $(uhd_fpga_artifact_directory)
echo "Moving files: "
find . -maxdepth 2 -name "*.bit" -o -name "*.dts"
mv `find . -maxdepth 2 -name "*.bit" -o -name "*.dts"` $(Build.BinariesDirectory)/uhddev/build/fpga_images/
ls -lR $(Build.BinariesDirectory)/uhddev/build/fpga_images/
displayName: Copy FPGA images to expected directory
condition: and(succeeded(), and(contains('${{ parameters.fpga_imgs_source }}', 'Pipeline'), ne(variables.devType, 'b200')))
- script: |
cd $(Build.BinariesDirectory)/uhddev/build
mkdir -p fpga_images
rm -rf fpga_images/*
python3 utils/uhd_images_downloader.py -t $(devModel)_fpga -i fpga_images \
-b $(sdr-fileserver)
if [ "$(devType)" = "b200" ]; then
python3 utils/uhd_images_downloader.py -t b2xx_common -i fpga_images \
-b $(sdr-fileserver)
fi
displayName: Download FPGA Images (uhd_images_downloader)
condition: and(succeeded(), or(not(contains('${{ parameters.fpga_imgs_source }}', 'Pipeline')), eq(variables.devType, 'b200')))
- script: |
cd $(Agent.TempDirectory)
python3 -m venv devtest_venv
source devtest_venv/bin/activate
python3 -m pip install --upgrade pip
pip3 install -r $(Build.SourcesDirectory)/uhddev/host/tests/devtest/requirements.txt
pip3 install -r $(Build.SourcesDirectory)/uhddev/.ci/utils/requirements.txt
mkdir -p $(Common.TestResultsDirectory)/devtest
cd $(Common.TestResultsDirectory)/devtest
export PATH=$(Build.BinariesDirectory)/uhddev/build/utils:$(Build.BinariesDirectory)/uhddev/build/examples:$PATH
export LD_LIBRARY_PATH=$(Build.BinariesDirectory)/uhddev/build/lib:$LD_LIBRARY_PATH
export UHD_IMAGES_DIR=$(Build.BinariesDirectory)/uhddev/build/fpga_images
python3 ${{ parameters.uhdSrcDir }}/uhddev/.ci/utils/mutex_hardware.py \
--sdimage_sdmux $(devType),$(devModel),$(uhd_artifact_directory)/$(devType)-images/$(devSDImage),$(Build.SourcesDirectory)/ettus-rts/$(devLabgridConfig),$(devHostname) \
--fpgas $(devFpga) \
--sfp_addrs $(sfpAddrs) \
"${{ parameters.redisHost }}" "$(devName)" \
"$(Build.BinariesDirectory)/uhddev/build/utils/uhd_usrp_probe --args addr=$(devAddr)" \
"python3 ${{ parameters.uhdSrcDir }}/uhddev/host/tests/devtest/run_testsuite.py \
--src-dir ${{ parameters.uhdSrcDir }}/uhddev/host/tests/devtest \
--devtest-pattern $(devtestPattern) --args addr=$(devAddr),type=$(devType) \
--build-type Release --build-dir $(Build.BinariesDirectory)/uhddev/build \
--python-interp python3 --xml"
continueOnError: true
condition: and(succeeded(), eq(variables.devType, 'n3xx'), eq(variables.devBus, 'ip'))
displayName: Run n3xx devtest on $(devName)
- script: |
cd $(Agent.TempDirectory)
python3 -m venv devtest_venv
source devtest_venv/bin/activate
python3 -m pip install --upgrade pip
pip3 install -r $(Build.SourcesDirectory)/uhddev/host/tests/devtest/requirements.txt
pip3 install -r $(Build.SourcesDirectory)/uhddev/.ci/utils/requirements.txt
mkdir -p $(Common.TestResultsDirectory)/devtest
cd $(Common.TestResultsDirectory)/devtest
export PATH=$(Build.BinariesDirectory)/uhddev/build/utils:$(Build.BinariesDirectory)/uhddev/build/examples:$PATH
export LD_LIBRARY_PATH=$(Build.BinariesDirectory)/uhddev/build/lib:$LD_LIBRARY_PATH
export UHD_IMAGES_DIR=$(Build.BinariesDirectory)/uhddev/build/fpga_images
python3 ${{ parameters.uhdSrcDir }}/uhddev/.ci/utils/mutex_hardware.py \
--sdimage_tftp $(devType),$(devModel),$(uhd_artifact_directory)/e320-images/$(devSDImage),$(uhd_artifact_directory)/e320-images/$(devInitramfsImage),$(Build.SourcesDirectory)/ettus-rts/$(devLabgridConfig) \
--fpgas $(devFpga) \
--sfp_addrs $(sfpAddrs) \
"${{ parameters.redisHost }}" "$(devName)" \
"$(Build.BinariesDirectory)/uhddev/build/utils/uhd_usrp_probe --args addr=$(devAddr)" \
"python3 ${{ parameters.uhdSrcDir }}/uhddev/host/tests/devtest/run_testsuite.py \
--src-dir ${{ parameters.uhdSrcDir }}/uhddev/host/tests/devtest \
--devtest-pattern $(devtestPattern) --args addr=$(devAddr),type=$(devType) \
--build-type Release --build-dir $(Build.BinariesDirectory)/uhddev/build \
--python-interp python3 --xml"
continueOnError: true
condition: and(succeeded(), eq(variables.devModel, 'e320'), eq(variables.devBus, 'ip'))
displayName: Run e320 devtest on $(devName)
- script: |
cd $(Agent.TempDirectory)
python3 -m venv devtest_venv
source devtest_venv/bin/activate
python3 -m pip install --upgrade pip
pip3 install -r $(Build.SourcesDirectory)/uhddev/host/tests/devtest/requirements.txt
pip3 install -r $(Build.SourcesDirectory)/uhddev/.ci/utils/requirements.txt
mkdir -p $(Common.TestResultsDirectory)/devtest
cd $(Common.TestResultsDirectory)/devtest
export PATH=$(Build.BinariesDirectory)/uhddev/build/utils:$(Build.BinariesDirectory)/uhddev/build/examples:$PATH
export LD_LIBRARY_PATH=$(Build.BinariesDirectory)/uhddev/build/lib:$LD_LIBRARY_PATH
export UHD_IMAGES_DIR=$(Build.BinariesDirectory)/uhddev/build/fpga_images
python3 ${{ parameters.uhdSrcDir }}/uhddev/.ci/utils/mutex_hardware.py \
"${{ parameters.redisHost }}" "$(devName)" \
"$(Build.BinariesDirectory)/uhddev/build/utils/uhd_usrp_probe --args serial=$(devSerial)" \
"$(Build.BinariesDirectory)/uhddev/build/utils/uhd_image_loader --args serial=$(devSerial),type=$(devType)" \
"python3 ${{ parameters.uhdSrcDir }}/uhddev/host/tests/devtest/run_testsuite.py \
--src-dir ${{ parameters.uhdSrcDir }}/uhddev/host/tests/devtest \
--devtest-pattern $(devtestPattern) --args serial=$(devSerial),type=$(devType) \
--build-type Release --build-dir $(Build.BinariesDirectory)/uhddev/build \
--python-interp python3 --xml"
continueOnError: true
condition: and(succeeded(), eq(variables.devType, 'b200'), eq(variables.devBus, 'usb'))
displayName: Run b2xx devtest on $(devName)
- script: |
cd $(Agent.TempDirectory)
python3 -m venv devtest_venv
source devtest_venv/bin/activate
python3 -m pip install --upgrade pip
pip3 install -r $(Build.SourcesDirectory)/uhddev/host/tests/devtest/requirements.txt
pip3 install -r $(Build.SourcesDirectory)/uhddev/.ci/utils/requirements.txt
mkdir -p $(Common.TestResultsDirectory)/devtest
cd $(Common.TestResultsDirectory)/devtest
export PATH=$(Build.BinariesDirectory)/uhddev/build/utils:$(Build.BinariesDirectory)/uhddev/build/examples:$PATH
export LD_LIBRARY_PATH=$(Build.BinariesDirectory)/uhddev/build/lib:$LD_LIBRARY_PATH
python3 ${{ parameters.uhdSrcDir }}/uhddev/.ci/utils/mutex_hardware.py \
--jtag_x3xx $(devType),$(devModel),$(jtagServer),$(jtagSerial),$(Build.BinariesDirectory)/uhddev/build/fpga_images/,${{ parameters.vivado_dir }} \
--fpgas $(devFpga) \
"${{ parameters.redisHost }}" "$(devName)" \
"$(Build.BinariesDirectory)/uhddev/build/utils/uhd_usrp_probe --args addr=$(devAddr)" \
"python3 ${{ parameters.uhdSrcDir }}/uhddev/host/tests/devtest/run_testsuite.py \
--src-dir ${{ parameters.uhdSrcDir }}/uhddev/host/tests/devtest \
--devtest-pattern $(devtestPattern) --args addr=$(devAddr),type=$(devType) \
--build-type Release --build-dir $(Build.BinariesDirectory)/uhddev/build \
--python-interp python3 --xml"
continueOnError: true
condition: and(succeeded(), eq(variables.devType, 'x300'), eq(variables.devBus, 'ip'))
displayName: Run x3xx devtest on $(devName) $(devFpga)
- script: |
cd $(Agent.TempDirectory)
python3 -m venv devtest_venv
source devtest_venv/bin/activate
pip3 install -r $(Build.SourcesDirectory)/uhddev/host/tests/devtest/requirements.txt
pip3 install -r $(Build.SourcesDirectory)/uhddev/.ci/utils/requirements.txt
mkdir -p $(Common.TestResultsDirectory)/devtest
cd $(Common.TestResultsDirectory)/devtest
export PATH=$(Build.BinariesDirectory)/uhddev/build/utils:$(Build.BinariesDirectory)/uhddev/build/examples:$PATH
export LD_LIBRARY_PATH=$(Build.BinariesDirectory)/uhddev/build/lib:$LD_LIBRARY_PATH
export UHD_IMAGES_DIR=$(Build.BinariesDirectory)/uhddev/build-installed/share/uhd/images/:$HOME/adrv9032_images
python3 ${{ parameters.uhdSrcDir }}/uhddev/host/tests/devtest/run_testsuite.py \
--src-dir ${{ parameters.uhdSrcDir }}/uhddev/host/tests/devtest \
--devtest-pattern $(devtestPattern) --args type=$(devType),serial=$(devSerial) \
--build-type Release --build-dir $(Build.BinariesDirectory)/uhddev/build \
--python-interp python3 --xml
continueOnError: true
condition: and(succeeded(), eq(variables.devType, 'b3xx'))
displayName: Run b3xx devtest on $(devName)
- script: |
cat $(Common.TestResultsDirectory)/devtest/log*.log
echo ""
displayName: cat devtest log
condition: always()
- script: |
cd $(Common.TestResultsDirectory)/devtest
python3 ${{ parameters.uhdSrcDir }}/uhddev/.ci/utils/format_devtest_junitxml.py \
$(Common.TestResultsDirectory)/devtest \
$(Common.TestResultsDirectory)/devtest/devtestresults.xml
continueOnError: true
displayName: Format devtest xml
condition: and(always(), or(eq(variables.devType, 'b200'), eq(variables.devType, 'b3xx')))
- script: |
cd $(Common.TestResultsDirectory)/devtest
python3 ${{ parameters.uhdSrcDir }}/uhddev/.ci/utils/format_devtest_junitxml.py \
--fpgas $(devFpga) \
$(Common.TestResultsDirectory)/devtest \
$(Common.TestResultsDirectory)/devtest/devtestresults.xml
continueOnError: true
displayName: Format devtest xml
condition: and(always(), and(ne(variables.devType, 'b200'), ne(variables.devType, 'b3xx')))
- publish: $(Common.TestResultsDirectory)
artifact: test-logs-devtest-$(devName)-$(devModel)-$(devFpga)-run$(System.JobAttempt)
displayName: Upload Test Logs
condition: always()
- task: PublishTestResults@2
inputs:
testResultsFormat: 'JUnit'
testResultsFiles: '$(Common.TestResultsDirectory)/devtest/devtestresults.xml'
testRunTitle: $(devName) devtest
buildConfiguration: 'Release'
mergeTestResults: true
failTaskOnFailedTests: true
displayName: Upload devtest results
condition: always()
- script: |
echo "A previous step failed. See steps with warnings."
echo "Marking the overall build status as a failure."
exit 1
condition: in(variables['Agent.JobStatus'], 'SucceededWithIssues')
displayName: Mark build as failure
- script: |
if [ -z "${{ parameters.redisHost }}" ]; then
echo "No redis host specified, skipping lock release."
else
redis-cli -h ${{ parameters.redisHost }} DEL redlock:$(devName)
fi
displayName: Release redis lock
condition: always()