Skip to content

一、Active-Choices-Plugin插件将十个Job合成一个

1.安装插件

  • 官方地址:wiki.jenkins.io/display/JEN…
  • 安装方式:在Jenkins插件当中直接搜索即可安装。
  • 功能说明:根据所选参数,自动调出对应参数所依赖的后续参数

https://plugins.jenkins.io/uno-choice/

https://plugins.jenkins.io/

在jenkins<管理插件>中安装Active Choices插件,具体步骤略

2.使用前介绍

插件安装之后,可以在项目配置中的参数化配置中看到一些新增了的选项

ActiveChoices

1,Active Choices Parameter(主动选择参数)
Active Choices参数使用Groovy脚本或Scriptler目录中的脚本动态生成构建参数的值选项列表。

2,Active Choices Reactive Parameter(主动选择反应参数)
根据主动选择参数的选项而提供不同的对应值或者列表选项。

3,Active Choices Reactive Reference Parameter(主动选择反应参考参数)
根据主动选择参数的选项而展示对应参数的一些说明,与第二项的区别在于本参数只作为说明信息,而不能够作为变量往下传递
1,Active Choices Parameter(主动选择参数)
Active Choices参数使用Groovy脚本或Scriptler目录中的脚本动态生成构建参数的值选项列表。

2,Active Choices Reactive Parameter(主动选择反应参数)
根据主动选择参数的选项而提供不同的对应值或者列表选项。

3,Active Choices Reactive Reference Parameter(主动选择反应参考参数)
根据主动选择参数的选项而展示对应参数的一些说明,与第二项的区别在于本参数只作为说明信息,而不能够作为变量往下传递

1,eureka

Gitlab地址:git@192.168.10.0:ishangjie/ishangjie-eureka-server.git
port:8761
包名:ishangjie-eureka-server-1.0.0.jar
Gitlab地址:git@192.168.10.0:ishangjie/ishangjie-eureka-server.git
port:8761
包名:ishangjie-eureka-server-1.0.0.jar

2,user

Gitlab地址:git@192.168.10.0:ishangjie/ishangjie-user-service.git
port:6666
包名:ishangjie-user-service-1.0.0.jar
Gitlab地址:git@192.168.10.0:ishangjie/ishangjie-user-service.git
port:6666
包名:ishangjie-user-service-1.0.0.jar

3.创建项目

首先创建一个自由风格的Jenkins项目,然后配置一下项目构建保存历史

创建项目

4.字符参数

添加一个名为branch的字符参数以用于控制代码分支的变量

字符参数

4.选项参数

添加一个名为mode的选项参数以用于控制部署或者回滚的变量

选项参数

5.选择参数

1,主动选择参数

首先添加一个主动选择参数,用于控制项目名称这个变量

主动选择参数


    Name:project
    Groovy Script:

return[
"eureka",
"user"
]

    Description:选择对应的应用名称部署对应的应用。
    Choice Type:Radio Buttons

    Name:project
    Groovy Script:

return[
"eureka",
"user"
]

    Description:选择对应的应用名称部署对应的应用。
    Choice Type:Radio Buttons

2,主动选择反应参数

接着添加一个主动选择反应参数,用于控制项目类型这个变量

主动选择反应参数

Name:type


Groovy Script:

A=["server"]
B=["service"]
if(project.equals("eureka")){
return A
} else if(project.equals("user")){
return B
}

    Description:跟随项目的选择自动弹出对应类型
    Choice Type:Single Select
    Referenced parameters:project
Name:type


Groovy Script:

A=["server"]
B=["service"]
if(project.equals("eureka")){
return A
} else if(project.equals("user")){
return B
}

    Description:跟随项目的选择自动弹出对应类型
    Choice Type:Single Select
    Referenced parameters:project

3,主动选择反应参数

然后再添加一个主动选择反应参数,用于控制项目端口这个变量

主动选择反应参数

    Name:port
    Groovy Script:

if(project.equals("eureka")){
return ["8761"]
} else if (project.equals("user")){
return ["6666"]
}


    Description:跟随跟随项目的选择自动弹出对应端口
    Choice Type:Single Select
    Referenced parameters:project

大概有以下几个小的注意点需要注意:

