Files
3d_audio/lib_audio_dsp/Jenkinsfile
Steven Dan d8b2974133 init
2025-12-11 09:43:42 +08:00

549 lines
17 KiB
Groovy

@Library('xmos_jenkins_shared_library@v0.39.0')
def boolean hasChangesIn(String module) {
dir("${REPO}"){
if (env.CHANGE_TARGET == null) {
return false
}
else {
return sh(
returnStatus: true,
script: "git diff --name-only remotes/origin/${env.CHANGE_TARGET}...remotes/origin/${env.BRANCH_NAME} | grep -v .rst | grep ${module}"
) == 0
}
}
}
def boolean hasGenericChanges() {
echo env.BRANCH_NAME
if (env.BRANCH_NAME ==~ /master|main|release*/) {
return true
}
else if (env.BRANCH_NAME ==~ /develop/) {
return true
}
else if (env.CHANGE_TARGET ==~ /master|main/){
return true
}
else if (hasChangesIn("utils | grep -v reverb_utils")) {
return true
}
else if (hasChangesIn("helpers | grep -v reverb_utils")) {
return true
}
else if (hasChangesIn("adsp")) {
return true
}
else if (hasChangesIn("defines")) {
return true
}
else if (hasChangesIn("generic")) {
return true
}
else {
return false
}
}
def runningOn(machine) {
println "Stage running on:"
println machine
}
def versionsPairs = [
"python/pyproject.toml": /version[\s='\"]*([\d.]+)/,
"settings.yml": /version[\s:'\"]*([\d.]+)/,
"CHANGELOG.rst": /(\d+\.\d+\.\d+)/,
"**/lib_build_info.cmake": /set\(LIB_VERSION \"?([\d.]+)/,
"README.rst": /:\s*version:\s*([\d.]+)/
]
getApproval()
pipeline {
agent none
parameters {
string(
name: 'TOOLS_VERSION',
defaultValue: '15.3.1',
description: 'The XTC tools version'
)
string(
name: 'XMOSDOC_VERSION',
defaultValue: 'v7.2.0',
description: 'The xmosdoc version'
)
string(
name: 'INFR_APPS_VERSION',
defaultValue: 'develop',
description: 'The infr_apps version'
)
string(
name: 'XTAGCTL_VERSION',
defaultValue: 'v2.0.0',
description: 'The xtagctl version'
)
} // parameters
environment {
REPO = "lib_audio_dsp"
REPO_NAME = "lib_audio_dsp"
HAS_GENERIC_CHANGES = false
DEPS_CHECK = "strict"
} // environment
options {
skipDefaultCheckout()
timestamps()
buildDiscarder(xmosDiscardBuildSettings())
} // options
stages {
stage('Stop previous builds') {
when {
// don't stop runs on develop or main
not {
anyOf {
branch "main"
branch "develop"
}
}
}
steps {
stopPreviousBuilds()
}
} // Stop previous builds
stage('CI') {
parallel {
stage ('Build & Test') {
agent {
label 'linux&&x86_64'
}
stages {
stage ('Build') {
steps {
runningOn(env.NODE_NAME)
dir("${REPO}") {
checkoutScmShallow()
script{
env.HAS_GENERIC_CHANGES = hasGenericChanges().toBoolean()
}
echo "env.HAS_GENERIC_CHANGES is '${env.HAS_GENERIC_CHANGES}'"
echo "env.HAS_GENERIC_CHANGES is '${hasGenericChanges()}'"
// try building a simple app without venv to check
// build that doesn't use design tools won't
// need Python
withTools(params.TOOLS_VERSION) {
dir("test/biquad") {
xcoreBuild()
} // dir
createVenv(reqFile: "requirements.txt")
} // tools
} // dir
} // steps
} // Build
stage('Test Biquad') {
when {
anyOf {
expression{hasGenericChanges()}
expression{hasChangesIn("biquad")}
}
}
steps {
dir("${REPO}") {
withVenv {
withTools(params.TOOLS_VERSION) {
catchError(stageResult: 'FAILURE', catchInterruptions: false){
dir("test/biquad") {
xcoreBuild()
runPytest("--dist worksteal")
}
}
}
}
}
}
} // test biquad
stage('Test Cascaded Biquads') {
when {
anyOf {
expression{hasGenericChanges()}
expression{hasChangesIn("biquad")}
expression{hasChangesIn("cascaded_biquad")}
}
}
steps {
dir("${REPO}") {
withVenv {
withTools(params.TOOLS_VERSION) {
catchError(stageResult: 'FAILURE', catchInterruptions: false){
dir("test/cascaded_biquads") {
xcoreBuild()
runPytest("--dist worksteal")
}
}
}
}
}
}
} // test cascaded biquad
stage('Unit tests') {
steps {
dir("${REPO}") {
withVenv {
withTools(params.TOOLS_VERSION) {
catchError(stageResult: 'FAILURE', catchInterruptions: false){
dir("test/unit_tests") {
runPytest("--dist worksteal")
}
}
}
}
}
}
} // Unit tests
stage('Test Utils') {
when {
anyOf {
expression{hasGenericChanges()}
expression{hasChangesIn("utils")}
expression{hasChangesIn("control")}
}
}
steps {
dir("${REPO}") {
withVenv {
withTools(params.TOOLS_VERSION) {
catchError(stageResult: 'FAILURE', catchInterruptions: false){
dir("test/utils") {
xcoreBuild()
runPytest("--dist worksteal")
}
}
}
}
}
}
} // test utils
stage('Test FIR') {
when {
anyOf {
expression{hasGenericChanges()}
expression{hasChangesIn("fir")}
}
}
steps {
dir("${REPO}") {
withVenv {
withTools(params.TOOLS_VERSION) {
catchError(stageResult: 'FAILURE', catchInterruptions: false){
dir("test/fir") {
xcoreBuild()
runPytest("--dist worksteal")
}
}
}
}
}
}
} // test SC
stage('Test SC') {
when {
anyOf {
expression{hasGenericChanges()}
expression{hasChangesIn("signal_chain")}
}
}
steps {
dir("${REPO}") {
withVenv {
withTools(params.TOOLS_VERSION) {
catchError(stageResult: 'FAILURE', catchInterruptions: false){
dir("test/signal_chain") {
xcoreBuild()
runPytest("--dist worksteal")
}
}
}
}
}
}
} // test SC
stage('Test TD block FIR') {
when {
anyOf {
expression{hasGenericChanges()}
expression{hasChangesIn("td_block")}
}
}
steps {
dir("${REPO}") {
withVenv {
withTools(params.TOOLS_VERSION) {
catchError(stageResult: 'FAILURE', catchInterruptions: false){
dir("test/td_block_fir") {
runPytest("--dist worksteal --durations=0")
}
}
}
}
}
}
} // test TD block FIR
} // stages
post {
cleanup {
xcoreCleanSandbox()
}
}
} // Build and test
stage ('Build & Test 2') {
agent {
label 'linux&&x86_64'
}
stages {
stage ('Build') {
steps {
runningOn(env.NODE_NAME)
dir("${REPO}") {
checkoutScmShallow()
script{
env.HAS_GENERIC_CHANGES = hasGenericChanges()
}
// try building a simple app without venv to check
// build that doesn't use design tools won't
// need Python
withTools(params.TOOLS_VERSION) {
dir("test/biquad") {
xcoreBuild()
} // dir
createVenv(reqFile: "requirements.txt")
} // tools
} // dir
}
} // Build
stage('Test JSON') {
steps {
dir("lib_audio_dsp") {
withVenv {
withTools(params.TOOLS_VERSION) {
catchError(stageResult: 'FAILURE', catchInterruptions: false){
// buildApps(["test/json"])
dir("test/json") {
runPytest("--dist worksteal")
}
}
}
}
}
}
} // test json
stage('Test DRC') {
when {
anyOf {
expression{hasGenericChanges()}
expression{hasChangesIn("-e drc -e env -e limit -e noise -e compressor")}
}
}
steps {
dir("${REPO}") {
withVenv {
withTools(params.TOOLS_VERSION) {
withMounts([["projects", "projects/hydra_audio", "hydra_audio_test_skype"]]) {
withEnv(["hydra_audio_PATH=$hydra_audio_test_skype_PATH"]){
catchError(stageResult: 'FAILURE', catchInterruptions: false){
dir("test/drc") {
xcoreBuild()
runPytest("--dist worksteal")
}
}
}
}
}
}
}
}
} // test drc
stage('Test Graphic EQ') {
when {
anyOf {
expression{hasGenericChanges()}
expression{hasChangesIn("-e graphic")}
}
}
steps {
dir("${REPO}") {
withVenv {
withTools(params.TOOLS_VERSION) {
catchError(stageResult: 'FAILURE', catchInterruptions: false){
dir("test/graphic_eq") {
xcoreBuild()
runPytest("--dist worksteal")
}
}
}
}
}
}
} // test geq
stage('Test Reverb') {
when {
anyOf {
expression{hasGenericChanges()}
expression{hasChangesIn("reverb")}
}
}
steps {
dir("${REPO}") {
withVenv {
withTools(params.TOOLS_VERSION) {
catchError(stageResult: 'FAILURE', catchInterruptions: false){
dir("test/reverb") {
xcoreBuild()
runPytest("--dist worksteal --durations=0")
}
}
}
}
}
}
} // test Reverb
stage('Test FD block FIR') {
when {
anyOf {
expression{hasGenericChanges()}
expression{hasChangesIn("fd_block")}
}
}
steps {
dir("${REPO}") {
withVenv {
withTools(params.TOOLS_VERSION) {
catchError(stageResult: 'FAILURE', catchInterruptions: false){
dir("test/fd_block_fir") {
runPytest("--dist worksteal --durations=0")
}
}
}
}
}
}
} // test FD block FIR
}
post {
cleanup {
xcoreCleanSandbox()
}
}
} // Build and test 2
stage('Style and docs') {
agent {
label 'documentation&&linux&&x86_64'
}
steps {
runningOn(env.NODE_NAME)
dir("${REPO}") {
checkoutScmShallow()
createVenv(reqFile: "requirements-format.txt")
withVenv {
sh 'pip install --no-deps -r requirements-format.txt'
sh "make -C python check" // ruff check
versionChecks checkReleased: false, versionsPairs: versionsPairs
buildDocs(xmosdocVenvPath:'.')
// need sandbox for lib checks
withTools(params.TOOLS_VERSION) {
dir("test/biquad") {
xcoreBuild()
} // dir
}
runLibraryChecks("${WORKSPACE}/${REPO}", "${params.INFR_APPS_VERSION}")
archiveSandbox(REPO)
}
}
}
post {
cleanup {
xcoreCleanSandbox()
}
}
} // Style and docs
stage ('Hardware Test') {
agent {
label 'xcore.ai && uhubctl'
}
steps {
runningOn(env.NODE_NAME)
sh "git clone -b ${params.XTAGCTL_VERSION} https://github0.xmos.com/xmos-int/xtagctl.git"
dir("${REPO}") {
checkoutScmShallow()
withTools(params.TOOLS_VERSION) {
createVenv(reqFile: "requirements.txt")
withVenv {
sh "pip install -e ${WORKSPACE}/xtagctl"
withXTAG(["XCORE-AI-EXPLORER"]) { adapterIDs ->
sh "xtagctl reset ${adapterIDs[0]}"
dir("test/pipeline") {
sh "python -m pytest -m group0 -n auto --junitxml=pytest_result.xml -rA -v --durations=0 -o junit_logging=all --log-cli-level=INFO --adapter-id " + adapterIDs[0]
}
}
}
}
}
}
post {
cleanup {
xcoreCleanSandbox()
}
always {
dir("${WORKSPACE}/lib_audio_dsp/test/pipeline") {
junit "pytest_result.xml"
}
}
}
} // Hardware test
stage ('Hardware Test 2') {
agent {
label 'xcore.ai && uhubctl'
}
steps {
runningOn(env.NODE_NAME)
sh "git clone -b ${params.XTAGCTL_VERSION} https://github0.xmos.com/xmos-int/xtagctl.git"
dir("${REPO}") {
checkoutScmShallow()
withTools(params.TOOLS_VERSION) {
createVenv(reqFile: "requirements.txt")
withVenv {
sh "pip install -e ${WORKSPACE}/xtagctl"
withXTAG(["XCORE-AI-EXPLORER"]) { adapterIDs ->
sh "xtagctl reset ${adapterIDs[0]}"
dir("test/pipeline") {
sh "python -m pytest -m group1 -n auto --junitxml=pytest_result.xml -rA -v --durations=0 -o junit_logging=all --log-cli-level=INFO "
}
}
}
}
}
}
post {
cleanup {
xcoreCleanSandbox()
}
always {
dir("${WORKSPACE}/lib_audio_dsp/test/pipeline") {
junit "pytest_result.xml"
}
}
}
} // Hardware test 2
} // parallel
} // CI
} // stages
} // pipeline