JenKins 流水线如何实现一次打包,多个服务器部署
有的时候一套代码里面可能有很多yml文件,每个yml文件对应一个需要部署的基地,当环境非常多的时候,一套一次打包多次部署的JenKins流水线就显得非常重要,下面将介绍一种简单的实现步骤
1.背景
2.打包
这里需要注意,打包的时候需要使用mvn clean package -P ${profiles} -DskipTests命令profiles 一定要加上这里可以随便写一个比如dev
3.编写DockerFile
FROM openjdk:8
ADD tpm-admin-3.8.2.jar app.jar
EXPOSE 8070
ENTRYPOINT ["java","-jar","app.jar",""--spring.profiles.active=dev""]
4.编写JenkinsFile
//git地址
def project_url = "http://xxxx"
//git凭证
def gitlab_auth = "xxxxxxx"
//构建版本名称
def tag = "latest"
//Harbor私服地址
def harbor_url = "xxxxxxx"
//Harbor项目名称
def harbor_project_name = "xxxx"
//凭证
def harbor_auth = "xxxxx"
//定义的镜`像名称
def imageName = "${project_name}:${tag}"
node {
def mvnHome
stage('拉取代码') { // for display purposes
echo "TPM_INFO:You are checkouting xxx on branch=[${branch}],tag=[${tag}]"
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], extensions: [],
userRemoteConfigs: [[credentialsId: "${gitlab_auth}", url: "${project_url}"]]])
}
stage('构建代码') {
//编译公共模块方法
//sh "mvn -f tpm-common clean install"
// sh "mvn -f gotion-common clean install"
echo "xxxx_INFO:xxxx will be built with profiles=[${profiles}],project_name=[${project_name}]"
//profiles 随便写一个
sh "mvn clean package -P ${profiles} -DskipTests"
//编译、构建本地镜像
//sh "mvn -f ${project_name} clean package dockerfile:build"
sh "docker build -t ${project_name} ."
//给镜像打标签 docker tag tpm:latest 10.2.160.20:7080/gdmo_sp/gotion_data:v1
sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
}
stage('镜像上传') {
withCredentials([usernamePassword(credentialsId: 'b1ab7103-0b0e-4207-9155-cd8bd2a2aefd', passwordVariable: 'password', usernameVariable: 'username')]) {
// 登录 docker login -u hhk -p Hhk4474715 172.25.11.126:7081
sh "docker login -u ${username} -p ${password} ${harbor_url}"
// 上传镜像 docker push 172.25.11.126:7081/gdmo_sp/gotion_data:v1
sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
}
}
stage('删除本地镜像') {
sh "docker rmi -f ${imageName}"
sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"
}
stage('远程发布') {
// transfers: [sshTransfer(cleanRemote: false, excludes: '',
// execCommand: "/opt/jenkins_shell/tpm/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port",
// execTimeout: 120000, flatten: false,
// makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '',
// remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
echo "TPM_INFO:You are deploying TPM to [${server_ip}]"
sshPublisher(publishers: [sshPublisherDesc(
configName: "${server_ip}",
transfers: [sshTransfer(cleanRemote: false, excludes: '',
execCommand: "/opt/jenkins_shell/tpm/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port",
execTimeout: 2000000, flatten: false,
makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '',
remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
}
4.在各个基地编写deploy.sh
#!/bin/bash
#接收外部参数
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5
imageName=$harbor_url/$harbor_project_name/$project_name:$tag
echo "镜像名称: $imageName"
echo "查询容器是否存在,存在则删除"
containerId=`docker ps -a | grep -w ${project_name} | awk '{print $1}'`
echo "容器ID: $containerId"
if [ "$containerId" != "" ] ; then
#停止容器
docker stop $containerId
#删除容器
docker rm $containerId
echo "成功删除容器"
fi
echo "查询镜像是否存在,存在则删除"
imageId=`docker images | grep -w $project_name | awk '{print $3}'`
echo "镜像ID: $imageId"
if [ "$imageId" != "" ] ; then
#删除镜像
docker rmi -f $imageName
echo "成功删除镜像"
fi
echo "登录Harbor"
docker login -u -p $harbor_url
echo "容器ID: $containerId"
echo "下载镜像"
docker pull $imageName
echo "启动容器"
docker run -itd --restart=always --name $project_name -p $port:$port -e TZ=Asia/Shanghai $imageName --spring.profiles.active=dev
#todo 编辑 -v
echo "启动容器成功"
上述就是一个简单的一次打包多服务器部署的简单实现方式