1,参数的名称将是整个构建流程使用的一个变量,因此起名的时候需要注意。
2,创建了一个主动选择参数,和两个主动选择反应参数,是因为我们的实际需求需要两个真实有效的参数,如果最后的port项选择了主动选择反应参考参数,那么到后边是无法显式使用的。
3,注意后两个跟随参数中的Referenced parameters,都需要填写主动参数的名称,才能够前后贯通,实现联动。
    Name:port
    Groovy Script:

if(project.equals("eureka")){
return ["8761"]
} else if (project.equals("user")){
return ["6666"]
}


    Description:跟随跟随项目的选择自动弹出对应端口
    Choice Type:Single Select
    Referenced parameters:project

大概有以下几个小的注意点需要注意:

1,参数的名称将是整个构建流程使用的一个变量,因此起名的时候需要注意。
2,创建了一个主动选择参数,和两个主动选择反应参数,是因为我们的实际需求需要两个真实有效的参数,如果最后的port项选择了主动选择反应参考参数,那么到后边是无法显式使用的。
3,注意后两个跟随参数中的Referenced parameters,都需要填写主动参数的名称,才能够前后贯通,实现联动。

6.Git地址配置

接着就该添加Git地址了,同样,这个地方也应该合理利用项目标准化的优势,合理应用变量来进行配置

Git地址配置

7.执行脚本

#!/bin/bash
source /etc/profile
#
##set color##
echoRed() { echo $'\e[0;31m'"$1"$'\e[0m'; }
echoGreen() { echo $'\e[0;32m'"$1"$'\e[0m'; }
echoYellow() { echo $'\e[0;33m'"$1"$'\e[0m'; }
##set color##
#
version=`date +%Y%m%d%H%M%S`
echo -------------------------------------

# 克隆项目并编译
echoGreen "开始进行mvn编译!"
cd  $WORKSPACE && mvn clean install -DskipTests=true
[ $? != 0 ] && echoRed "请注意,在执行mvn编译时出错,故而退出构建,需开发同学自检代码!" && exit 1
cd  $WORKSPACE/target/ && mv ishangjie-$project-$type-1.0.0.jar app.jar

# 创建docker镜像
cat > run.sh << EOF
#!/bin/bash
source /etc/profile
java -jar /opt/app.jar --spring.profiles.active=test1
EOF

chmod +x run.sh

cat >Dockerfile << EOF
FROM 192.168.10.1/public/jdk:1.8
MAINTAINER eryajf <liqilong@edspay.com>
ENV LANG en_US.UTF-8
ADD   app.jar /opt/app.jar
ADD   run.sh  /
EXPOSE $port
ENTRYPOINT [ "sh", "-c", "/run.sh" ]
EOF

# 构建镜像
echoGreen "开始构建当次镜像!"
docker build -t 192.168.10.1/isj/$project:$version .
[ $? != 0 ] && echoRed "请注意,在执行镜像构建时出错,故而退出构建,请联系运维同学处理!" && exit 1

# 上传到docker私服
echoGreen "开始将镜像push到私服!"
docker push 192.168.10.1/isj/$project:$version
[ $? != 0 ] && echoRed "请注意,在执行镜像上传时出错,故而退出构建,请联系运维同学处理!" && exit 1
docker rmi 192.168.10.1/isj/$project:$version

#更新镜像
echoGreen "开始将最新镜像部署到远端!"
rancher kubectl set image deployment/isj-$project isj-$project=192.168.10.1/isj/$project:$version -n isj-wfw
[ $? != 0 ] && echoRed "请注意,在执行镜像更新时出错,故而退出构建,请联系运维同学处理!" && exit 1
echoGreen "部署完成!"
#!/bin/bash
source /etc/profile
#
##set color##
echoRed() { echo $'\e[0;31m'"$1"$'\e[0m'; }
echoGreen() { echo $'\e[0;32m'"$1"$'\e[0m'; }
echoYellow() { echo $'\e[0;33m'"$1"$'\e[0m'; }
##set color##
#
version=`date +%Y%m%d%H%M%S`
echo -------------------------------------

# 克隆项目并编译
echoGreen "开始进行mvn编译!"
cd  $WORKSPACE && mvn clean install -DskipTests=true
[ $? != 0 ] && echoRed "请注意,在执行mvn编译时出错,故而退出构建,需开发同学自检代码!" && exit 1
cd  $WORKSPACE/target/ && mv ishangjie-$project-$type-1.0.0.jar app.jar

