Jenkins 管道可以有可选的输入步骤吗?

2023-12-22

是否可以创建带有可选输入阶段的 Jenkins 管道?

下面的代码片段没有实现这个目标。

预期行为

该阶段(以及输入提示)应该仅针对特定分支运行。

实际行为

此阶段适用于所有分支机构。使用输入步骤时,when 过滤器将被忽略。

stage('Approve') {
            when {
                expression { BRANCH_NAME ==~ /^qa[\w-_]*$/ }
            }
            input {
                message "Approve release?"
                ok "y"
                submitter "admin"
                parameters {
                    string(name: 'IS_APPROVED', defaultValue: 'y', description: 'Deploy to master?')
                }
            }
            steps {
                script {
                    if (IS_APPROVED != 'y') {
                        currentBuild.result = "ABORTED"
                        error "User cancelled"
                    }
                }
            }
        }

过滤器不会被忽略,它只是在输入步骤之后进行评估。在您的示例中,总会询问您是否部署,如果您不在 QA 分支,则不会发生任何情况。

现在你可能会问为什么 Jenkins 不首先评估 'when' 指令。在这种情况下,您无法在 when 条件中使用输入参数。

拥有多个when指令就像在声明性管道中编写脚本一样。

但是,有一个表达式可以让您控制何时计算 'when' 指令。这是之前的代理 https://jenkins.io/doc/book/pipeline/syntax/。它允许您在分配代理之前评估when语句。与此类似,您需要类似 beforeInput 的东西。你可以创建功能请求 https://issues.jenkins-ci.org/为了那个原因。

我不再使用输入指令,而是现在在脚本块中使用输入,因为这提供了更大的灵活性,例如当有人必须批准某件事时,我会发送 Slack 通知,这对于声明式方法来说是不可能的。为此,您需要一个通知指令。如果有的话,是在输入步骤之前还是之后对其进行评估?

你看,做所有声明性的事情并不总是最好的方法。所以我推荐的方法如下(免责声明:这未经测试!):

