如何在Jenkins Builder完成Yocto构建后触发Programmer代理流水线
Jenkins跨代理触发流水线实现方案
针对你的需求,这里提供两种可行的实现方式,同时先修正你代码里的明显错误:把state('Trigger Programmer')改成stage('Trigger Programmer'),Jenkins Pipeline中没有state语法。
方案一:同一Pipeline内切换代理执行烧录步骤
如果Programmer的烧录逻辑相对简单,可以直接在当前Pipeline中切换到Programmer代理节点执行操作,核心是在stage中指定对应代理,并确保Builder生成的镜像文件能被该节点访问(比如通过NFS共享目录、Jenkins工件归档后拉取)。
修正后的完整示例代码:
pipeline { agent { label 'YoctoBuildNode' // 初始代理为Builder节点 } stage('Yocto') { steps { script { if (isStagingOrMaster()) { echo "Performing a full Yocto build for Staging!" sh "chown -R $USER:$USER ${env.WORKSPACE}" sh "chmod -R a+rwx ${env.WORKSPACE}" sh "${env.WORKSPACE}/jenkins_quick_start.sh" } else { echo "Building the main Application for branch ${env.BRANCH_NAME}" buildProject() } // 可选:归档Yocto镜像作为Jenkins工件,方便后续节点拉取 archiveArtifacts artifacts: 'path/to/yocto/images/**/*', fingerprint: true } } } stage('Doxygen') { steps { // 这里补充你的Doxygen生成逻辑 echo "Generating Doxygen documentation..." } } stage('Programmer烧录') { agent { label 'ProgramNode' // 切换到Programmer代理节点 } steps { script { // 方式1:如果镜像文件在共享存储(如NFS),直接访问路径 sh "path/to/programmer_script.sh /shared/yocto/images/image.bin" // 方式2:如果用Jenkins归档,先拉取工件 // copyArtifacts projectName: "${env.JOB_NAME}", selector: specific("${env.BUILD_NUMBER}"), filter: 'path/to/yocto/images/**/*' // sh "path/to/programmer_script.sh ./path/to/yocto/images/image.bin" } } } }
方案二:触发独立的Programmer流水线
如果Programmer的烧录逻辑复杂(比如包含多步骤、参数配置),建议将其做成独立的Jenkins Pipeline项目,然后在当前Builder流水线中通过build步骤触发。
步骤1:创建独立的Programmer流水线项目
假设项目名为Yocto-Image-Programmer,需要配置参数(比如镜像路径、设备ID),核心代码示例:
pipeline { agent { label 'ProgramNode' } parameters { string(name: 'IMAGE_PATH', description: 'Yocto镜像文件路径或Jenkins工件URL') string(name: 'DEVICE_ID', defaultValue: 'default', description: '被测设备ID') } stages { stage('拉取镜像') { steps { // 根据参数拉取镜像,比如从共享存储或Jenkins工件 sh "cp ${params.IMAGE_PATH} ./target_image.bin" } } stage('烧录设备') { steps { sh "path/to/burn_script.sh ./target_image.bin ${params.DEVICE_ID}" } } } }
步骤2:在Builder流水线中触发该项目
修改原流水线的Trigger Programmer阶段:
stage('触发Programmer流水线') { steps { script { // 获取Yocto镜像的路径或工件信息 def imagePath = "${env.WORKSPACE}/path/to/yocto/images/image.bin" // 触发独立流水线,传递参数 build job: 'Yocto-Image-Programmer', parameters: [ string(name: 'IMAGE_PATH', value: imagePath), string(name: 'DEVICE_ID', value: 'test-device-001') ], wait: true // 设置为false则不等待该流水线完成,继续当前流水线 } } }
关键注意事项
- 文件共享:确保Builder生成的镜像文件能被Programmer节点访问,优先使用网络共享存储(NFS/SMB),或通过Jenkins的
archiveArtifacts和copyArtifacts插件实现工件传递。 - 权限配置:Jenkins代理节点的运行用户需要有镜像文件的读取权限,以及烧录工具的执行权限。
- 触发控制:如果需要仅在特定分支(如master/staging)触发烧录,可在
Trigger Programmer阶段添加条件判断,比如when { expression { isStagingOrMaster() } }。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

