首页 文章

在多个同步上游作业成功后,如何让Jenkins工作开始?

提问于
浏览
68

为了尽可能快地获得反馈,我们偶尔会希望Jenkins的作业能够并行运行 . Jenkins能够在作业完成时启动多个下游作业(或“分叉”管道) . 但是,Jenkins似乎没有任何方法可以使下游作业只启动该fork的所有分支成功(或者将fork连接在一起) .

詹金斯有一个"Build after other projects are built"按钮,但我将其解释为“当 any 上游工作完成时" (not " __当开始这项工作 all 上游工作成功时”) .

这是我'm talking about. Does anyone know if a plugin exists to do what I'之后的可视化?
Build Pipeline


编辑:

当我最初在2012年发布这个问题时,Jason的答案(Join和Promoted Build插件)是最好的,而且我选择了解决方案 .

然而,dnozay的回答(The Build Flow插件)在这个问题之后大约一年左右流行,这是一个更好的答案 . 对于它的 Value ,如果人们今天问我这个问题,我现在建议改为 .

6 回答

  • 3

    我过去使用过两种解决方案:

    • 在"deploy"作业上使用Join Plugin并指定"promote"作为目标作业 . 您必须将"Functional Tests"和"Performance Tests"指定为已加入的作业,并以某种方式通过构建后启动它们 . Parameterized Trigger Plugin对此有好处 .

    • 在"deploy"作业上使用Promoted Builds Plugin,指定在下游作业完成时有效的促销,并指定功能和性能测试作业 . 作为促销活动的一部分,触发"promote"工作 . 您仍然必须从"deploy"开始两个测试作业

    这两种解决方案都有一个重要方面:必须正确使用指纹 . 这是我发现的:

    • "build"作业必须初始化新的指纹文件 . 换句话说,它必须指出Jenkins认为是由初始作业发起的一些文件 . 仔细检查作业的"See Fingerprints"链接以验证这一点 .

    • 所有下游链接作业(在本例中为"deploy","Functional Tests"和"Performance tests")需要获取并指纹同一文件 . Copy Artifacts插件非常适合这类事情 .

    • 请记住,某些插件允许您更改指纹识别和下游作业启动的顺序;在这种情况下,指纹必须在下游作业指纹同一文件之前发生,以确保正确设置指纹的ORIGIN .

  • 30

    Pipeline插件

    您可以使用Pipeline Plugin(以前为 workflow-plugin ) .

    它附带many examples,你可以按照这个tutorial .

    例如

    // build
    stage 'build'
    ...
    
    // deploy
    stage 'deploy'
    ...
    
    // run tests in parallel
    stage 'test'
    parallel 'functional': {
      ...
    }, 'performance': {
      ...
    }
    
    // promote artifacts
    stage 'promote'
    ...
    

    构建流程插件

    您也可以使用Build Flow Plugin . 它简直太棒了 - 但它已被弃用(开发冻结) .

    设置作业

    创建工作:

    • build

    • 部署

    • 性能测试

    • 功能测试

    • 促销

    设置上游

    • 在上游(这里 build )创建一个独特的神器,例如:
    echo ${BUILD_TAG} > build.tag
    
    • 归档 build.tag 工件 .

    • 记录指纹以跟踪文件使用情况;如果任何作业复制相同的 build.tag 文件并记录指纹,您将能够跟踪父项 .

    • 配置在 promotion 作业成功时获得提升 .

    设置下游作业

    • 我使用了2个参数 PARENT_JOB_NAMEPARENT_BUILD_NUMBER

    • 使用Copy Artifact Plugin从上游 build 作业复制工件

    • 项目名称= ${PARENT_JOB_NAME}

    • 哪个版本= ${PARENT_BUILD_NUMBER}

    • 要复制的工件= build.tag

    • 记录指纹;这至关重要 .

    设置下游促销作业

    与上述相同, Build 上下游关系 . 它不需要任何构建步骤 . 您可以执行其他后期构建操作,例如“嘿QA,轮到你了” .

    创建构建流程作业

    // start with the build
    parent = build("build")
    parent_job_name = parent.environment["JOB_NAME"]
    parent_build_number = parent.environment["BUILD_NUMBER"]
    
    // then deploy
    build("deploy")
    
    // then your qualifying tests
    parallel (
        { build("functional tests",
              PARENT_BUILD_NUMBER: parent_build_number,
              PARENT_JOB_NAME: parent_job_name) },
        { build("performance tests",
              PARENT_BUILD_NUMBER: parent_build_number,
              PARENT_JOB_NAME: parent_job_name) }
    )
    
    // if nothing failed till now...
    build("promotion",
        PARENT_BUILD_NUMBER: parent_build_number,
        PARENT_JOB_NAME: parent_job_name)
    
    // knock yourself out...
    build("more expensive QA tests",
        PARENT_BUILD_NUMBER: parent_build_number,
        PARENT_JOB_NAME: parent_job_name)
    

    祝好运 .

  • 8

    Jenkins最近announced对工作流程的一流支持 .

  • 1

    Multijob plugin可以很好地适应这种情况 . 如果您希望单个"parent"作业启动多个"child"作业但仍能够自己手动执行每个子项,它也会派上用场 . 这可以通过创建"phases"来实现,您可以向其中添加1到n个作业 . 构建仅在整个阶段完成后才会继续,因此如果一个阶段作为多个作业,则必须在执行其余任务之前完成 . 当然,如果阶段内存在故障,则可以配置构建是否继续 .

  • 11

    jason和dnozay的答案已经足够好了 . 但如果有人正在寻找简单的方法,只需使用JobFanIn plugin .

  • 26

    我相信Workflow Plugin现在被称为Pipeline Plugin,并且是原始问题的(当前)首选解决方案,受Build Flow Plugin的启发 . GitHub中还有一个Getting Started Tutorial .

相关问题