# 创建docker镜像
cat > run.sh << EOF
#!/bin/bash
source /etc/profile
java -jar /opt/app.jar --spring.profiles.active=test1
EOF

chmod +x run.sh

cat >Dockerfile << EOF
FROM 192.168.10.1/public/jdk:1.8
MAINTAINER eryajf <liqilong@edspay.com>
ENV LANG en_US.UTF-8
ADD   app.jar /opt/app.jar
ADD   run.sh  /
EXPOSE $port
ENTRYPOINT [ "sh", "-c", "/run.sh" ]
EOF

# 构建镜像
echoGreen "开始构建当次镜像!"
docker build -t 192.168.10.1/isj/$project:$version .
[ $? != 0 ] && echoRed "请注意,在执行镜像构建时出错,故而退出构建,请联系运维同学处理!" && exit 1

# 上传到docker私服
echoGreen "开始将镜像push到私服!"
docker push 192.168.10.1/isj/$project:$version
[ $? != 0 ] && echoRed "请注意,在执行镜像上传时出错,故而退出构建,请联系运维同学处理!" && exit 1
docker rmi 192.168.10.1/isj/$project:$version

#更新镜像
echoGreen "开始将最新镜像部署到远端!"
rancher kubectl set image deployment/isj-$project isj-$project=192.168.10.1/isj/$project:$version -n isj-wfw
[ $? != 0 ] && echoRed "请注意,在执行镜像更新时出错,故而退出构建,请联系运维同学处理!" && exit 1
echoGreen "部署完成!"

针对这个脚本有几点简单说明:

  • 1,因为应用到了颜色输出,因此记得在构建环境当中开启color颜色输出。
  • 2,尽量在关键地方添加一下判断,然后输出明了的内容以提高生产效率,比如编译有问题,直接退出构建,输出开发自检,如果是后边构建问题,同样退出构建,输出联系运维解决。
  • 3,巧用cat的EOF特性,从而也可以将不同的变量控制进来。
  • 4,尽量将所有构建过程的内容都写到Jenkins这里来,以便于后期问题排查与分析。
  • 5,因为这是实验,因此没有添加回滚功能,如果添加的话,就针对mode参数做一个判断即可

8.构建后操作

因为是多个项目在同一个WORKSPACE下工作,因此,为了避免出现不可预知问题,这里添加了构建后清空WORKSPACE的选项

Git地址配置

  • 效果图

Git地址配置

  • 回滚案例

2.拉菜单联动效果

首先选择参数化构建过程,然后首先配置环境,环境分为:测试环境、预发布环境、正式环境,选择的组件为Choice Parameter,Name定义为environment,选项为test、pre、online,如下图

img

接着为三个环境配置联动的域名以一个域名为例,首先添加Active Choices Reacitive Parameter组件,名称定义为域名(需要在配置文件中定义为可读取该域名),选择Groovy Script选项,然后添加Groovy脚本,下列脚本含义为:如果环境是测试环境,则返回test.xxx.com、test9981.xxx.com、test9982.xxx.com,并下拉菜单默认选中test.xxx.com,如果是线上则返回app.xxx.com:selected并默认选中,如果是预发布则返回apppub.xxx.com:selected并默认选中。

if(environment.equals("test"))
{
return ["test.xxx.com:selected",

"test9981.xxx.com",
"test9982.xxx.com",
]
}
else if(environment.equals("online"))
{
return ["app.xxx.com:selected"]
}else if(environment.equals("pre"))
{
return ["apppub.xxx.com:selected"]
}
if(environment.equals("test"))
{
return ["test.xxx.com:selected",

"test9981.xxx.com",
"test9982.xxx.com",
]
}
else if(environment.equals("online"))
{
return ["app.xxx.com:selected"]
}else if(environment.equals("pre"))
{
return ["apppub.xxx.com:selected"]
}

img

接着在Fallback Script中填入return["ERROR"],如果错误就返回error

img

最后在Referenced parameters 中填入需要联动的环境的名称,这里是environment,最终就会呈现environment和域名的联动效果如下图

img

参考:

https://xuexb.com/post/jenkins-rollback.html