pipeline {
  // We want to use agents per stage to avoid blocking our build agents
  // while we are waiting for user input.
  agent none
  ...
  // The question mark naming convention is helpful to show you which
  //  approval stage belongs to which work stage.
  stage('Release?') {
    // Don't allocate an agent because we don't want to block our
    // slaves while waiting for user input.
    agent none
    when {
      // You forgot the 'env.' in your example above ;)
      expression { env.BRANCH_NAME ==~ /^qa[\w-_]*$/ }
    }
    options {
      // Optionally, let's add a timeout that we don't allow ancient
      // builds to be released.
      timeout time: 14, unit: 'DAYS' 
    }
    steps {
      // Optionally, send some notifications to the approver before
      // asking for input. You can't do that with the input directive
      // without using an extra stage.
      slackSend ...

      // The input statement has to go to a script block because we
      // want to assign the result to an environment variable. As we 
      // want to stay as declarative as possible, we put noting but
      // this into the script block.
      script {
        // Assign the 'DO_RELEASE' environment variable that is going
        //  to be used in the next stage.
        env.DO_RELEASE = input ...
      }
      // In case you approved multiple pipeline runs in parallel, this
      // milestone would kill the older runs and prevent deploying
      // older releases over newer ones.
      milestone 1
    }
  }
  stage('Release') {
    // We need a real agent, because we want to do some real work.
    agent any
    when {
      // Evaluate the 'when' directive before allocating the agent.
      beforeAgent true
      // Only execute the step when the release has been approved.
      environment name: 'DO_RELEASE', value: 'yes'
    }
    steps {
      // Make sure that only one release can happen at a time.
      lock('release') {
        // As using the first milestone only would introduce a race 
        // condition (assume that the older build would enter the 
        // milestone first, but the lock second) and Jenkins does
        // not support inter-stage locks yet, we need a second 
        // milestone to make sure that older builds don't overwrite
        // newer ones.
        milestone 2

        // Now do the actual work here.
        ...
      }
    }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jenkins 管道可以有可选的输入步骤吗? 的相关文章

  • Jenkins 管道作业无法在 UI 中完成

    目前的问题是詹金斯管道作业确实运行并正常完成 但在 UI 中 该工作会一直保留 直到我们通过 UI 中止他 这种情况并不常见 大概只占 5 的工作岗位 这可能是詹金斯错误 重新加载配置问题或只是节点上的流量太大 我真的不确定 由于所有 有问
  • 如何通过运行构建队列重新启动 Jenkins?

    我们的 Jenkins 执行大量集成测试 詹金斯运行的时间越长 测试所需的时间就越长 因此 我们每天晚上通过 cronjob 重新启动 Jenkins 服务器 同时 构建队列太长而无法完成 当前正在运行的作业被取消并失败 那太丑了 我找到了
  • Jenkins 脚本化管道或声明式管道

    我正在尝试将旧式项目基础工作流程转换为基于 Jenkins 的管道 在经历的同时docs https jenkins io doc book pipeline 我发现有两种不同的语法名为scripted and declarative 比如
  • 从 Jenkins Pipeline 捕获 shell 脚本输出

    我正在尝试提取 git 分支并在 Jenkinsfile 中提交信息 如下所示 def commit sh returnStdout true script git rev parse HEAD trim def branch sh ret
  • 詹金斯:捕获错误跳到下一阶段,但仍然显示错误阶段失败

    我目前正在使用詹金斯catchError https www jenkins io doc pipeline steps workflow basic steps catcherror catch error and set build r
  • Jenkins 并行管道中的顺序阶段

    我在 Jenkins 中有一个动态脚本化管道 它有许多并行阶段 但在每个阶段内都有多个串行步骤 我已经浪费了好几天的时间试图让它工作 无论我尝试什么 所有串行子阶段都集中到一个阶段 这是我现在所拥有的 node stage Parallel
  • 如何跳过 Maven 存储库中的发布或特定模块

    Heyho 我有一个具有以下结构的 Maven 项目 parent 项目清单 API模块 module2 module5 test 分配 组装 所以首先我运行父模块 然后运行构建 api 的模块 然后运行依赖于 api 的模块 然后运行一个
  • 致命:Jenkins IIS ID 无效

    我正在尝试设置 Jenkins 从 bitbucket 中提取并构建一个项目 我在 IIS 8 5 Server 2012 r2 上使用它 我已经设置了 Git 和 Bitbucket 插件 我已经建立了一个包含以下内容的项目 Branch
  • 严重:https://jenkins.domainname.com/tcpSlaveAgentListener/ 似乎正在发布无效的 X-Instance-Identity

    我们正在尝试将之前连接的代理连接到 Jenkins 服务器 我们得到以下错误 SEVERE https jenkins domainname com tcpSlaveAgentListener appears to be publishin
  • 有没有办法将 Jenkins 与 Github Pull 请求结合使用?

    我希望 Jenkins 自动查找并运行属于开放拉取请求一部分的每个分支的测试套件 我还没有找到一些 Jenkins 插件 这可能吗 最近发布了一个新插件Jenkins Github 拉取请求构建器 https wiki jenkins ci
  • 在 Jenkins 中执行批处理文件

    我有一个简单的批处理文件 我想要从 Jenkins 调用 运行 执行该文件 Jenkins 中有同样的插件吗 如何从 Jenkins 执行批处理文件 如果有相同的教程或文档 无需为此添加新插件 在Jenkins 选择您的工作名称并转到配置部
  • 如何在 Jenkins 服务器上运行 Jest 测试

    我正在尝试运行我的Jest https facebook github io jest 在 Jenkins 部署期间进行测试 如果我 ssh 进入服务器 我可以 sudo 进入 Jenkins 用户并从工作区成功运行测试 但是 当我尝试从
  • Gitlab 合并请求事件不触发 Jenkins 多分支管道

    我正在尝试在合并请求事件上使用 GitLab Webhook 触发 Jenkins 多分支管道作业 当我测试 Webhook 时 我收到以下消息 Hook 执行成功但返回 HTTP 409 当我设置不同的 GitLab Webhook 例如
  • 詹金斯没有运行任何作业

    我在尝试解决其他一些问题时成功地破坏了詹金斯 现在 每当我运行作业时 它都会立即失败并出现以下错误 java lang NullPointerException at java util TreeMap putAll TreeMap jav
  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa
  • 当 Jenkins 在 Ubuntu 上作为守护进程运行时,如何为 Jenkins 提供更多堆空间?

    我的 Jenkins 作业内存不足 给java lang OutOfMemoryError构建日志中的消息 但我使用了 Ubuntu 包管理器 aptitude or apt get安装 Jenkins 我不知道在哪里可以更改分配给 Jen
  • 如何在 Jenkins 成功构建后触发参数化构建?

    我有三个管道项目 项目 a 项目 b 和项目 c 项目 c 采用一个参数 成功完成项目 a 或项目 b 后 我想使用参数触发项目 c 的构建 我可以在项目 a 和项目 b 中使用管道中的以下代码执行此操作 stage trigger pro
  • Jenkins:从神器部署战争文件

    我们正在使用Jenkins建立 maven 并部署工件 JAR 和 WAR s 到内部工件服务器 快照和版本 对于部署 目前 我们有 Jenkins 作业来打包 war 文件 来自发布 scm 标签 并部署到不同的环境 服务器 我们想要跳过
  • Android 模拟器插件无法初始化后端 EGL 显示

    我在 Cloudbees 上设置了 Jenkins 作业 并且可以在那里成功签出并编译我的 Android 项目 现在我想在 android 模拟器中运行一些 JUnit 测试并添加 Android 模拟器插件 我将 显示模拟器窗口 选项设
  • Jenkins GIT 包含从未构建过的区域

    我正在尝试使用包含区域在 Jenkins 中构建我的工作 但每当选中此选项时 民意调查结果总是说未检测到任何更改 我尝试了许多不同的路径 以及使用工作区进行 不进行强制轮询 结果是轮询从未检测到任何更改 但一旦我删除这些选项 它们就会在下一

随机推荐

  • 如何调整图像大小或作为 NSAttributedString NSTextAttachment 完成(或设置其初始大小)

    我有一个 NSAttributedString 我要向其中添加一个 NSTextAttachment 该图像为 50w x 50h 但我希望它缩小以反映属性字符串的行高 我以为这会自动完成 但我想不会 我查看了 UImage 类参考 但该图
  • Java 8 LocalDateTime 的周末过滤器

    我想写一个布尔值函数 如果给定则返回 trueLocalDateTime落在两个特定时间点之间 否则为 false 具体来说我想要一个LocalDateTime过滤给定日期是否在 22 00 GMT Friday 和 23 00 GMT S
  • Google Play 服务已过时。需要 10084000 但找到 9879470。无法更新

    我正在使用 Firebase 制作一个 Android 应用程序 这些是引起问题的行 dependencies compile com google firebase firebase core 10 0 1 compile com goo
  • AsyncTask 在后台运行时看不到 ProgressDialog

    我在我的应用程序中使用 AsyncTask 来下载网址 我在 onPreExecute 上使用 ProgressDialog 来等待 但在进程完成时我看不到 ProgressDialog 我暂时看到了它 想在下载时看到它而不是下载后看到它
  • 将 PreferenceScreen 类型设置为“选择联系人”

    我有一个带有一些 EditText 和 CheckBox 首选项的 PreferenceActivity 我想添加联系人首选项 以便按下按钮时可以选择联系人号码 使用 PreferenceActivity 功能可以吗 TIA Pat Lon
  • 如何在body标签中insertBefore()元素?

    我尝试在 js 中使用 insertBefore 如下所示 var p document createElement p p innerHTML test1 document body insertBefore p null var p d
  • Node.js 日志记录

    是否有任何库可以帮助我处理 Node Js 应用程序中的日志记录 我想做的就是 我想将所有日志写入一个文件 并且我还需要一个选项 例如在特定大小或日期后推出文件 我已经合并了 log4js 我试图将所有配置详细信息保存在一个文件中 并仅使用
  • python 中使用线程的超时函数不起作用

    我找到了创建超时函数的代码here http code activestate com recipes 473878 timeout function using threading 这似乎不起作用 完整的测试代码如下 def timeou
  • Ninject 使用 RavenDB 会话绑定到 MVC3 中的常量值的问题

    我见过很多使用 ASP NET MVC 配置 Ninject 的不同方法 但随着 MVC 框架的每个版本的发布 实现似乎都略有变化 我正在尝试将 RavenDB 会话注入我的存储库 这是我所拥有的几乎可以工作的东西 public class
  • 使用 rasa nlu ValueError 进行训练时:文件 x.json 的数据格式未知

    我正在使用 rasa nlu 训练 json 文件数据以进行意图分类 当我使用任何 md 文件进行训练时 它正在工作 但是当我尝试使用 json 文件时 它显示错误 我尝试验证 json 文件的格式是否正确 from rasa nlu tr
  • 如何在 x86/x64 中创建跳转表?

    我目前正在学习 x86 x64 asm 我想尝试制作一个跳转表 但我不知道我做错了什么 这个概念本身对我来说并不新鲜 我只是不明白为什么它不起作用 当我研究这个问题时 我几次看到 的用法 但我不确定这是否是正确的方法 data var qw
  • 谷歌地图:检查折线是否穿过圆

    我想问一下如何检查某条折线是否穿过圆 在下图中 红色折线穿过绿色圆圈内部 我知道可以确定标记是否在圆内 但我不知道该怎么做 也不知道它对于折线是否可行 我还有 8 点声誉 所以无法发布图片 图片链接如下 https i stack imgu
  • Android 中透明背景的对话框

    如何从 Android 对话框中删除黑色背景 图片显示了问题所在 final Dialog dialog new Dialog Screen1 this dialog requestWindowFeature Window FEATURE
  • Java-泽西岛、JAX RS

    我有一些开发 Java 程序的经验 然而 我一直很难理解一些基础知识 例如构成 Java 企业应用程序的所有不同组件 例如 我已经实现了从 J2ME 应用程序使用的基于 RESTful 和 SOAP 的 Web 服务 并为我的 MSC 执行
  • 从 Java 访问元组的奇怪行为

    我正在寻找关于我在 Java 访问在 Scala 中创建的元组中发现的非常奇怪的行为的解释和 或版本控制详细信息 如果可能 我将通过我所做的简单测试来展示奇怪的行为 我创建了这个 Scala 类 class Foo def intsNull
  • 在 SQLAlchemy 中插入时处理重复的主键(声明式风格)

    我的应用程序使用范围会话和 SQLALchemy 的声明式风格 这是一个网络应用程序 许多数据库插入都是由Celery 任务调度程序 通常 当决定插入对象时 我的代码可能会执行以下操作 from schema import Session
  • NSTask 启动路径不可访问。在 Xcode 中工作。 XCode 显示错误

    好的 关于堆栈溢出有几个与此相关的问题 这是唯一的问题 https stackoverflow com questions 8254680 nstask only returning standarderror in release bui
  • 谷歌数据流防火墙规则/网络标记

    我正在尝试从谷歌数据流批处理连接到cassandra 具有防火墙规则标签 此外数据流服务将创建带有 数据流 标记的工作人员 是否可以更改默认标签 或者添加更多标签 我认为目前无法更改数据流服务创建虚拟机所用的标签 但是 可以通过指定参数来控
  • 访问子表单数据表仅返回 1 个结果

    我知道这个问题已经以某种形式或方式被多次提出 但我无法找到有效的解决方案 这让我发疯 我正在 Access 中创建一个搜索表单 该表单通过 VBA 执行选择查询来查找表中的数据 到目前为止 这非常简单 查询有效 并且表单返回结果 问题是我正
  • Jenkins 管道可以有可选的输入步骤吗?

    是否可以创建带有可选输入阶段的 Jenkins 管道 下面的代码片段没有实现这个目标 预期行为 该阶段 以及输入提示 应该仅针对特定分支运行 实际行为 此阶段适用于所有分支机构 使用输入步骤时 when 过滤器将被忽略 stage Appr