f 物联网-CI/CD实践(五)Jenkins & Docker 主动化构建部署Node服务 - Powered by qidao123.com技术社区

CI/CD实践(五)Jenkins & Docker 主动化构建部署Node服务 ...

鼠扑  论坛元老 | 2024-8-30 11:25:00 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 2272|帖子 2272|积分 6816

微服务CI/CD实践系列:
 
微服务CI/CD实践(一)环境预备及假造机创建
微服务CI/CD实践(二)服务器先决预备
微服务CI/CD实践(三)gitlab部署及nexus3部署
微服务CI/CD实践(四)Jenkins部署及环境配置
微服务CI/CD实践(五)Jenkins + Dokcer 部署微服务后端项目
微服务CI/CD实践(六)Jenkins + Dokcer 部署微服务前端VUE项目
微服务CI/CD实践(七)Minio服务器部署及应用

  
前端项目是基于NodeJS(Vue)框架开辟,我们通过打包成Docker镜像的方式进行部署,原理是先将项目打包成静态页面,然后再将静态页面直接copy到Nginx镜像中运行。构建部署流程如下:


  • 拉代替码
  • jenkins服务器进行nodejs编译
  • 利用dockerfile构建镜像并打包镜像
  • 上传镜像包
  • 执行sh
一、先决条件

1.1 服务器先决条件

Jenkins 和 server服务器先决条件参考微服务CI/CD实践(二)服务器先决预备 和 微服务CI/CD实践(四)Jenkins部署及环境配置
1.2 项目配置

Dockerfile

利用Jenkins本地编译项目在构建镜像
  1. FROM nginx:latest
  2. # 将生成的静态页面文件复制到nginx的/usr/share/nginx/html/目录
  3. COPY dist/ /usr/share/nginx/html/
  4. # 将mime文件复制到nginx的/etc/nginx/目录 后续配置ng会使用
  5. COPY mime.types /etc/nginx/mime.types
  6. # 容器启动时运行的命令
  7. CMD ["nginx", "-g", "daemon off;"]
复制代码
也可以直接利用docker 镜像编译-构建镜像,此模式jenkins服务器可以不必要node环境
  1. # Install dependencies
  2. FROM node:18.20.4 as builder
  3. WORKDIR /app
  4. # Install pnpm
  5. RUN npm i -g pnpm
  6. # copy file for next stage
  7. COPY . /app
  8. RUN pnpm install && pnpm run build
  9. # copy dist from the first stage for Production
  10. FROM nginx:latest AS runner
  11. COPY --from=builder /app/dist/ /usr/share/nginx/html
  12. COPY --from=builder /app/nginx.conf /etc/nginx/conf.d/default.conf
复制代码
不过此模式在docker-hub制止国内服务后可能无法正常拉取镜像。
Nginx配置文件

根据项目要求编写ng配置
  1. cd /data/container/nginx/etc
  2. vi nginx.conf
  3. # 编写配置并保存
  4. vi mime.types
  5. # 编写配置并保存
