ToB企服应用市场:ToB评测及商务社交产业平台

标题: 轻量级CI/CD发布部署环境搭建及使用_07_jenkins配置pipeline [打印本页]

作者: 徐锦洪    时间: 2023-3-9 08:28
标题: 轻量级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.   1 pipeline{
  2.   2     agent any
  3.   3     environment {
  4.   4         HARBOR_HOST = "192.168.xxx.xxx:xxx"
  5.   5         HARBOR_USER = "xxx"
  6.   6         HARBOR_PASSWORD = "xxx"
  7.   7         HARBOR_PROJECT = "xxx"
  8.   8         PROJECT_NAME = "xxx"
  9.   9         DEPLOY_ENV = "test"
  10. 10         DEPLOY_PORT = "xxx"
  11. 11         PACKAGE_PATH = "./xxx/xxx/xxx.jar"
  12. 12         BUILD_VERSION = createVersion()
  13. 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. 14         DEPLOY_REMOTE_01 = "192.168.100.xxx"
  15. 15         DEPLOY_REMOTE_02 = "192.168.100.xxx"
  16. 16     }
  17. 17     tools{
  18. 18         // 添加环境,名称为Jenkins全局配置中自己定义的别名
  19. 19         jdk 'jdk1.8.0_11'
  20. 20         maven 'apache-maven-3.6.2'
  21. 21     }
  22. 22     stages{
  23. 23         stage("拉取代码"){
  24. 24             //check CODE
  25. 25             steps {
  26. 26                 checkout([$class: 'GitSCM', branches: [[name: '$Tag']], extensions: [], userRemoteConfigs: [[credentialsId: 'xxx', url: 'http://xxx:xxx/xxx/xxx.git']]])
  27. 27             }
  28. 28         }
  29. 29         stage("maven构建"){
  30. 30             steps {
  31. 31                 sh "mvn clean package -P ${DEPLOY_ENV} -P jdk8 -Dmaven.test.skip=true"
  32. 32             }
  33. 33         }
  34. 34         stage("构建docker镜像,并push到harbor当中"){
  35. 35             //docker push
  36. 36             steps {
  37. 37                 sh '''cat << EOF > Dockerfile
  38. 38                 FROM openjdk:8-jre
  39. 39                 MAINTAINER hawksoft hawksoft@qq.com
  40. 40                 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
  41. 41                 COPY ${PACKAGE_PATH} /app.jar
  42. 42                 ENTRYPOINT ["java", "-Xmx512m", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
  43. 43                 CMD ["--spring.profiles.active=${DEPLOY_ENV}"]
  44. 44                 '''
  45. 45                 sh 'cat Dockerfile'
  46. 46                 sh 'ls -l'
  47. 47                 sh "docker build -t ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION ."
  48. 48                 sh "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}"
  49. 49                 sh "docker push ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
  50. 50                 sh "docker rmi ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
  51. 51             }
  52. 52         }
  53. 53         stage("拉取docker镜像,并部署发布"){
  54. 54             steps {
  55. 55                 deployAndRun("${DEPLOY_REMOTE_01}")
  56. 56                 deployAndRun("${DEPLOY_REMOTE_02}")
  57. 57             }
  58. 58         }
  59. 59     }
  60. 60 }
  61. 61
  62. 62 // 定义一个版本号作为当次构建的版本,输出结果 20221209248576_103
  63. 63 def createVersion() {
  64. 64     return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
  65. 65 }
  66. 66
  67. 67 // 声明一个方法,其中 withCredentials 是 Jenkins 凭据管理中添加过的凭据
  68. 68 def conRemote(ip){
  69. 69     def remote = [:]
  70. 70     remote.name = "test--->>>${PROJECT_NAME}------>>>>>>>${ip}"
  71. 71     remote.host = ip
  72. 72     remote.port = xxx
  73. 73     remote.allowAnyHosts = true
  74. 74     withCredentials([usernamePassword(credentialsId: 'xxx', passwordVariable: 'password', usernameVariable: 'userName')]) {
  75. 75         remote.user = "${userName}"
  76. 76         remote.password = "${password}"
  77. 77     }
  78. 78     return remote
  79. 79 }
  80. 80
  81. 81 // 部署运行
  82. 82 def deployAndRun(ip){
  83. 83     // 登录harbor
  84. 84     sshCommand remote: conRemote(ip), command: "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}"
  85. 85     // 更新或下载镜像
  86. 86     sshCommand remote: conRemote(ip), command: "docker pull ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
  87. 87     // 打印所有镜像
  88. 88     sshCommand remote: conRemote(ip), command: "docker images"
  89. 89     try{
  90. 90         // 停止指定名称容器
  91. 91         sshCommand remote: conRemote(ip), command: "docker stop ${PROJECT_NAME}"
  92. 92         // 删除指定名称容器
  93. 93         sshCommand remote: conRemote(ip), command: "docker rm ${PROJECT_NAME}"
  94. 94         // 启动容器
  95. 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. 96         // 删除未使用到的镜像
  97. 97         sshCommand remote: conRemote(ip), command: "docker image prune -a -f"
  98. 98         // 清理none镜像
  99. 99         sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"
  100. 100     }
  101. 101     catch (e){
  102. 102         // 启动容器
  103. 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. 104         // 删除未使用到的镜像
  105. 105         sshCommand remote: conRemote(ip), command: "docker image prune -a -f"
  106. 106         // 清理none镜像
  107. 107         sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"
  108. 108     }
  109. 109 }
