jenkins 关联参数_jenkins参数联动,实现多级菜单关联,动态下拉菜单展示供选择构建...

本文介绍了如何使用jenkins的Active Choices插件配合Groovy脚本,实现参数化构建过程中的多级菜单联动。通过选择不同的项目(如red1.hat.com, red2.hat.com, red3.hat.com),动态更新分支和版本号的下拉菜单,简化构建流程。详细步骤包括安装插件、配置参数和编写Groovy及Shell脚本。" 120241084,10837650,Harbor私有仓库搭建与管理,"['docker', 'Harbor构建', '容器服务']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、首先看一下实现的效果:

选中不同的项目(TARGET_PROJECT),下面的分支,版本号的选项都会自动刷新,实现不用人工输入即可构建job,本文的构建适合用于php+gitlab代码更新,为方便实验gitlab用的是github的公共仓库,再次由于不熟悉groovy语法,利用的是shell脚本执行的返回值,简单处理后再展示,对于参数怎么传怎么取,本文可以提供一个完美的参考。

2、所用插件:Active Choices

Plug-in、Groovy、Pipeline

3、所用jenkins是运行在docker之上,版本为2.164.3

docker启动命令:

docker run   -u

root   --rm

-d   -p

8080:8080   -p

50000:50000   -v

jenkins-data:/var/jenkins_home

-v /var/run/docker.sock:/var/run/docker.sock

jenkins/jenkins:2.164.3

4、初始化安装插件完成之后,新建一个pipline任务,我这边已经建好,所以提示已存在

5、勾选参数化构建过程

一、添加选项参数:

名称:TARGET_PROJECT

选项:

red1.hat.com

red2.hat.com

red3.hat.com

描述:

请选择要发布域名:

二、添加参数-Active

Choices Reactive Parameter:

Name:TARGET_BRANCH

勾选Groovy Script,脚本为:

if(TARGET_PROJECT.equals("red1.hat.com")){

def gettags = ("git

ls-remote -h

https://github.com/lanmaodage/groovy1.git").execute()

gettags.text.readLines().collect {

it.split()[1].replaceAll('refs/heads/', '') }.unique()

}else if(TARGET_PROJECT.equals("red2.hat.com")){

def gettags = ("git

ls-remote -h

https://github.com/lanmaodage/groovy2.git").execute()

gettags.text.readLines().collect {

it.split()[1].replaceAll('refs/heads/', '') }.unique()

}else if(TARGET_PROJECT.equals("red3.hat.com")){

def gettags = ("git

ls-remote -h

https://github.com/lanmaodage/groovy3.git").execute()

gettags.text.readLines().collect {

it.split()[1].replaceAll('refs/heads/', '') }.unique()

}else{

return ["unknow

project"]

}

这一段代码是远程获取仓库分支。

Description:请选择对应的分支:

Choice Type:Single Select单选

Referenced

parameters:TARGET_PROJECT

这里是重点,参考的参数,这里写的是上边的选项参数的名字:TARGET_PROJECT,也就是说,当这个参数发生变化是,就会触发执行上边的Groovy

Script一次,以些来获取对应的项目分支。

三、再添加参数-Active

Choices Reactive Parameter:

Name:TARGET_COMMITID

勾选Groovy Script,脚本为:

branchname=TARGET_BRANCH

proname=TARGET_PROJECT

def greeting = "/bin/sh /var/jenkins_home/groovy/get-commitid.sh

${proname} ${branchname}".execute().text.readLines()

greeting.each{commitid->

println commitid

}

这里也是重点:groovy里面变量的引用,上边if的判断也是直接引用参数的名称,后面在传递给shell脚本参数才可以用${proname}${branchname}

,特殊的是也是可以用${TARGET_BRANCH}来直接引用的,回头看我这里的做法有点多此一举了。

cat

/var/jenkins_home/groovy/get-commitid.sh

#!/bin/sh

maven_dir="/data/maven"

gitlab_address="github.com"

domain_name="$1"

branch_name="$2"

case "$1" in

"red1.hat.com")

git_project="/lanmaodage/groovy1.git";;

"red2.hat.com")

git_project="/lanmaodage/groovy2.git";;

"red3.hat.com")

git_project="/lanmaodage/groovy3.git";;

*)

