1、配置登录gitlab和habar以及远程秘钥
首先进入设置页
在这里插入图片描述
其次配置远程登录秘钥,选择全局,再选择add
在这里插入图片描述
配置登录选择秘钥
在这里插入图片描述
配置连接gitlab,这里配置的密码
在这里插入图片描述
配置登录docker-harbor
在这里插入图片描述
至此登录验证信息如下
在这里插入图片描述
2、pipeline文本内容

// 参数构建
pipeline {
    //agent { label '172.93.6.200' }
    agent any

    parameters {
        gitParameter(name: 'BRANCH_TAG', type: 'PT_BRANCH_TAG', branchFilter: 'origin/(.*)', defaultValue: 'master', selectedValue: 'DEFAULT', sortMode: 'DESCENDING_SMART', description: '请选择需要部署的代码:')
        choice(name: 'mode', choices: ['deploy','rollback'], description: '请选择发布或者回滚?')
        imageTag(name: 'DOCKER_IMAGE',image: 'library/business-client',filter: '.*', defaultTag: '',registry: 'https://harbor.sgpexchange.com', credentialId: 'docker-habor', description: '版本回滚时需要选择镜像仓库\n版本发布可忽略')
        string(name: 'version_id', defaultValue: 'v1.1', description: '版本发布时自定义版本号\n版本回滚时根据镜像修订版本号:')
        string(name: 'iname', defaultValue: 'business-client', description: '服务名称')
        string(name: 'LIMIT', defaultValue: '1024', description: '内存配置')
        string(name: 'JARPORT', defaultValue: '10460', description: '服务端口')
        string(name: 'ENVMENT', defaultValue: 'pre', description: '环境参数')
        string(name: 'host', defaultValue: '172.93.6.200', description: 'host ip地址信息')
    }
    environment {
        dest_path = "/var/jenkins_home/workspace/${JOB_NAME}"
        job_path = "/data/docker-compose/jenkins/jenkins_home/workspace/${JOB_NAME}"
    }

    stages {
        stage('从 gitlab 中拉取代码') {
            when {
                environment name: 'mode',value: 'deploy'
            }
            steps {
                deleteDir()
                checkout([$class: 'GitSCM', 
                    branches: [[name: "${params.BRANCH_TAG}"]],
                    gitTool: 'Default', 
                    userRemoteConfigs: [[url: 'http://gitlab.tqxd.com/defi/aitd-bankcard', credentialsId: 'gitlab-deploy',]]
                ])
            }
        }

        stage('回滚') {
            when {
                environment name: 'mode',value: 'rollback'
            }
            steps {
                sh '''
                    nowImage="library/${iname}:${version_id}"
                    if [ ${nowImage} != ${DOCKER_IMAGE} ];then
                        echo "镜像不存在或选择错误,请重新输入镜像tag:" 
                        aborted
                    else
                        echo "开始还原${version_id}版本:"
                        
                    fi
                '''
            }
        }
        
        stage('构建编译生成程序包') {
            when {
                environment name: 'mode',value: 'deploy'
            }
            steps {
                sh '''
                   MAVEN_HOME=/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven
                   export PATH=$PATH:$MAVEN_HOME/bin
                   mvn clean install -pl  business-client/  -am -Dmaven.test.skip=true
                   
                   jarname=`find business-client/target/ -name "*.jar" |grep -v "sources"|grep -v "exec"`
                   cp ${jarname} ${iname}.jar
                '''
            }
        }
        
        stage('编写启动脚本docker-entrypoint') {
            when {
                environment name: 'mode',value: 'deploy'
            }            
            steps {
                sh '''
                   dest_path=/var/jenkins_home/workspace/${JOB_NAME}
                   cd ${dest_path}
                   cat > docker-entrypoint.sh  <<EOF
#!/bin/bash

java -Dspring.profiles.active=\\${ENVMENT}  -Xms\\${LIMIT}m -Xmx\\${LIMIT}m  -XX:MetaspaceSize=256m  -XX:MaxMetaspaceSize=256m -XX:+UseG1GC \\${JARPORT} -Dfile.encoding=\\${LANG} -Dsun.jnu.encoding=\\${LANG}  -jar \${iname}.jar \\${NACOS} \\${DEBUG}

'''
            }
        }
        stage('编写Dockerfile文件') {
            when {
                environment name: 'mode',value: 'deploy'
            }            
            steps {
                sh '''
                   dest_path=/var/jenkins_home/workspace/${JOB_NAME}
                   cd ${dest_path}
                   cat > Dockerfile <<EOF
FROM harbor.sgpexchange.com/library/alpine-jdk:1.8
#add volume
VOLUME /data
VOLUME /data/deploy/
WORKDIR /data
COPY  \${iname}.jar ./

ARG LIMIT
ARG ENVMENT
ARG JARPORT
ARG LANG
ARG DEBUG
ARG NACOS_ADDR

ENV LIMIT="\\${LIMIT}" \
ENVMENT="\\${ENVMENT}" \
JARPORT="-Dserver.port=\\${JARPORT}" \
LANG="\\${LANG}" \
DEBUG="\\${DEBUG}" \
NACOS="\\${NACOS_ADDR}"
# NACAOS="--nacos.server={{ NACOS_ADDR }}"
# NACAOS="--spring.cloud.nacos.config.server-addr={{ NACOS_ADDR }}"

COPY docker-entrypoint.sh ./
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT ["sh","docker-entrypoint.sh"]
'''
            }
        }    
        stage('打镜像并推送镜像') {
            when {
                environment name: 'mode',value: 'deploy'
            }            
            steps {
                withCredentials([usernamePassword(credentialsId: 'docker-harbor', passwordVariable: 'password', usernameVariable: 'username')]) {
                sh '''    
                   DOCKER_HOME=/var/jenkins_home/tools/docker
                   export PATH=$PATH:$DOCKER_HOME
                   dest_path=/var/jenkins_home/workspace/${JOB_NAME}
                   cd ${dest_path}
                   
                   docker build --build-arg ENVMENT=${ENVMENT} --build-arg LIMIT=${LIMIT} --build-arg JARPORT=${JARPORT} --build-arg LANG=${LANG} -f ${dest_path}/Dockerfile -t harbor.sgpexchange.com/library/${iname}:${version_id} ${dest_path}

                   docker login -u ${username} -p ${password} harbor.sgpexchange.com
                   docker push harbor.sgpexchange.com/library/${iname}:${version_id} 
                   docker rmi  harbor.sgpexchange.com/library/${iname}:${version_id} 
  
                   '''
                }
            }
        }
        
        stage("编写docker-compose.yml文件") {
            steps {
                sh '''
                   dest_path=/var/jenkins_home/workspace/${JOB_NAME}
                   cd ${dest_path}
                   cat > docker-compose.yml <<EOF
version: '3'

services:
  \${iname}:
    container_name: \${iname}
    image: harbor.sgpexchange.com/library/\${iname}:\${version_id}
    restart: always
    hostname: \${iname}
    volumes:
      - ./logs:/data/logs
'''
            }    
        }
        stage("启动容器") {
            steps {
                withEnv(['JENKINS_NODE_COOKIE=dontkillme']) {
                   script{ 
                        def remote = [:]
                        remote.name = "${env.iname}"
                        remote.host = "${params.host}"
                    //    remote.host = '172.93.6.200'
                        remote.allowAnyHosts = true
                        withCredentials([sshUserPrivateKey(credentialsId: '172.93.6.200', keyFileVariable: 'identity', passphraseVariable: '', usernameVariable: 'userName')]) {
                            remote.user = userName
                            remote.identityFile = identity
                            sshCommand remote: remote, command: "mkdir -p /data/deploy/${params.iname}"
                            sshCommand remote: remote, command: "\\cp ${env.job_path}/docker-compose.yml /data/deploy/${params.iname}/"
                            sshCommand remote: remote, command: "cd /data/deploy/${params.iname} && docker-compose down"
                            sshCommand remote: remote, command: "docker images |grep none |awk -F \" \" \'{print \"docker rmi -f \"\$3}\'|sh"
                            sshCommand remote: remote, command: "cd /data/deploy/${params.iname} && docker-compose up -d"
                        }
   
//                       stage('Remote SSH') {
//                           sshScript remote: remote, command: "ls -lrt"
//                           sshScript remote: remote, command: "for i in {1..5}; do echo -n \"Loop \$i \"; date ; sleep 1; done"
//                       }
                    }
                }
            }
        }
    }
}


