jenkinsfile并行发布服务到测试坏境和生产环境

通过jenkinsfile并行发布服务到测试和生产环境,实例如下: 

env.PROJ_DIR="${JENKINS_HOME}/workspace"        //jenkins  workspace
env.PROJ_URL="git@github.****.com:devops/WebManageSystem.git"  // 项目的SSH地址
//env.PROJ_NAME="WebManageSystem" // 项目名
env.LANGUAGE="golang" //基础镜像
env.TAGS="1.12.4-alpine3.9"     //基础镜像TAG
env.HARBOR="dimage.***.com/test"  //镜像仓库的URL
env.INAME="webmanagesystem"  //制作的镜像名(自定义时不要使用大写字母)
//    String tag='latest' //制作的镜像TAG
node {


        stage('Get Code') {
            dir(path: "${PROJ_DIR}/$JOB_NAME/") {    //指定git拉取代码目录
                git "${PROJ_URL}"
                tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()  // 获取 git  commitID
                }
        }

        withEnv(["IMAGE_TAG=${tag}"]) {
            stage('Docker Build') {           //构建镜像,ssh到远程主机执行命令,该命令要用"",Dodckerfile顶格
            sh '''
                  ssh [email protected].**.** "rm -rf /opt/$JOB_NAME"    //harbor服务器
                  scp -r ${PROJ_DIR}/$JOB_NAME [email protected].**.**:/opt/;
                  ssh [email protected].**.** "cd /opt/$JOB_NAME;
                  cat << EOF > Dockerfile
FROM ${LANGUAGE}:${TAGS} as builder
WORKDIR /go/src/$JOB_NAME
COPY . .
RUN go build -o $JOB_NAME

FROM alpine:latest
WORKDIR /root/
COPY --from=builder /go/src/$JOB_NAME/$JOB_NAME .
CMD [\\"./$JOB_NAME\\"]
EOF
                  docker build -t ${HARBOR}/${INAME}:$IMAGE_TAG ."
              '''
           }
       stage('Image Push') {              //上传镜像到远程镜像仓库
                     sh '''
                     ssh [email protected].**.** "docker push ${HARBOR}/${INAME}:$IMAGE_TAG;
                     rm -rf /opt/$JOB_NAME;
                     "
                     '''
       }
       stage('并行执行的 Stage') {
         parallel 'test':{
             node{
                 stage('Remove old container') {              //删除原有容器
                     try{
                         sh '''
                         ssh [email protected] "docker rm -f $JOB_NAME"   //测试环境服务器
                         '''
                     }catch (error){
                     }finally{
                         echo "remove old container success"
                     }
                  }

                 stage('Image Pull') {              //从远程镜像仓库拉取镜像
                     sh '''
                     ssh [email protected] "docker pull ${HARBOR}/${INAME}:$IMAGE_TAG"
                     '''
                  }

                 stage('Docker Run') {              //在服务器上起docker镜像
                     sh '''
                     ssh [email protected] "docker run -i -d -p 9998:9998 -v /root/webmanagesystem/app.conf:/root/conf/app.conf --name=$JOB_NAME ${HARBOR}/${INAME}:${IMAGE_TAG}"
                     '''
                  }
             }
             },
             'produce':{
             node{
                 stage('Remove old container') {              //删除原有容器
                     try{
                         sh '''
                         ssh [email protected] "docker rm -f $JOB_NAME"  //生产环境服务器
                         '''
                      }catch (error){
                      }finally{
                          echo "remove old container success"
                      }
                  }

                 stage('Image Pull') {              //从远程镜像仓库拉取镜像
                     sh '''
                     ssh [email protected] "docker pull ${HARBOR}/${INAME}:$IMAGE_TAG"
                     '''
                 }

                 stage('Docker Run') {              //在服务器上起docker镜像
                     timeout(time: 7, unit: 'DAYS') {
                        input message: '是否发布到生产online1?',ok: 'Yes'
                     }
                     sh '''
                     ssh [email protected] "docker run -i -d -p 9998:9998 -v /root/webmanagesystem/app.conf:/root/conf/app.conf --name=$JOB_NAME ${HARBOR}/${INAME}:${IMAGE_TAG}"
                     '''
                 }
             }
          }
        }  
      }
}

执行过程如下图

jenkinsfile并行发布服务到测试坏境和生产环境_第1张图片

https://www.cnblogs.com/sparkdev/p/7617765.html

你可能感兴趣的:(Jenkins,jenkins)