轻量级CI/CD发布部署环境搭建及使用_07_jenkins配置pipeline
轻量级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 '<none>' | wc -l`; if [ \$n -gt 0 ]; then docker rmi `docker images | grep '<none>' | 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 << EOF > 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 '<none>' | wc -l`; if [ \$n -gt 0 ]; then docker rmi `docker images | grep '<none>' | 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 << EOF > 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
编写不易,如需转载,请注明出处