3、点击构建时参数自动补全,如下
在这里插入图片描述

4、执行结果如下
在这里插入图片描述
5、查看容器已启动

[root@ip-172-93-6-200 business-client]# docker ps
CONTAINER ID   IMAGE                                                 COMMAND                  CREATED              STATUS         PORTS                                                  NAMES
5d7e5f0fb4d8   harbor.sgpexchange.com/library/business-client:v1.0   "sh docker-entrypoin…"   About a minute ago   Up 6 seconds                                                          business-client

在这里插入图片描述
6、当我们需要还原时,只需要注意以下三个参数,其余不用考虑
在这里插入图片描述
7、查看还原视图
在这里插入图片描述
8、三个文件内容
1、docker-compose.yml

version: '3'

services:
  business-client:
    container_name: business-client
    image: harbor.sgpexchange.com/library/business-client:v1.0
    restart: always
    hostname: business-client
    volumes:
      - ./logs:/data/logs

2、docker-entrypoint.sh内容

#!/bin/bash

java -Dspring.profiles.active=${ENVMENT}  -Xms${LIMIT}m -Xmx${LIMIT}m  -XX:MetaspaceSize=256m  -XX:MaxMetaspaceSize=256m -XX:+UseG1GC ${JARPORT} -Dfile.encoding=${LANG} -Dsun.jnu.encoding=${LANG}  -jar business-client.jar ${NACOS} ${DEBUG}

3、Dockerfile文件内容

FROM harbor.sgpexchange.com/library/alpine-jdk:1.8
#add volume
VOLUME /data
VOLUME /data/deploy/
WORKDIR /data
COPY  business-client.jar ./

ARG LIMIT
ARG ENVMENT
ARG JARPORT
ARG LANG
ARG DEBUG
ARG NACOS_ADDR

ENV LIMIT="${LIMIT}" ENVMENT="${ENVMENT}" JARPORT="-Dserver.port=${JARPORT}" LANG="${LANG}" DEBUG="${DEBUG}" NACOS="${NACOS_ADDR}"
# NACAOS="--nacos.server={{ NACOS_ADDR }}"
# NACAOS="--spring.cloud.nacos.config.server-addr={{ NACOS_ADDR }}"

COPY docker-entrypoint.sh ./
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT ["sh","docker-entrypoint.sh"]
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