1、新建一个流水线项目
进入配置最下方的流水线,可以选择hello world最简单的demo体验。
2、编写流水线脚本
2.1、编写整体的流水线脚本
整体他脚本格式如下,我们只要在对应的
//所有的脚本命令都放在pipeline中
pipeline {
//指定任务在哪个集群节点中执行
agent any
//声明全局变量,方便后面使用
environment {
key = 'value'
}
stages {
stage('拉取git仓库代码') {
steps {
echo '拉取git仓库代码 ok'
}
}
stage('通过maven构建项目') {
steps {
echo '通过maven构建项目 ok'
}
}
stage('通过sonarqube做代码质量检测') {
steps {
echo '通过sonarqube做代码质量检测 ok'
}
}
stage('通过docker制作自定义镜像') {
steps {
echo '通过docker制作自定义镜像 ok'
}
}
stage('将自定义对象推送到harbor仓库') {
steps {
echo '将自定义对象推送到harbor仓库 ok'
}
}
stage('通过publish over ssh通知目标服务器') {
steps {
echo '通过publish over ssh通知目标服务器 ok'
}
}
}
}
2.2、生成流水线语法
点击“流水线语法”链接进去
里边有很多实例步骤,可以根据具体的需求选项生成,比如我们要生成一段git拉取代码的脚本,选择如下图:
线下相关的git信息后,直接点击生成流水线脚本即可。
2.3、将流水线脚本放到git上管理
为了方便维护流水线脚本,我们还可以将脚本放到git上,需要在项目根目录增加jenkinsfile文件,将对应的脚本放到这个文件即可。
2.4、制作完整流水线脚本
2.4.1、拉取git仓库代码
通过流水线语法->示例步骤->checkout: check out from version control>生成流水线脚本
生成的脚本如下,其中$tag为上文定义的标签名称:
checkout scmgit(branches: [[name: '$tag']], extensions: [], userremoteconfigs: [[url: 'http://192.168.88.125:8929/root/devops-test.git']])
将其粘贴到jenkinsfile文件中
2.4.2、通过maven构建项目
通过流水线语法->示例步骤->sh: shell script>生成流水线脚本
其中sell script输入以下打包原始脚本:
/var/jenkins_home/maven/bin/mvn clean package -dskiptests
生成的脚本如下
生成的流水线脚本如下:
sh '/var/jenkins_home/maven/bin/mvn clean package -dskiptests'
将其粘贴到jenkinsfile文件中对应的步骤
2.4.3、通过docker制作自定义镜像
同理,原始脚本:
mv ./target/*.jar ./docker/
docker build -t ${job_name}:${tag} ./docker/
生成的流水线脚本如下:
sh '''mv ./target/*.jar ./docker/
docker build -t ${job_name}:${tag} ./docker/'''
2.4.4、推送自定义对象到harbor仓库
同理,原始脚本:
docker login -u ${harboruser} -p ${harborpassword} ${harboraddress}
docker tag ${job_name}:${tag} ${harboraddress}/${harborrepo}/${job_name}:${tag}
docker push ${harboraddress}/${harborrepo}/${job_name}:${tag}
docker image prune -f
其中,${harboruser} 、${harborpassword}、${harboraddress}、${harborrepo}为jenkinsfile头部声明的全局变量,即harbor的信息。
生成的流水线脚本如下:
sh '''docker login -u ${harboruser} -p ${harborpassword} ${harboraddress}
docker tag ${job_name}:${tag} ${harboraddress}/${harborrepo}/${job_name}:${tag}
docker push ${harboraddress}/${harborrepo}/${job_name}:${tag}
docker image prune -f'''
2.4.5、通知目标服务器
这里使用publish over ssh通知目标服务器。
通过jenkins 流水线语法->示例步骤->sshpublisher: send build artifacts over ssh>生成流水线脚本
直接在exec command项写如下原始脚本
/usr/bin/deploy.sh $harboraddress $harborrepo $job_name $tag $hostport $containerport
注意:
1、上面脚本$hostport、$containerport这两个需要在jenkins参数里定义,如分别设置8081、8080。
2、因为是在执行脚本的时候引用,这里变量就不要加花括号了直接$变量名。
附:之前写的deploy.sh脚本如下
#测试脚本:./deploy.sh 192.168.88.125:80 repo devops-test v1.1.0 8081 8080
harboraddr=$1
harborrepo=$2
project=$3
version=$4
#宿主机端口
hostport=$5
#容器端口
containerport=$6
imagename=$harboraddr/$harborrepo/$project:$version
echo -e "当前镜像信息:$imagename \n"
#停止并删除原有容器
containerid=`docker ps -a | grep ${project} | awk '{print $1}'`
if [ "$containerid" != "" ] ; then
echo "停止并删除原有的容器:$containerid ……"
docker stop $containerid
docker rm $containerid
echo -e "删除容器完毕。\n"
fi
#删除原有镜像
tag=`docker images | grep ${project} | awk '{print $2}'`
if [[ "$tag" =~ "$version" ]] ; then
echo "删除原有镜像:$version ……"
docker rmi $imagename
echo -e "删除镜像完毕。\n"
fi
#登录harbor
docker login -u admin -p harbor12345 $harboraddr
#拉取镜像
echo "开始拉取镜像:$imagename ……"
docker pull $imagename
echo -e "拉取镜像完毕。\n"
#部署镜像
echo "开始部署镜像 ……"
docker run -d -p $hostport:$containerport --name $project $imagename
echo "部署镜像成功。"
生成的流水线脚本如下:
sshpublisher(publishers: [sshpublisherdesc(configname: 'local', transfers: [sshtransfer(cleanremote: false, excludes: '', execcommand: '/usr/bin/deploy.sh $harboraddress $harborrepo $job_name $tag $hostport $containerport', exectimeout: 120000, flatten: false, makeemptydirs: false, nodefaultexcludes: false, patternseparator: '[, ]+', remotedirectory: '', remotedirectorysdf: false, removeprefix: '', sourcefiles: '')], usepromotiontimestamp: false, useworkspaceinpromotion: false, verbose: false)])
在将其粘贴到jenkinsfile文件中对应的步骤
注意:
这里有个小坑,上边的变量既有全局定义的变量,也有jenkins声明的变量,如果用单引号,不会解析里边的变量,所以要用双引用引起来才会解析生效。
前面所有的完整脚本如下
//所有的脚本命令都放在pipeline中
pipeline {
//指定任务在哪个集群节点中执行
agent any
//声明全局变量,方便后面使用
environment {
harboruser = 'admin'
harborpassword = 'harbor12345'
harboraddress = '192.168.88.125:80'
harborrepo = 'repo'
}
stages {
stage('拉取代码') {
steps {
echo '开始拉取git仓库代码……'
checkout scmgit(branches: [[name: '$tag']], extensions: [], userremoteconfigs: [[url: 'http://192.168.88.125:8929/root/devops-test.git']])
echo '开始拉取git仓库代码完毕。'
}
}
stage('构建项目') {
steps {
echo '开始通过maven构建项目……'
sh '/var/jenkins_home/maven/bin/mvn clean package -dskiptests'
echo '通过maven构建项目完毕'
}
}
stage('代码检查') {
steps {
echo 'todo 通过sonarqube做代码质量检测'
}
}
stage('制作镜像') {
steps {
echo '通过docker制作自定义镜像……'
sh '''mv ./target/*.jar ./docker/
docker build -t ${job_name}:${tag} ./docker/'''
echo '通过docker制作自定义镜像完毕'
}
}
stage('推送镜像') {
steps {
echo '将自定义对象推送到harbor仓库……'
sh '''docker login -u ${harboruser} -p ${harborpassword} ${harboraddress}
docker tag ${job_name}:${tag} ${harboraddress}/${harborrepo}/${job_name}:${tag}
docker push ${harboraddress}/${harborrepo}/${job_name}:${tag}
docker image prune -f'''
echo '将自定义对象推送到harbor仓库完成'
}
}
stage('通知目标') {
steps {
echo '通过publish over ssh通知目标服务器……'
sshpublisher(publishers: [sshpublisherdesc(configname: 'local', transfers: [sshtransfer(cleanremote: false, excludes: '', execcommand: "/usr/bin/deploy.sh $harboraddress $harborrepo $job_name $tag $hostport $containerport", exectimeout: 120000, flatten: false, makeemptydirs: false, nodefaultexcludes: false, patternseparator: '[, ]+', remotedirectory: '', remotedirectorysdf: false, removeprefix: '', sourcefiles: '')], usepromotiontimestamp: false, useworkspaceinpromotion: false, verbose: false)])
echo '通过publish over ssh通知目标服务器完毕'
}
}
}
}
3、执行jenkins立即构建
在构建过程中,我们可以清晰的看到流水线每个阶段执行花费的时间和状态
构建完成后,浏览器访问地址,如下,流水线部署成功
发表评论