在Jenkins中使用Credentials Manager和Active Choices进行身份验证

74次阅读
没有评论

问题描述

想要在Jenkins中使用Credentials来对Git进行身份验证,以便在Pipeline脚本运行之前填充Active Choices参数。在Pipeline中,用户已经通过withCredentials实现了这个目标。但是在Pipeline的预处理阶段(即Active Choices参数),Hudson扩展如withCredentialssshAgent是无法访问的。目前,用户通过在jenkins_home目录下使用未加密的密钥执行Groovy命令git ls-remote -h git@gitrepo.example.com:repo.git(这并不是一个好的做法)。

用户已经了解到可以通过阅读Jenkins及其插件的源代码来导入和构建Java对象,但这个方法似乎过于复杂。所以,用户想知道是否有一种简单的方法来导入和应用Hudson扩展到当前的Groovy脚本,或者是否有现成的解决方案(显然没有人在这种情况下发布过任何内容)。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1:使用depends_on属性控制容器运行顺序

在Docker或docker-compose中,你可以通过使用depends_on属性来确保容器 B 在容器 A 停止之前运行。下面是具体步骤:
1. 创建一个名为docker-compose.yml的文件。
2. 在该文件中定义所需的服务(容器 A 和容器 B)以及它们的配置。
3. 使用depends_on属性来指定容器 B 依赖于容器 A。
以下是一个示例docker-compose.yml文件:

version: '3'
services:
  service_a:
    image: your_image_for_service_a:latest
    # 定义容器 A 的其他配置
  service_b:
    image: your_image_for_service_b:latest
    depends_on:
      - service_a
    # 定义容器 B 的其他配置

在上面的示例中,我们定义了两个服务service_aservice_b。容器 B 通过depends_on属性指定依赖于容器 A,这将确保容器 A 在容器 B 之前启动。但需要注意,depends_on属性并不能保证容器 A 的完全可用性。如果容器 A 需要一些额外的时间来准备并变为可连接状态(如数据库启动时间),则还需要在容器 B 连接之前等待适当的时间。

方案2:使用脚本或工具管理容器启动顺序

另一种方法是编写脚本或使用工具来控制容器的运行顺序。你可以使用docker run命令手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。
以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b

用户回复

  1. 了不起的解决方案!我修改了您的脚本以符合我的喜好,并每15分钟调度一次,以始终拥有最新的分支。

用户回复

  1. 虽然我没有使用git凭据类型,但我们使用存储在凭据存储中的密钥作为API令牌,用于调用端点以填充下拉选择框。你可能可以修改以从不同的密钥中获取凭据。以下是在我们的Pipeline脚本中的示例代码。
properties(
    [
        parameters(
            [
                [
                  $class: 'ChoiceParameter',
                  choiceType: 'PT_SINGLE_SELECT',
                  name: 'Environment',
                  description: 'The environment to deploy to',
                  filterLength: 1,
                  filterable: true,
                  script: [
                    $class: 'GroovyScript',
                    fallbackScript: [
                        classpath: [],
                        sandbox: false,
                        script:
                            'return[\'Could not load envs\']'
                    ],
                    script: [
                        classpath: [],
                        sandbox: false,
                        script:
                            '''
                            #!/usr/bin/env groovy
                            import jenkins.model.*
                            import groovy.json.JsonSlurper
                            def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
                                org.jenkinsci.plugins.plaincredentials.impl.StringCredentialsImpl,
                                Jenkins.instance,
                                null,
                                null
                            );
                            def apiToken = ''
                            for (c in creds){
                              if(c.getId() == '[CREDENTIAL ID FOR API TOKEN]'){
                                apiToken = c.getSecret()
                                break
                              }
                            }
                            def get = new URL("https://example.com/envs").openConnection()
                            get.setRequestProperty("Accept", "application/json")
                            get.setRequestProperty("Authorization", "Bearer "+apiToken)
                            get.setUseCaches(false)
                            get.setDoOutput(true)
                            def getRC = get.getResponseCode()
                            def response = get.getInputStream().getText()
                            def jsonSlurper = new JsonSlurper()
                            def responseObject = jsonSlurper.parseText(response)
                            return responseObject['data']
                            '''
                    ]
                  ]
                ]
            ]
        )
    ]
)

希望对你有所帮助!

正文完