在 Jenkins 作业中创建动态参数,或如何使您的任务变得用户友好

再会, 哈伯!

今天给大家分享一种使用方法 主动选择插件 做任务 詹金斯 最统一、最人性化。

介绍

对于 IT 界来说,DevOps 这样的缩写已经不是什么新鲜事了。 对于许多人来说,“do DevOps”这个短语与某种神奇的按钮相关联,当单击时,应用程序代码会自动变成已部署和测试的应用程序(一切实际上更复杂,但我们正在从所有流程中抽象出来)。

因此,我们收到了一份订单,制作这样一个神奇的按钮,以便管理员可以一键部署应用程序。 此任务有多种实现方式:从为任何即时消息程序编写机器人到开发单独的应用程序。 尽管如此,所有这些都有相同的目标 - 使应用程序的构建和部署开始尽可能透明和方便。

在我们的例子中,我们将使用 詹金斯.


在 Jenkins 作业中创建动态参数,或如何使您的任务变得用户友好

任务

创建一个方便的 Jenkins 作业,该作业将启动特定版本的选定微服务的构建和(或)部署。

在 Jenkins 作业中创建动态参数,或如何使您的任务变得用户友好

输入数据

我们有几个包含各种微服务源代码的存储库。

定义参数

应接收以下参数作为我们作业的输入:

  1. 存储库的 URL,其中包含我们要在运行作业时构建和部署的微服务代码。
  2. 将进行构建的提交的 ID。

AS IS

完成此任务的最简单方法是创建两个 String 类型的参数。

在 Jenkins 作业中创建动态参数,或如何使您的任务变得用户友好

在这种情况下,用户将需要手动输入存储库的路径和提交 ID,您会发现这并不完全方便。

在 Jenkins 作业中创建动态参数,或如何使您的任务变得用户友好

未来

现在让我们尝试另一种类型的参数来考虑它的所有优点。
让我们创建类型为 Choice Parameter 的第一个参数,第二个参数 - Active Choices Reactive Reference Parameter。 在 Choice 类型的参数中,我们将在 Choices 字段中手动添加存储微服务代码的存储库的名称。

在 Jenkins 作业中创建动态参数,或如何使您的任务变得用户友好

如果读者喜欢这篇文章,那么在下一篇文章中我将描述Jenkins中配置任务的过程,采用通过代码描述(Configuration as code)的方式,即我们不需要手动输入存储库名称并创建参数,一切都会自动发生(我们的代码将从 SCM 接收存储库列表并使用此列表创建参数)。

第二个参数的值将动态填充,具体取决于第一个参数采用的值(test1 或 test2),因为每个存储库都有自己的提交列表。

主动选择 反应参考参数 有以下字段需要填写:

  1. 名字 – 参数名称。
  2. 脚本 – 每次引用参数字段中的参数值发生更改时将执行的代码(在我们的例子中,当我们在 test1 和 test2 之间进行选择时)。
  3. 产品描述 – 参数的简要描述。
  4. 选择类型 – 脚本返回的对象类型(在我们的例子中,我们将返回 html 代码)。
  5. 参考参数 – 参数的名称,当其值更改时,将执行脚本部分的代码。

在 Jenkins 作业中创建动态参数,或如何使您的任务变得用户友好

让我们直接填写该参数中最重要的字段。 我们提供两种类型的实现可供选择:使用 Groovy 脚本 или 脚本编写器脚本.
我们选择第一个,因为 Scriptler 只是一个插件,可以保存您之前编写的脚本,并允许您在其他任务中使用它们而无需再次复制粘贴。

用于从所选存储库获取所有提交的 Groovy 代码:

AUTH = "логин и пароль в Base64"                           
GIT_URL = "url до вашей SCM (https://bitbucket.org/)"                       
PROJECT_NAME = "имя проектной области, где находятся репозитории"

def htmlBuild() {
    html = """
            <html>
            <head>
            <meta charset="windows-1251">
            <style type="text/css">
            div.grayTable {
            text-align: left;
            border-collapse: collapse;
            }
            .divTable.grayTable .divTableCell, .divTable.grayTable .divTableHead {
            padding: 0px 3px;
            }
            .divTable.grayTable .divTableBody .divTableCell {
            font-size: 13px;
            }
            </style>
            </head>
            <body>
        """

    def commitOptions = ""
    getCommitsForMicroservice(MICROSERVICE_NAME).each {
        commitOptions += "<option style='font-style: italic' value='COMMIT=${it.getKey()}'>${it}</option>"
    }
    html += """<p style="display: inline-block;">
        <select id="commit_id" size="1" name="value">
            ${commitOptions}
        </select></p></div>"""

    html += """
            </div>
            </div>
            </div>
            </body>
            </html>
         """
    return html
}

def getCommitsForMicroservice(microserviceRepo) {
    def commits = [:]
    def endpoint = GIT_URL + "/rest/api/1.0/projects/${PROJECT_NAME}/repos/${microserviceRepo}/commits"
    def conn = new URL(endpoint).openConnection()
    conn.setRequestProperty("Authorization", "Basic ${AUTH}")
    def response = new groovy.json.JsonSlurper().parseText(conn.content.text)
    response.values.each {
        commits.put(it.displayId, it.message)
    }
    return commits
}

return htmlBuild()

无需赘述,此代码接收微服务名称 (MICROSERVICE_NAME) 作为输入并向 到位桶 (方法 getCommitsForMicroservice)使用其 API,并获取给定微服务的所有提交的 ID 和提交消息。
正如前面提到的,这段代码应该返回将显示在页面上的 html 使用参数构建 在 Jenkins 中,因此我们将从 Bitbucket 接收到的所有值包装在一个列表中,并将它们添加到 select。

完成所有步骤后,我们应该得到一个如此漂亮的页面 使用参数构建.

如果您选择 test1 微服务:

在 Jenkins 作业中创建动态参数,或如何使您的任务变得用户友好

如果您选择 test2 微服务:

在 Jenkins 作业中创建动态参数,或如何使您的任务变得用户友好

同意用户以这种方式与你的任务交互会比每次复制 url 并查找所需的提交 id 方便得多。

PS 本文提供了一个非常简化的示例,在这种形式下可能没有实际用途,因为程序集具有更多不同的参数,但本文的目的是展示该工具的工作原理,而不是提供可行的解决方案。

PSS 正如我之前写的,如果这篇文章有用,那么下一篇将是关于 通过代码动态配置 Jenkins 任务.

来源: habr.com

添加评论