JenKins 流水线如何实现一次打包,多个服务器部署

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 "启动容器成功"

上述就是一个简单的一次打包多服务器部署的简单实现方式

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值