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也是基于这个思路编写。
运行结果:
本文到这结束,希望可以给大家参考参考。