复制代码
============================部署前端pieplie范例脚本============================
相关变量都以xxx代替,请自行替换
  1.   1 pipeline{
  2.   2     agent any
  3.   3     environment {
  4.   4         HARBOR_HOST = "192.168.100.xxx:xxx"
  5.   5         HARBOR_USER = "xxx"
  6.   6         HARBOR_PASSWORD = "xxx"
  7.   7         HARBOR_PROJECT = "xxx"
  8.   8         PROJECT_NAME = "xxx"
  9.   9         DEPLOY_ENV = "test"
  10. 10         PACKAGE_PATH = "./dist"
  11. 11         BUILD_VERSION = createVersion()
  12. 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. 13         DEPLOY_REMOTE_01 = "192.168.xxx.xxx"
  14. 14         DEPLOY_PORT = "xxx"
  15. 15     }
  16. 16     tools{
  17. 17         // 添加环境,名称为Jenkins全局配置中自己定义的别名
  18. 18         nodejs 'node-v14.17.6'
  19. 19     }
  20. 20     stages{
  21. 21         stage("拉取代码"){
  22. 22             //check CODE
  23. 23             steps {
  24. 24                 checkout([$class: 'GitSCM', branches: [[name: '$Tag']], extensions: [], userRemoteConfigs: [[credentialsId: 'xxx', url: 'http://xxx/xxx/xxx.git']]])
  25. 25             }
  26. 26         }
  27. 27         stage("build构建"){
  28. 28             steps {
  29. 29                 sh '''
  30. 30                     cnpm install
  31. 31                     cnpm run build:${DEPLOY_ENV}
  32. 32                 '''
  33. 33             }
  34. 34         }
  35. 35         stage("构建docker镜像,并push到harbor当中"){
  36. 36             //docker push
  37. 37             steps {
  38. 38                 sh 'pwd'
  39. 39                 sh '''cat << EOF > Dockerfile
  40. 40                     # 设置基础镜像
  41. 41                     FROM nginx:latest
  42. 42                     # 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
  43. 43                     COPY ${PACKAGE_PATH}  /usr/share/nginx/html/
  44. 44                     EXPOSE 80
  45. 45                     CMD ["nginx", "-g", "daemon off;"]
  46. 46                 '''
  47. 47                 sh 'cat Dockerfile'
  48. 48                 sh 'ls -l'
  49. 49                 sh "docker build -t ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION ."
  50. 50                 sh "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}"
  51. 51                 sh "docker push ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
  52. 52                 sh "docker rmi ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
  53. 53             }
  54. 54         }
  55. 55         stage("拉取docker镜像,并部署发布"){
  56. 56             steps {
  57. 57                 deployAndRun("${DEPLOY_REMOTE_01}")
  58. 58             }
  59. 59         }
  60. 60     }
  61. 61 }
  62. 62
  63. 63 // 定义一个版本号作为当次构建的版本,输出结果 20211029532456_17
  64. 64 def createVersion() {
  65. 65     return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
  66. 66 }
  67. 67
  68. 68 // 声明一个方法,其中 withCredentials 是 Jenkins 凭据管理中添加过的凭据
  69. 69 def conRemote(ip){
  70. 70     def remote = [:]
  71. 71     remote.name = "dev-${PROJECT_NAME}------>>>>>>>${ip}"
  72. 72     remote.host = ip
  73. 73     remote.port = xxx
  74. 74     remote.allowAnyHosts = true
  75. 75     withCredentials([usernamePassword(credentialsId: 'xxx', passwordVariable: 'password', usernameVariable: 'userName')]) {
  76. 76         remote.user = "${userName}"
  77. 77         remote.password = "${password}"
  78. 78     }
  79. 79     return remote
  80. 80 }
  81. 81
  82. 82 // 部署运行
  83. 83 def deployAndRun(ip){
  84. 84     // 登录harbor
  85. 85     sshCommand remote: conRemote(ip), command: "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}"
  86. 86     // 更新或下载镜像
  87. 87     sshCommand remote: conRemote(ip), command: "docker pull ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
  88. 88     // 打印所有镜像
  89. 89     sshCommand remote: conRemote(ip), command: "docker images"
  90. 90     try{
  91. 91         // 停止指定名称容器
  92. 92         sshCommand remote: conRemote(ip), command: "docker stop ${PROJECT_NAME}"
  93. 93         // 删除指定名称容器
  94. 94         sshCommand remote: conRemote(ip), command: "docker rm ${PROJECT_NAME}"
  95. 95         // 启动容器
  96. 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. 97         // 删除未使用到的镜像
  98. 98         sshCommand remote: conRemote(ip), command: "docker image prune -a -f"
  99. 99         // 清理none镜像
  100. 100         sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"
  101. 101     }
  102. 102     catch (e){
  103. 103         // 启动容器
  104. 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. 105         // 删除未使用到的镜像
  106. 106         sshCommand remote: conRemote(ip), command: "docker image prune -a -f"
  107. 107         // 清理none镜像
  108. 108         sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"
  109. 109     }
  110. 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、部署机器等凭证编写不易,如需转载,请注明出处
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4