复制代码
以下为nginx.conf配置示例
  1. events {
  2.     worker_connections 1024;
  3. }
  4. http {
  5.     # 需要引入mime.types配置或者显示配置静态文件mimetype类型,否则运行后,浏览器会因为文件类型导致无法正常加载静态文件
  6.     include       mime.types;
  7.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  8.                       '$status $body_bytes_sent "$http_referer" '
  9.                       '"$http_user_agent" "$http_x_forwarded_for"';
  10.     access_log  /var/log/nginx/access.log  main;
  11.     sendfile        on;
  12.     tcp_nopush      on;
  13.     tcp_nodelay     on;
  14.     keepalive_timeout  65;
  15.     types_hash_max_size 2048;
  16.     client_max_body_size 100m;
  17.     server {
  18.         listen       80;
  19.         listen  [::]:80;
  20.         server_name  localhost;
  21.         
  22.         # 设置 CORS 相关的响应头
  23.         add_header 'Access-Control-Allow-Origin' '*' always;
  24.         add_header 'Access-Control-Allow-Methods' '*' always;
  25.         add_header 'Access-Control-Max-Age' 1728000 always;
  26.         add_header 'Access-Control-Allow-Headers' '*' always;
  27.         add_header 'Access-Control-Allow-Credentials' 'true' always;
  28.         
  29.         gzip on;
  30.         gzip_buffers 32 4k;
  31.         gzip_comp_level 6;
  32.         gzip_min_length 100;
  33.         gzip_types application/javascript text/css text/xml text/plain application/x-javascript image/jpeg image/gif image/png;
  34.         gzip_disable "MSIE [1-6]\.";
  35.         gzip_vary on;
  36.         charset utf8;
  37.         location / {
  38.             root   /usr/share/nginx/html;
  39.             index  index.html index.htm;
  40.             try_files $uri $uri/ /index.html;
  41.             if (!-e $request_filename) {
  42.                 rewrite ^/(.*) /index.html last;
  43.                 break;
  44.             }
  45.         }
  46.         location  ~ .*\.(jpg|png|js|css|woff2|ttf|woff|eot)$ {
  47.             root   /usr/share/nginx/html;
  48.         }
  49.         #error_page  404              /404.html;
  50.         # redirect server error pages to the static page /50x.html
  51.         #
  52.         error_page   500 502 503 504  /50x.html;
  53.         location = /50x.html {
  54.             root   /usr/share/nginx/html;
  55.         }
  56.         
  57.         # 配置全局代理并统一处理CORS
  58.         location /gateway-api/ {
  59.            proxy_set_header Host $http_host;               
  60.            proxy_set_header X-Real-Ip $remote_addr;
  61.            proxy_set_header REMOTE-HOST $remote_addr;
  62.            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  63.            proxy_pass http://192.168.1.103:10000/;
  64.            # 添加 CORS 相关的响应头
  65.            add_header 'Access-Control-Allow-Origin' '*' always;
  66.            add_header 'Access-Control-Allow-Methods' '*' always;
  67.            add_header 'Access-Control-Max-Age' 1728000 always;
  68.            add_header 'Access-Control-Allow-Headers' '*' always;
  69.            add_header 'Access-Control-Allow-Credentials' 'true' always;
  70.            # 处理 OPTIONS 请求
  71.            if ($request_method = 'OPTIONS') {
  72.                return 204;
  73.            }
  74.        }
  75.     }
  76. }
复制代码
以下为mime.type示例
  1. types {
  2.     text/html                 html htm shtml;
  3.     text/css                  css;
  4.     image/gif                gif;
  5.     image/jpeg               jpeg jpg;
  6.     application/javascript    js;
  7.     application/xml          xml;
  8.     application/json         json;
  9.     application/pdf          pdf;
  10.     application/rss+xml      rss;
  11.     application/atom+xml     atom;
  12.     text/mathml              mml;
  13.     text/plain               txt;
  14.     text/vnd.sun.j2me.app-descriptor jad;
  15.     text/vnd.wap.wml         wml;
  16.     text/x-component         htc;
  17.     image/png               png;
  18.     image/svg+xml           svg;
  19.     image/tiff              tif tiff;
  20.     image/vnd.wap.wbmp      wbmp;
  21.     image/x-icon            ico;
  22.     image/x-jng             jng;
  23.     image/x-ms-bmp          bmp;
  24.     application/zip          zip;
  25.     application/tar          tar;
  26.     application/x-7z-compressed 7z;
  27.     application/x-java-archive jar;
  28.     application/x-rar-compressed rar;
  29.     application/x-web-app-manifest+json webapp;
  30.     application/xhtml+xml   xhtml;
  31.     application/x-msdownload  exe dll;
  32.     audio/midi              mid midi kar;
  33.     audio/mpeg             mp3;
  34.     video/mp4              mp4;
  35.     video/mpeg             mpeg mpg;
  36.     video/webm             webm;
  37.     video/x-msvideo         avi;
  38.     video/x-ms-wmv         wmv;
  39.     video/x-ms-asf         asx asf;
  40.     video/x-flv            flv;
  41.     application/x-shockwave-flash swf;
  42.     application/vnd.ms-excel  xls;
  43.     application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
  44.     application/vnd.openxmlformats-officedocument.spreadsheetml.sheet  xlsx;
  45.     application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
  46.     application/vnd.ms-fontobject eot;
  47.     application/vnd.apple.mpegurl m3u8;
  48.     application/x-font-ttf  ttc ttf;
  49.     application/x-httpd-php-source phps;
  50. }
复制代码
部署脚本

