轻量级CI/CD发布部署环境搭建及使用_07_jenkins配置pipeline

尽自己的绵薄之力,为开源技术分享添砖加瓦

1,设置pipeline

2,设置git仓库地址、用户名、密码

3,生成流水线脚本

4,编写pipeline_配置发布服务器、harbor、jar包目录等

5,编写pipeline_配置dockerfile、docker编译命令等

6,编写pipeline_配置连接部署服务器、docker启动、删除容器命令等

============================部署后端pieplie范例脚本============================

相关变量都以xxx代替,请自行替换

  1 pipeline{  2     agent any  3     environment {  4         HARBOR_HOST = "192.168.xxx.xxx:xxx"  5         HARBOR_USER = "xxx"  6         HARBOR_PASSWORD = "xxx"  7         HARBOR_PROJECT = "xxx"  8         PROJECT_NAME = "xxx"  9         DEPLOY_ENV = "test" 10         DEPLOY_PORT = "xxx" 11         PACKAGE_PATH = "./xxx/xxx/xxx.jar" 12         BUILD_VERSION = createVersion() 13         CLEAR_NONE_SSH = "n=`docker images | grep  '' | wc -l`; if [ \$n -gt 0 ]; then docker rmi `docker images | grep  '' | awk '{print \$3}'`; fi" 14         DEPLOY_REMOTE_01 = "192.168.100.xxx" 15         DEPLOY_REMOTE_02 = "192.168.100.xxx" 16     } 17     tools{ 18         // 添加环境,名称为Jenkins全局配置中自己定义的别名 19         jdk 'jdk1.8.0_11' 20         maven 'apache-maven-3.6.2' 21     } 22     stages{ 23         stage("拉取代码"){ 24             //check CODE 25             steps { 26                 checkout([$class: 'GitSCM', branches: [[name: '$Tag']], extensions: [], userRemoteConfigs: [[credentialsId: 'xxx', url: 'http://xxx:xxx/xxx/xxx.git']]]) 27             } 28         } 29         stage("maven构建"){ 30             steps { 31                 sh "mvn clean package -P ${DEPLOY_ENV} -P jdk8 -Dmaven.test.skip=true" 32             } 33         } 34         stage("构建docker镜像,并push到harbor当中"){ 35             //docker push 36             steps { 37                 sh '''cat < Dockerfile 38                 FROM openjdk:8-jre 39                 MAINTAINER hawksoft hawksoft@qq.com 40                 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone 41                 COPY ${PACKAGE_PATH} /app.jar 42                 ENTRYPOINT ["java", "-Xmx512m", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"] 43                 CMD ["--spring.profiles.active=${DEPLOY_ENV}"] 44                 ''' 45                 sh 'cat Dockerfile' 46                 sh 'ls -l' 47                 sh "docker build -t ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION ." 48                 sh "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}" 49                 sh "docker push ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION" 50                 sh "docker rmi ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION" 51             } 52         } 53         stage("拉取docker镜像,并部署发布"){ 54             steps { 55                 deployAndRun("${DEPLOY_REMOTE_01}") 56                 deployAndRun("${DEPLOY_REMOTE_02}") 57             } 58         } 59     } 60 } 61  62 // 定义一个版本号作为当次构建的版本,输出结果 20221209248576_103 63 def createVersion() { 64     return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}" 65 } 66  67 // 声明一个方法,其中 withCredentials 是 Jenkins 凭据管理中添加过的凭据 68 def conRemote(ip){ 69     def remote = [:] 70     remote.name = "test--->>>${PROJECT_NAME}------>>>>>>>${ip}" 71     remote.host = ip 72     remote.port = xxx 73     remote.allowAnyHosts = true 74     withCredentials([usernamePassword(credentialsId: 'xxx', passwordVariable: 'password', usernameVariable: 'userName')]) { 75         remote.user = "${userName}" 76         remote.password = "${password}" 77     } 78     return remote 79 } 80  81 // 部署运行 82 def deployAndRun(ip){ 83     // 登录harbor 84     sshCommand remote: conRemote(ip), command: "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}" 85     // 更新或下载镜像 86     sshCommand remote: conRemote(ip), command: "docker pull ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION" 87     // 打印所有镜像 88     sshCommand remote: conRemote(ip), command: "docker images" 89     try{ 90         // 停止指定名称容器 91         sshCommand remote: conRemote(ip), command: "docker stop ${PROJECT_NAME}" 92         // 删除指定名称容器 93         sshCommand remote: conRemote(ip), command: "docker rm ${PROJECT_NAME}" 94         // 启动容器 95         sshCommand remote: conRemote(ip), command: "docker run -idt --name ${PROJECT_NAME} --restart=always -p ${DEPLOY_PORT}:xxx -v /home/docker/${PROJECT_NAME}/logs:/logs ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION" 96         // 删除未使用到的镜像 97         sshCommand remote: conRemote(ip), command: "docker image prune -a -f" 98         // 清理none镜像 99         sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"100     }101     catch (e){102         // 启动容器103         sshCommand remote: conRemote(ip), command: "docker run -idt --name ${PROJECT_NAME} --restart=always -p ${DEPLOY_PORT}:xxx -v /home/docker/${PROJECT_NAME}/logs:/logs ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"104         // 删除未使用到的镜像105         sshCommand remote: conRemote(ip), command: "docker image prune -a -f"106         // 清理none镜像107         sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"108     }109 }

============================部署前端pieplie范例脚本============================

相关变量都以xxx代替,请自行替换

  1 pipeline{  2     agent any  3     environment {  4         HARBOR_HOST = "192.168.100.xxx:xxx"  5         HARBOR_USER = "xxx"  6         HARBOR_PASSWORD = "xxx"  7         HARBOR_PROJECT = "xxx"  8         PROJECT_NAME = "xxx"  9         DEPLOY_ENV = "test" 10         PACKAGE_PATH = "./dist" 11         BUILD_VERSION = createVersion() 12         CLEAR_NONE_SSH = "n=`docker images | grep  '' | wc -l`; if [ \$n -gt 0 ]; then docker rmi `docker images | grep  '' | awk '{print \$3}'`; fi" 13         DEPLOY_REMOTE_01 = "192.168.xxx.xxx" 14         DEPLOY_PORT = "xxx" 15     } 16     tools{ 17         // 添加环境,名称为Jenkins全局配置中自己定义的别名 18         nodejs 'node-v14.17.6' 19     } 20     stages{ 21         stage("拉取代码"){ 22             //check CODE 23             steps { 24                 checkout([$class: 'GitSCM', branches: [[name: '$Tag']], extensions: [], userRemoteConfigs: [[credentialsId: 'xxx', url: 'http://xxx/xxx/xxx.git']]]) 25             } 26         } 27         stage("build构建"){ 28             steps { 29                 sh ''' 30                     cnpm install 31                     cnpm run build:${DEPLOY_ENV} 32                 ''' 33             } 34         } 35         stage("构建docker镜像,并push到harbor当中"){ 36             //docker push 37             steps { 38                 sh 'pwd' 39                 sh '''cat < Dockerfile 40                     # 设置基础镜像 41                     FROM nginx:latest 42                     # 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面 43                     COPY ${PACKAGE_PATH}  /usr/share/nginx/html/ 44                     EXPOSE 80 45                     CMD ["nginx", "-g", "daemon off;"] 46                 ''' 47                 sh 'cat Dockerfile' 48                 sh 'ls -l' 49                 sh "docker build -t ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION ." 50                 sh "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}" 51                 sh "docker push ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION" 52                 sh "docker rmi ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION" 53             } 54         } 55         stage("拉取docker镜像,并部署发布"){ 56             steps { 57                 deployAndRun("${DEPLOY_REMOTE_01}") 58             } 59         } 60     } 61 } 62  63 // 定义一个版本号作为当次构建的版本,输出结果 20211029532456_17 64 def createVersion() { 65     return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}" 66 } 67  68 // 声明一个方法,其中 withCredentials 是 Jenkins 凭据管理中添加过的凭据 69 def conRemote(ip){ 70     def remote = [:] 71     remote.name = "dev-${PROJECT_NAME}------>>>>>>>${ip}" 72     remote.host = ip 73     remote.port = xxx 74     remote.allowAnyHosts = true 75     withCredentials([usernamePassword(credentialsId: 'xxx', passwordVariable: 'password', usernameVariable: 'userName')]) { 76         remote.user = "${userName}" 77         remote.password = "${password}" 78     } 79     return remote 80 } 81  82 // 部署运行 83 def deployAndRun(ip){ 84     // 登录harbor 85     sshCommand remote: conRemote(ip), command: "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}" 86     // 更新或下载镜像 87     sshCommand remote: conRemote(ip), command: "docker pull ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION" 88     // 打印所有镜像 89     sshCommand remote: conRemote(ip), command: "docker images" 90     try{ 91         // 停止指定名称容器 92         sshCommand remote: conRemote(ip), command: "docker stop ${PROJECT_NAME}" 93         // 删除指定名称容器 94         sshCommand remote: conRemote(ip), command: "docker rm ${PROJECT_NAME}" 95         // 启动容器 96         sshCommand remote: conRemote(ip), command: "docker run -idt --name ${PROJECT_NAME} --restart=always -p ${DEPLOY_PORT}:80 ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION" 97         // 删除未使用到的镜像 98         sshCommand remote: conRemote(ip), command: "docker image prune -a -f" 99         // 清理none镜像100         sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"101     }102     catch (e){103         // 启动容器104         sshCommand remote: conRemote(ip), command: "docker run -idt --name ${PROJECT_NAME} --restart=always -p ${DEPLOY_PORT}:80 ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"105         // 删除未使用到的镜像106         sshCommand remote: conRemote(ip), command: "docker image prune -a -f"107         // 清理none镜像108         sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"109     }110 }

7,执行构建

第一次进入时只有master,需要先选master构建,而后下次构建时就会出现可供选择的branch或tag了

8,通过发布日志、harbor、portainer验证及查看发布情况

至此,轻量级CI/CD发布部署环境搭建及使用_07_jenkins配置pipeline

轻量级CI/CD发布部署环境搭建及使用_01_基本介绍轻量级CI/CD发布部署环境搭建及使用_02_docker安装jenkins轻量级CI/CD发布部署环境搭建及使用_03_docker安装harbor轻量级CI/CD发布部署环境搭建及使用_04_docker安装nexus3轻量级CI/CD发布部署环境搭建及使用_05_jenkins配置jdk、nodejs、maven、python2轻量级CI/CD发布部署环境搭建及使用_06_jenkins配置git、harbor、部署机器等凭证编写不易,如需转载,请注明出处