Use a lightweight executor for a declarative pipeline stage (agent none)

前端 未结 2 1514
盖世英雄少女心
盖世英雄少女心 2020-12-14 08:02

I\'m using Jenkins Pipeline with the declarative syntax, currently with the following stages:

  1. Prepare
  2. Build (two parallel sets of steps)
  3. Test
相关标签:
2条回答
  • 2020-12-14 08:24

    There is a workaround to use the same build slave in the other stages. You can set a variable with the node name and use it in the others.

    ie:

    pipeline {
        agent none
        stages {
            stage('First Stage Gets Agent Dynamically') {
                agent {
                    node {
                        label "some-agent"
                    }
                }
                steps {
                    echo "first stage running on ${NODE_NAME}"
                    script {
                      BUILD_AGENT = NODE_NAME
                    }
                }
            }
            stage('Second Stage Setting Node by Name') {
                agent {
                    node {
                        label "${BUILD_AGENT}"
                    }
                }
                steps {
                    echo "Second stage using ${NODE_NAME}"
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-14 08:37

    Setting agent none at the top level, then agent { label 'foo' } on every stage, with agent none again on the input stage seems to work as expected for me.

    i.e. Every stage that does some work runs on the same agent, while the input stage does not consume an executor on any agent.

    pipeline {
        agent none
        stages {
            stage("Prepare build") {
                agent { label 'some-agent' }
                steps {
                    echo "prepare: ${pwd()}"
                }
            }
            stage("Build") {
                agent { label 'some-agent' }
                steps {
                    parallel(
                        frontend: {
                            echo "frontend: ${pwd()}"
                        },
                        backend: {
                            echo "backend: ${pwd()}"
                        }
                    )
                }
            }
            stage("Test") {
                agent { label 'some-agent' }
                steps {
                    parallel(
                        jslint: {
                            echo "jslint: ${pwd()}"
                        },
                        phpcs: {
                            echo "phpcs: ${pwd()}"
                        },
                    )
                }
            }
            stage("Select deploy target") {
                agent none
                steps {
                    input message: 'Deploy?'
                }
            }
            stage("Deploy") {
                agent { label 'some-agent' }
                steps {
                    echo "deploy: ${pwd()}"
                }
            }
        }
    }
    

    However, there are no guarantee that using the same agent label within a Pipeline will always end up using the same workspace, e.g. as another build of the same job while the first build is waiting on the input.

    You would have to use stash after the build steps. As you note, this cannot be done normally with parallel at the moment, so you'd have to additionally use a script block, in order to write a snippet of Scripted Pipeline for the stashing/unstashing after/before the parallel steps.

    0 讨论(0)
提交回复
热议问题