You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:05:57