实践:使用JenkinsActive参数,让参数动起来~

2021-09-07 16:17:10 浏览数 (1)

  • JenkinsActive参数概述
  • Postman调试GitLab接口
  • 实践:动态获取Git项目标签/分支
  • 实践: JenkinsCoreAPI获取凭据

参数化构建

在使用Pipeline项目时一般都是参数化构建作业,在Jenkins的构建时,可能需要使用参数类型有复选框,单选按钮,多选值等输入的情景。

ActiveChoice参数插件安装

转到→管理Jenkins→选择管理插件→选择可用选项卡,然后搜索主动选择插件。安装并重新启动Jenkins,以正确安装插件。我的已经安装好,因此在“已安装”标签中列出。

使用Groovy脚本,生成动态参数选项值列表。参数可以动态更新,呈现为组合框,复选框,单选按钮或丰富的HTMLUI窗口小部件。

这里的`return` 语句是什么意思呢? 选项参数的值其实是一个Array数组, 所以这里最终运行的函数返回要对应上。

当作业中已定义参数的值发生更改时,可以动态更新。这里可以使用IF进行条件判断,输出相关的值。

这里使用的是IF进行判断, 判断buildType这个参数的值是否匹配某个条件,然后返回对应的选项值。场景: 根据用户选择的构建工具不同,自动填充对应的构建命令。

调试GitLab接口

进入GitLab官方文档,找到API资源文档。 找到分支的接口;

可以使用curl或者postman进行调试

代码语言:javascript复制
curl --request POST 
--header “PRIVATE-TOKEN: <your_access_token>”   
"https://gitlab.example.com/api/v4/projects/5/repository/branches?branch=newbranch&ref=master"

实践: 动态获取GitLab项目分支和标签

未优化:

代码语言:javascript复制
import groovy.json.JsonSlurper
JsonSlurper slurper = new JsonSlurper()

if (refType.equals("branch")){

  try {
    String apiServer = "https://gitlab.com/api/v4/"
    //String data = "branch=zeyang&ref=master";
    URL url = new URL(apiServer   "projects/18803707/repository/branches");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("GET");
    con.setRequestProperty("PRIVATE-TOKEN", "DTyTRQ-ky1wZJ-zSSKRW");
    con.setDoOutput(true);
    // if (data != ""){
    //    con.getOutputStream().write(data.getBytes("UTF-8"));
    // }
    con.getInputStream();
    responseCode = con.getResponseCode()
    println(responseCode)
    response = slurper.parse(con.getInputStream())
    //println(slurper.parse(response))
    // return slurper.parse(response)
    refs = []
    //println(response.getClass())
    for(item in response) {
        refs.add(item.name)
     }
    return refs
  }
  catch(Exception e) {
    return []
  }
}


if (refType.equals("tag")){

  try {
    String apiServer = "https://gitlab.com/api/v4/"
    //String data = "branch=zeyang&ref=master";
    URL url = new URL(apiServer   "projects/18803707/repository/tags");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("GET");
    con.setRequestProperty("PRIVATE-TOKEN", "DTyTRQ-ky1wZJ-zSSKRW");
    con.setDoOutput(true);
    // if (data != ""){
    //    con.getOutputStream().write(data.getBytes("UTF-8"));
    // }
    con.getInputStream();
    responseCode = con.getResponseCode()
    println(responseCode)
    response = slurper.parse(con.getInputStream())
    //println(slurper.parse(response))
    // return slurper.parse(response)
    refs = []
    //println(response.getClass())
    for(item in response) {
        refs.add(item.name)
     }
    return refs
  }
  catch(Exception e) {
    return []
  }
}

优化后:

  • 将凭据存储在Jenkins,并使用API获取;
  • 封装一个统一的HTTP请求函数;
代码语言:javascript复制
import groovy.json.JsonSlurper
import java.util.ArrayList
import jenkins.*
import jenkins.model.* 
import hudson.*
import hudson.model.*


// 获取Jenkins凭据
def GetJenkinsCredentials(id, type){
   def jenkinsCredentials = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
        com.cloudbees.plugins.credentials.Credentials.class,
        Jenkins.instance,
        null,
        null
   );
   for (creds in jenkinsCredentials) {
      if(creds.id == id){
         if (type == "secret"){
            return creds.secret
         } 
      }
      
   }
}


// 发送请求
def HttpReq(data, method, apiUrl ){
   JsonSlurper slurper = new JsonSlurper()
   String gitlabToken = GetJenkinsCredentials("bba72a35-6857-4be6-9e71-cb6eed4db403/update", "secret")
   try {
      String apiServer = "https://gitlab.com/api/v4/"
      //String data = "branch=zeyang&ref=master";
      URL url = new URL(apiServer   apiUrl);
      HttpURLConnection con = (HttpURLConnection) url.openConnection();
      con.setRequestMethod(method);
      con.setRequestProperty("PRIVATE-TOKEN", gitlabToken);
      con.setDoOutput(true);
      if (data != ""){
         con.getOutputStream().write(data.getBytes("UTF-8"));
      }
      con.getInputStream();
      responseCode = con.getResponseCode()
      //println(responseCode)
      response = con.getInputStream()
      //println(slurper.parse(response))
      return slurper.parse(response)
   }
   catch(Exception e) {
      return []
   }
}
// 获取项目的标签列表
def GetTagList(){
   refs = []
   ArrayList response = HttpReq("", "GET", "projects/18803707/repository/tags" )
   //println(response.getClass())
   for(item in response) {
      refs.add(item.name)
   }
   return refs
}

// 获取项目的分支列表
def GetBranchList(type){
   refs = []
   ArrayList response = HttpReq("", "GET", "projects/18803707/repository/branches" )
   //println(response.getClass())
   for(item in response) {
      refs.add(item.name)
   }
   return refs
}

if (refType.equals("tag")){
   refs = GetTagList()
   return refs
}


if (refType.equals("branch")){
   refs = GetBranchList()
   return refs
}

0 人点赞