轻量级CI/CD发布部署环境搭建及使用_07_jenkins配置pipeline
  YSbeVTL21emr 2023年11月01日 125 0

轻量级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

编写不易,如需转载,请注明出处
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  YqbaJkf98QJO   2024年05月08日   59   0   0 敏捷开发
YSbeVTL21emr