当前位置: 首页 > 面试题库 >

使用轻量级执行程序进行声明式管道阶段(代理无)

龙令
2023-03-14
问题内容

我正在将Jenkins Pipeline与声明性语法一起使用,目前处于以下阶段:

  1. 准备
  2. 构建(两组并行的步骤)
  3. 测试(也是两组平行的步骤)
  4. 询问是否/在哪里部署
  5. 部署

对于步骤1、2、3和5,我需要和代理(执行者),因为它们在工作区上进行实际工作。对于步骤4,我不需要一个,并且我不想在等待用户输入时阻止我可用的执行程序。对于经典的脚本化语法,这似乎被称为“轻量级”执行器或“轻量级”执行器,但是我找不到有关如何使用声明性语法实现此信息的任何信息。

到目前为止,我已经尝试过:

  1. 直接在管道选项中设置代理,然后agent none在舞台上进行设置。这没有任何效果,并且管道正常运行,在等待输入时阻塞了执行程序。在文档中也提到它不会起作用,但是我想还是应该尝试一下。
  2. 设置agent none管道选项,然后为每个阶段(#4除外)设置一个代理。不幸的是,但是可以预料的是,这会为每个阶段分配一个新的工作区,这反过来又需要我存储和取消存储。这既麻烦又使我在并行阶段(2和3)中遇到了其他问题,因为我不能在parallel构造之外使用代码。我假设并行步骤在同一个工作空间中运行,所以在这两个环境中存储/取消存储将产生不幸的结果。

这是我的Jenkinsfile的概述:

pipeline {
    agent {
        label 'build-slave'
    }
    stages {
        stage("Prepare build") {
            steps {
                // ...
            }
        }
        stage("Build") {
            steps {
                parallel(
                    frontend: {
                        // ...
                    },
                    backend: {
                        // ...
                    }
                )
            }
        }
        stage("Test") {
            steps {
                parallel(
                    jslint: {
                        // ...
                    },
                    phpcs: {
                        // ...
                    },
                )
            }
            post {
                // ...
            }
        }
        stage("Select deploy target") {
            steps {
                script {
                    // ... code that determines choiceParameterDefinition based on branch name ...
                    try {
                        timeout(time: 5, unit: 'MINUTES') {
                            deployEnvironment = input message: 'Deploy target', parameters: [choiceParameterDefinition]
                        }
                    } catch(ex) {
                        deployEnvironment = null
                    }
                }
            }
        }
        stage("Deploy") {
            when {
                expression {
                    return binding.variables.get("deployEnvironment")
                }
            }
            steps {
                // ...
            }
        }
    }
    post {
        // ...
    }
}

我在这里缺少什么吗,还是在当前版本中不可能?


问题答案:

设置agent none在最高级别,然后agent { label 'foo' }在每个阶段设置,再设置在舞台agent none上,这input似乎对我来说是预期的。

即,执行某些工作的每个阶段都在同一个代理上运行,而该input阶段不消耗任何代理上的执行程序。

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()}"
            }
        }
    }
}

但是,不能保证在管道中使用相同的代理标签将总是最终使用相同的工作空间,例如,当第一个构建正在等待时,作为同一作业的另一个构建input

您将必须stash在构建步骤之后使用。如您所述,目前无法正常完成此操作parallel,因此您必须另外使用一个script块,以便在并行步骤之后/之前编写脚本管道的代码段以进行隐藏/取消隐藏。



 类似资料:
  • 我正在使用声明性语法的Jenkins Pipeline,目前有以下阶段: 准备 构建(两组平行的步骤) 测试(也是两组平行的步骤) 询问是否/在何处部署 部署 对于步骤1、2、3和5,我需要和代理(一个执行者),因为他们在工作区上做实际工作。对于步骤4,我不需要一个,并且我不希望在等待用户输入时阻止可用的执行器。对于经典的脚本语法,这似乎被称为“flyweight”或“lightweight”执行

  • 问题内容: 如何报告声明式管道失败的阶段?在fail块中,我想获取failureStage.name并将其报告(最终报告为松弛)。 问题答案: PipelineVisitor是一种很好的方法。但是,如果您只想查看错误,那么利用可能会更好。 以下内容提供了每个失败步骤的映射列表,并且还遍历了下游作业。我发现它非常有用。 您将要使用共享库来避免安全沙箱警告/批准

  • 问题内容: 如何在Jenkins声明式管道中循环参数化并行阶段?(或脚本管道,如果声明式不能) 这是我简单的伪示例。如何循环(“部署serverN”)阶段? 数组可能具有1..n变量。 我不想重复代码。詹金斯管道中一定有办法吗?还是我应该使用矩阵。我已经尝试了一些,但是没有成功。 我也尝试过这种方法,但是由于前一阶段不依赖于下一阶段,因此它并不是完美的。 在Blue Ocean中应该看起来像这样(

  • 问题内容: 我正在使用jenkins管道(声明式synthax),并且想将提交推送到远程存储库。 有什么办法可以使用git插件来做到这一点吗?这是我目前正在尝试的方法: 但这不起作用。我收到以下错误: 有人可以帮忙吗?虽然问题出在密码中的特殊字符,但我不确定。 问题答案: 我们终于弄清楚了。问题很简单,我们在密码中包含特殊字符,这些特殊字符会破坏网址。 这是工作代码:

  • 问题内容: 在我的Jenkins管道中,我使用Slack集成来通知用户的步骤很少。 将通知代码编写在块中以使用重量级执行程序还是将其留在外面以使用flyweight执行程序是一种好习惯? 根据文档: 每个管道构建本身都使用flyweight执行程序在主数据库上运行,这是一个无计数的插槽,假定不会占用任何重要的计算能力。 该执行程序代表实际的Groovy脚本,该脚本几乎总是空闲的,等待步骤完成。 轻

  • 问题内容: 我有一个在Jenkins主服务器上运行过的Jenkins声明式管道,并且运行良好。但是,既然我已经尝试在从属节点上执行此操作,则在管道中调用的常规脚本无法访问工作空间中的文件。 我的jenkinsfile看起来像这样… 我可以在从站上看到它正在创建工作区,从git进行检出并正确执行脚本。但是,如果脚本中的某些内容尝试与工作空间中的文件进行交互,它将失败。 如果我有这样简单的事情… …它