step1 界说入参
可以通过Jenkins任务将参数传入脚本中,我们界说了下面7个参数:
container_name : 容器名称
image_name : 镜像名称
version : 镜像版本
portal_port: 宿主主机端口映射
server_port: 容器内服务端口
portal_ssl_port: 宿主主机端口映射
serve_sslr_port: 容器内服务端口
step2 界说入参对参数进行查抄
将必传参数放在最前面,这里根据自己的实际情况判定,查抄是否传递参数。比如设置container_name、image_name、version 、portal_port、server_port5个参数必须传入,就设置参数的个数不能小于5。
  1. echo "param validate"
  2. if [ $# -lt 5 ]; then  
  3.   echo "you must use like this : /usr/docker-sh/your_script.sh <container_name> <image_name> <version> [portal port] [server port] [portal ssl port] [server ssl port]"  
  4.   exit  
  5. fi
复制代码
step3 入参赋值
如果有参数传入,则赋值参数
  1. # 前五个参数是必传参数,无需判断直接赋值
  2. container_name="$1"
  3. image_name="$2"
  4. version="$3"
  5. portal_port="$4"
  6. server_port="$5"
  7. if [ "$6" != "" ]; then
  8.    portal_ssl_port="$6"
  9. fi
  10. echo "portal_ssl_port=" $portal_ssl_port
  11. if [ "$7" != "" ]; then
  12.    serve_sslr_port="$7"
  13. fi
复制代码
step4 制止并删除容器
  1. echo "执行docker ps"
  2. docker ps
  3. if [[ "$(docker inspect $container_name 2> /dev/null | grep $container_name)" != "" ]];
  4. then
  5.   echo $container_name "容器存在,停止并删除"
  6.   echo "docker stop" $container_name
  7.   docker stop $container_name
  8.   echo "docker rm" $container_name
  9.   docker rm $container_name
  10. else
  11.   echo $container_name "容器不存在"
  12. fi
复制代码
step5 制止并删除镜像
  1. # 删除镜像
  2. echo "执行docker images"
  3. docker images
  4. if [[ "$(docker images -q $image_name 2> /dev/null)" != "" ]];
  5. then
  6.   echo $image_name '镜像存在,删除镜像'
  7.   docker rmi $(docker images -q $image_name 2> /dev/null) --force
  8. else
  9.   echo $image_name '镜像不存在'
  10. fi
复制代码
step6 备份和加载安装包
  1. #bak image
  2. echo "bak image" $image_name
  3. BAK_DIR=/opt/bak/docker/$image_name/`date +%Y%m%d`
  4. mkdir -p "$BAK_DIR"
  5. cp "/opt/tmp/$container_name.tar" "$BAK_DIR"/"$image_name"_`date +%H%M%S`.tar
  6. echo "docker load" $image_name
  7. docker load --input /opt/tmp/$container_name.tar
复制代码
step7 执行运行镜像命令
  1. echo "docker run" $image_name
  2. docker run -d -p $portal_port:$server_port --name=$container_name --network=my-network -e TZ="Asia/Shanghai" --restart=always -v /data/container/nginx/www:/var/www -v /data/container/nginx/logs:/var/log/nginx -v /data/container/nginx/etc:/etc/nginx -v /data/container/nginx/etc/nginx.conf:/etc/nginx/nginx.conf -v /data/container/nginx/etc/mime.types:/etc/nginx/mime.types -v /etc/localtime:/etc/localtime -v /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone $image_name
复制代码
step8 执行删除安装包命令
  1. echo "remove tmp " $image_name
  2. rm -rf /opt/tmp/$container_name.tar
复制代码
以下为完整的安装部署脚本
  1. #!/usr/bin/env bashecho "param validate"
  2. if [ $# -lt 5 ]; then  
  3.   echo "you must use like this : /usr/docker-sh/your_script.sh <container_name> <image_name> <version> [portal port] [server port] [portal ssl port] [server ssl port]"  
  4.   exit  
  5. fi
  6. container_name="$1"image_name="$2"version="$3"portal_port="$4"server_port="$5"if [ "$6" != "" ]; then   portal_ssl_port="$6"fiecho "portal_ssl_port=" $portal_ssl_portif [ "$7" != "" ]; then   serve_sslr_port="$7"fiecho "执行docker ps"
  7. docker ps
  8. if [[ "$(docker inspect $container_name 2> /dev/null | grep $container_name)" != "" ]];
  9. then
  10.   echo $container_name "容器存在,停止并删除"
  11.   echo "docker stop" $container_name
  12.   docker stop $container_name
  13.   echo "docker rm" $container_name
  14.   docker rm $container_name
  15. else
  16.   echo $container_name "容器不存在"
  17. fi
  18. # 删除镜像
  19. echo "执行docker images"
  20. docker images
  21. if [[ "$(docker images -q $image_name 2> /dev/null)" != "" ]];
  22. then
  23.   echo $image_name '镜像存在,删除镜像'
  24.   docker rmi $(docker images -q $image_name 2> /dev/null) --force
  25. else
  26.   echo $image_name '镜像不存在'
  27. fi
  28. #bak image
  29. echo "bak image" $image_name
  30. BAK_DIR=/opt/bak/docker/$image_name/`date +%Y%m%d`
  31. mkdir -p "$BAK_DIR"
  32. cp "/opt/tmp/$container_name.tar" "$BAK_DIR"/"$image_name"_`date +%H%M%S`.tar
  33. echo "docker load" $image_name
  34. docker load --input /opt/tmp/$container_name.tar
  35. echo "docker run" $image_name
  36. docker run -d -p $portal_port:$server_port --name=$container_name --network=my-network -e TZ="Asia/Shanghai" --restart=always -v /data/container/nginx/www:/var/www -v /data/container/nginx/logs:/var/log/nginx -v /data/container/nginx/etc:/etc/nginx -v /data/container/nginx/etc/nginx.conf:/etc/nginx/nginx.conf -v /data/container/nginx/etc/mime.types:/etc/nginx/mime.types -v /etc/localtime:/etc/localtime -v /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone $image_name
  37. echo "remove tmp " $image_name
  38. rm -rf /opt/tmp/$container_name.tar
  39. echo "Docker Portal is starting,please try to access $container_name conslone url"
复制代码
二、Jenkins构建部署

2.1 创建项目

新建一个流水线任务

2.2 配置项目基本信息

创建完成项目,点击项目进入项目页面,点击左侧菜单》配置,进行项目基本配置
step1 项目构建汗青存储策略配置

根据项目实际情况配置存储策略
step2 配置参数化构建过程
Jenkins List Git Branches插件 构建选择指定git分支,点击添加参数选择List Git branchers选项进行Jenkins List Git Branches插件配置

Jenkins List Git Branches插件配置流程如下:


  • 配置name
  • 配置堆栈并选择凭据
  • 选择Parameter Type
  • 配置Branch Filter

2.3 界说 Pipeline script

step1 配置全局变量
  1. environment {   
  2.     REPOSITORY="http://192.168.1.101:8929/hka/hka-admin-wocwin.git"
  3.         projectdir="hka-web-01"
  4.         projectname="hka-admin-wocwin"
  5. }
复制代码
step2 获代替码
检出选择指定git分支的代码
  1. stages {
  2.         stage('获取代码') {
  3.                         steps {
  4.                                 echo "start fetch code from git:${REPOSITORY} ${branch}"
  5.                                 deleteDir()
  6.                                 checkout([
  7.                     $class: 'GitSCM',
  8.                     branches: [[name: '${branch}']],
  9.                     doGenerateSubmoduleConfigurations: false,
  10.                     extensions: [],
  11.                     userRemoteConfigs: [[
  12.                         credentialsId: '2',
  13.                         url: 'http://192.168.1.101:8929/hka/hka-admin-wocwin.git'
  14.                     ]]
  15.                 ])
  16.                         }
  17.                 }
复制代码
step3 编译项目
这里必要表现指定node的环境变量,否则执行编译命令会抛异常
  1. stage('Build NodeJS Vue') {
  2.             steps {
  3.                 echo "build nodejs code"
  4.                 nodejs('node') {
  5.                     sh 'export PATH="/usr/local/nodejs/bin:$PATH"'
  6.                     sh 'node -v'
  7.                     sh 'npm -v'
  8.                     sh 'pnpm -v'
  9.                     sh 'pnpm install'
  10.                     sh 'pnpm run prod'
  11.                 }
  12.                 echo "build nodejs success"
  13.             }
  14.         }
复制代码
step4 删除汗青容器和镜像
如何没有在jenkins服务器运行容器可以忽略Delete Old Docker Container步骤
  1. stage('Delete Old Docker Container') {
  2.             steps {
  3.                 echo "delete docker container"
  4.                 sh '''if [[ "$(docker inspect ${projectname} 2> /dev/null | grep ${projectname})" != "" ]];
  5.                 then
  6.                   echo ${projectname} "容器存在,停止并删除"
  7.                   echo "docker stop" ${projectname}
  8.                   docker stop ${projectname}
  9.                   echo "docker rm" ${projectname}
  10.                   docker rm ${projectname}
  11.                 else
  12.                   echo ${projectname} "容器不存在"
  13.                 fi'''
  14.             }
  15.         }
  16.         
  17.         stage('Delete Old Docker Image') {
  18.             steps {
  19.                 echo "delete docker image"
  20.                 sh '''if [[ "$(docker images -q ${projectname} 2> /dev/null)" != "" ]];
  21.                     then
  22.                       echo ${projectname} \'镜像存在,删除镜像\'
  23.                       docker rmi $(docker images -q ${projectname} 2> /dev/null) --force
  24.                     else
  25.                       echo ${projectname} \'镜像不存在,创建镜像\'
  26.                     fi'''
  27.             }
  28.             
  29.         }
复制代码
step5 构建镜像
  1. stage('Build Docker Image') {
  2.              steps {
  3.                 echo "start docker build ${projectname} code"
  4.                 sh 'docker build -t ${projectname} .'
  5.                 echo "save docker images tar"
  6.                 sh 'docker save -o ${projectname}.tar ${projectname}'
  7.              }
  8.             
  9.         }
  10. stage('Delete New Docker Image') {
  11.             steps {
  12.                 echo "delete docker image"
  13.                 sh '''if [[ "$(docker images -q ${projectname} 2> /dev/null)" != "" ]];
  14.                     then
  15.                       echo ${projectname} \'镜像存在,删除镜像\'
  16.                       docker rmi $(docker images -q ${projectname} 2> /dev/null) --force
  17.                     else
  18.                       echo ${projectname} \'镜像不存在,创建镜像\'
  19.                     fi'''
  20.             }
  21.         }
复制代码
step6 上传镜像包
这里的configName: ‘103’, 就是微服务CI/CD实践(四)Jenkins部署及环境配置### 2.2.4 全局系统配置 SSH Server配置
该流水线步骤会通过ssh将 镜像tar包上传到SSH Server配置的Remote Directory目次下
  1. stage('Upload img tar') {
  2.             steps {
  3.                 sshPublisher(
  4.                     publishers: [
  5.                         sshPublisherDesc(
  6.                             configName: '103',
  7.                             transfers: [
  8.                                 sshTransfer(
  9.                                     cleanRemote: false,
  10.                                     excludes: '',
  11.                                     makeEmptyDirs: false,
  12.                                     noDefaultExcludes: false,
  13.                                     patternSeparator: '[, ]+',
  14.                                     remoteDirectory: '',
  15.                                     remoteDirectorySDF: false,
  16.                                     removePrefix: '',
  17.                                     sourceFiles: '${projectname}.tar'
  18.                                 )
  19.                             ],
  20.                             usePromotionTimestamp: false,
  21.                             useWorkspaceInPromotion: false,
  22.                             verbose: false
  23.                         )
  24.                     ]
  25.                 )
  26.             }
  27.         }
复制代码
step7 执行安装部署脚本
这里的configName: ‘103’, 就是微服务CI/CD实践(四)Jenkins部署及环境配置### 2.2.4 全局系统配置 SSH Server配置
该步骤通过ssh远程执行sh安装部署脚本
  1. stage('Execute Command sh') {
  2.             steps {
  3.                 sshPublisher(
  4.                     publishers: [
  5.                         sshPublisherDesc(
  6.                             configName: '103',
  7.                             transfers: [
  8.                                 sshTransfer(
  9.                                     execCommand: '/usr/docker-sh/publish_hka-admin-wocwin.sh hka-admin-wocwin hka-admin-wocwin latest 80 80',
  10.                                     execTimeout: 300000
  11.                                 )
  12.                             ],
  13.                             usePromotionTimestamp: false,
  14.                             useWorkspaceInPromotion: false,
  15.                             verbose: false
  16.                         )
  17.                     ]
  18.                 )
  19.             }
  20.         }
复制代码
以下为完整流水线界说
  1. pipeline {    agent any        environment {           REPOSITORY="http://192.168.1.101:8929/hka/hka-admin-wocwin.git"                projectdir="hka-web-01"                projectname="hka-admin-wocwin"    }        stages {
  2.         stage('获取代码') {
  3.                         steps {
  4.                                 echo "start fetch code from git:${REPOSITORY} ${branch}"
  5.                                 deleteDir()
  6.                                 checkout([
  7.                     $class: 'GitSCM',
  8.                     branches: [[name: '${branch}']],
  9.                     doGenerateSubmoduleConfigurations: false,
  10.                     extensions: [],
  11.                     userRemoteConfigs: [[
  12.                         credentialsId: '2',
  13.                         url: 'http://192.168.1.101:8929/hka/hka-admin-wocwin.git'
  14.                     ]]
  15.                 ])
  16.                         }
  17.                 }
  18.                         stage('Build NodeJS Vue') {
  19.             steps {
  20.                 echo "build nodejs code"
  21.                 nodejs('node') {
  22.                     sh 'export PATH="/usr/local/nodejs/bin:$PATH"'
  23.                     sh 'node -v'
  24.                     sh 'npm -v'
  25.                     sh 'pnpm -v'
  26.                     sh 'pnpm install'
  27.                     sh 'pnpm run prod'
  28.                 }
  29.                 echo "build nodejs success"
  30.             }
  31.         }
  32.                 stage('Delete Old Docker Container') {
  33.             steps {
  34.                 echo "delete docker container"
  35.                 sh '''if [[ "$(docker inspect ${projectname} 2> /dev/null | grep ${projectname})" != "" ]];
  36.                 then
  37.                   echo ${projectname} "容器存在,停止并删除"
  38.                   echo "docker stop" ${projectname}
  39.                   docker stop ${projectname}
  40.                   echo "docker rm" ${projectname}
  41.                   docker rm ${projectname}
  42.                 else
  43.                   echo ${projectname} "容器不存在"
  44.                 fi'''
  45.             }
  46.         }
  47.         
  48.         stage('Delete Old Docker Image') {
  49.             steps {
  50.                 echo "delete docker image"
  51.                 sh '''if [[ "$(docker images -q ${projectname} 2> /dev/null)" != "" ]];
  52.                     then
  53.                       echo ${projectname} \'镜像存在,删除镜像\'
  54.                       docker rmi $(docker images -q ${projectname} 2> /dev/null) --force
  55.                     else
  56.                       echo ${projectname} \'镜像不存在,创建镜像\'
  57.                     fi'''
  58.             }
  59.             
  60.         }
  61.                 stage('Build Docker Image') {             steps {                echo "start docker build ${projectname} code"                sh 'docker build -t ${projectname} .'                echo "save docker images tar"                sh 'docker save -o ${projectname}.tar ${projectname}'             }                    }                stage('Delete New Docker Image') {            steps {                echo "delete docker image"                sh '''if [[ "$(docker images -q ${projectname} 2> /dev/null)" != "" ]];                     then                       echo ${projectname} \'镜像存在,删除镜像\'                      docker rmi $(docker images -q ${projectname} 2> /dev/null) --force                    else                       echo ${projectname} \'镜像不存在,创建镜像\'                    fi'''            }        }                stage('Upload img tar') {            steps {                sshPublisher(                    publishers: [                        sshPublisherDesc(                            configName: '103',                            transfers: [                                sshTransfer(                                    cleanRemote: false,                                    excludes: '',                                    makeEmptyDirs: false,                                    noDefaultExcludes: false,                                    patternSeparator: '[, ]+',                                    remoteDirectory: '',                                    remoteDirectorySDF: false,                                    removePrefix: '',                                    sourceFiles: 'hka-admin-wocwin.tar'                                )                            ],                            usePromotionTimestamp: false,                            useWorkspaceInPromotion: false,                            verbose: false                        )                    ]                )            }        }        stage('Execute Command sh') {            steps {                sshPublisher(                    publishers: [                        sshPublisherDesc(                            configName: '103',                            transfers: [                                sshTransfer(                                    execCommand: '/usr/docker-sh/publish_hka-admin-wocwin.sh hka-admin-wocwin hka-admin-wocwin latest 80 80 4413 4413',                                    execTimeout: 300000                                )                            ],                            usePromotionTimestamp: false,                            useWorkspaceInPromotion: false,                            verbose: false                        )                    ]                )            }        }                stage('Publish Results') {            steps {               echo "End Publish ${projectname}"              }        }            }}
复制代码
2.4 构建部署项目

回到项目页面,点击参数化构建,选择用于构建的分支点击Build执行构建任务。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表