exit;;

esac

gitUrl="http://${gitlab_address}$git_project"

if [ ! -d ${maven_dir} ]; then

mkdir -p ${maven_dir}

fi

if [ -z "${domain_name}" -o -z "${branch_name}" ];

then

exit

fi

mkdir -p ${maven_dir}/${domain_name}

cd ${maven_dir}/${domain_name}

housename=`echo $git_project|awk -F'/' '{print $3}'|sed

's/.git//'`

if [ ! -e "$housename/.git/config" ]; then

#rm -rf *

git clone -b ${branch_name} "${gitUrl}"

1>/dev/null

2>&1

if [ $? -gt 0 ]; then

exit

fi

fi

cd $housename

git pull 1>/dev/null

2>&1

git checkout ${branch_name} 1>/dev/null

2>&1

git log -15 --pretty=format:"%h %an : %s"

--date=format:'%Y-%m-%d %H:%M:%S'

这里的shell是返回git

log自定义格式的15条日志,由于docker镜像里面用的是debian的系统,这里命令在centos7下可能会有报错。

Description:请选择对应的版本号:

Choice Type:Single Select单选

Referenced

parameters:TARGET_BRANCH,TARGET_PROJECT

这里要是参考多个参数,用逗号隔开即可

四、高级项目选项-流水线:

定义 Pipeline script:

node {

stage("deploy") {

commit_id= sh returnStdout: true ,script: "echo

${TARGET_COMMITID}|cut -c1-8"

commit_id = commit_id.trim()

sshPublisher(publishers:

[

sshPublisherDesc(configName: 'node1', verbose: true,

transfers:

[sshTransfer(

sourceFiles: '', remoteDirectory:

'',

execCommand: "/bin/sh /opt/groovy/deploy.sh

${TARGET_PROJECT} ${TARGET_BRANCH} ${commit_id}"

)])

])

}

}

cat

/opt/groovy/deploy.sh

#!/bin/sh

domain_name="$1"

branch_name=`echo $2|sed

's/[^0-9a-zA-Z_.-]/-/g'`

version_name="$3"

curdate=`date +%Y%m%d-%H%M%S`

clone_add="/data/maven"

code_type="php"

if [ $# -lt 3 ]; then

exit

fi

case $1 in

"red1.hat.com")

reponame=/lanmaodage/groovy1.git

;;

"red2.hat.com")

reponame=/lanmaodage/groovy2.git

;;

"red3.hat.com")

reponame=/lanmaodage/groovy3.git

;;

*)

exit

;;

esac

housename=`echo $reponame|awk -F'/' '{print $3}'|sed

's/.git//'`

if [ ! -d $clone_add/$domain_name/$housename/.git

];then

mkdir -p

$clone_add/$domain_name

cd

$clone_add/$domain_name

git clone

http://github.com$reponame

if [ $? -ne 0

];then

echo "git clone fail"

exit

fi

fi

cd $clone_add/$domain_name/$housename

git pull

git checkout $branch_name

git reset --hard $version_name

newcode_dir="/data/newcode/$code_type/$domain_name/"$branch_name"."$version_name"."$curdate""

mkdir -p $newcode_dir

work_dir="/data/work/$code_type/$domain_name"

mkdir -p $work_dir

cd $clone_add/$domain_name/$housename

rsync -avz -q --delete --exclude "*.git" *

$newcode_dir

if [ -d $work_dir ];then

mv $work_dir /tmp/$domain_name.$curdate

ln -sfn $newcode_dir $work_dir

else

ln -sfn $newcode_dir $work_dir

fi

[ $? -eq 0 ] && echo

"update $domain_name success"

注意:这个脚本要放在目标机器node1上,还要对TARGET_BRANCH进行特殊处理,因为分支有可能是带特殊字符()/;php代码,只需在网站根目录,对软链更新即可,deploy.sh也是基于这个思路编写。

运行结果:​

​本文到这结束,希望可以给大家参考参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值