Pipeline java

def createVersion() {
    //return new Date().format('yyyyMMddHHmmss')+ "-${env.BUILD_ID}"+"-${params.tag}"
    return new Date().format('yyyyMMddHHmmss')+ "-${env.BUILD_ID}"+"-${branch}"
}
pipeline {
    agent { node { label 'gy_dx' } }

    tools {
        maven "M3"
    }
    environment {
        // 定义版本ID
        def _version = createVersion()
        // 定义项目名称
        def itemname ="gy-channel-v2"
        // 定义jar包名称
        //def jar_name = "gy-channel-v2"
        // 定义项目git地址
        def git_url = "https://git.test.git"
        // 定义项目远程主机ip列表
        def remote_host = "192.168.x.x"
        // 定义项目远程主机用户
        def remote_user = "kkt"
        // 定义项目远程主机端口
        def remote_port = "22"
        // 定义项目远程主机的webroot目录 
        def itemname_dir = "/data/application/${itemname}"
        // 定义项目远程主机的版本目录
        def release_dir = "${itemname_dir}/release"
        // 定义项目远程主机的版本ID目录
        def version_dir = "${release_dir}/${_version}"
        // 定义项目远程主机脚本目录
        def itemname_scripts_dir = "${itemname_dir}"
        // 定义项目部署主机脚本目录
        def deploy_scripts_dir = "${WORKSPACE}/ansible_scripts/${itemname}"
    }
    options {
        timestamps()
        disableConcurrentBuilds()
        timeout(time: 30, unit: 'MINUTES')
        buildDiscarder(logRotator(numToKeepStr: '10'))
    }
    parameters {
        //gitParameter name: 'tag', type: 'PT_TAG', defaultValue: 'master', description: '请输入将要构建的代码标签'
        string(name: 'branch', defaultValue: 'dev', description: '请输入将要构建的代码分支')
        choice(name: 'jar_name', choices: ['all','api-activity','api-enterprise','api-gateway','api-guangyuan','api-mall','api-oss','api-uaa'], description: '请选择发布的jar?')
        choice(name: 'mode', choices: ['deploy','rollback'], description: '请选择发布或者回滚?')
        choice(name: 'version_id', choices: ['1','2','3','4','5','0'],description: '回滚时用,默认回滚到上一次构建,如需要回滚到更早构建,请输入对应构建ID[1-5],只支持最近5次构建的回滚,部署请忽略此参数')
        //string(name: 'version_id', defaultValue: '1', description: '回滚时用,默认回滚到上一次构建,如需要回滚到更早构建,请输入对应构建ID[1-5],只支持最近5次构建的回滚,部署请忽略此参数')
    }
    stages {
        stage('拉取代码') {
            when {
                environment name: 'mode',value: 'deploy'
            }
            steps {
                echo "Checkout for ${itemname}"

                //checkout([$class: 'GitSCM',
                //          branches: [[name: "${params.tag}"]],
                //          doGenerateSubmoduleConfigurations: false,
                //          extensions: [],
                //          gitTool: 'Default',
                //          submoduleCfg: [],
                //          userRemoteConfigs: [[url: "${git_url}", credentialsId: "git-tlp"]]
                //        ])
                script {
                    //git branch: "${branch}", credentialsId: 'jenkins-hw2git-cuubd.-com', url: "${git_url}"
                    git branch: "${branch}", credentialsId: 'git-tlp', url: "${git_url}"
                }
            }
        }
        stage('编译项目') {
            when {
                environment name: 'mode',value: 'deploy'
            }
            steps {
                echo "bulid ${itemname}"
                script {
                    sh 'mvn clean package -DskipTests -e -U'
                //  archiveArtifacts artifacts: 'target/**/*.jar', fingerprint: true, followSymlinks: false, onlyIfSuccessful: true
                }
            }
        }
        stage('部署前环境检查') {
            when {
                environment name: 'mode',value: 'deploy'
            }
            steps {
                echo "checkout for ${deploy_scripts_dir}"
                script {
                    sh 'if [ ! -d ${deploy_scripts_dir} ];then mkdir -p ${deploy_scripts_dir};fi'
                }
            }
        }
        stage('定义版本管理脚本') {
            when {
                environment name: 'mode',value: 'deploy'
            }
            steps {
                script {
sh '''
echo "filepath=${release_dir}" > ${deploy_scripts_dir}/keepfile.sh
cat >> ${deploy_scripts_dir}/keepfile.sh << 'EOF'
while :;do
    A=$(ls -l ${filepath} | wc -l)
    B=$(ls -lt ${filepath} | tail -n 1 | awk '{print $9}')
    if [ ${A} -gt $((5+1+1+1)) ];then rm -rf ${filepath}/${B};else break;fi
done
EOF
'''
                }
            }
        }
        stage('定义远程部署主机') {
            when {
                environment name: 'mode',value: 'deploy'
            }
            steps {
                script {
sh '''
echo "[remote]" >  ${deploy_scripts_dir}/hosts.ini
for ip in ${remote_host[*]};do
    echo "${ip} ansible_ssh_host_key_checking=false ansible_ssh_user=${remote_user} ansible_ssh_port=${remote_port}" >> ${deploy_scripts_dir}/hosts.ini
done
'''
                }
            }
        }
        stage('定义远程部署剧本') {
            when {
                environment name: 'mode',value: 'deploy'
            }
            steps {
                script {
sh '''
cat > ${deploy_scripts_dir}/deploy.yaml << EOF
---
- hosts: "remote"
  remote_user: kkt
#  become: true
  tasks:
  - name: "定义生产环境项目目录"
    file: path=${itemname_dir} state=directory
  - name: "定义远程主机的版本ID目录"
    file: path=${version_dir} state=directory
  - name: "将项目拷贝至远程主机版本目录"
    synchronize: src=${WORKSPACE}/target/api-activity/api-activity.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-gateway/api-gateway.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-guangyuan/api-guangyuan.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-mall/api-mall.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-oss/api-oss.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-uaa/api-uaa.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-enterprise/api-enterprise.jar dest=${version_dir}/
  - name: "将项目部署到生产目录"
    file: path=${itemname_dir}/api-activity.jar src=${version_dir}/api-activity.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-gateway.jar src=${version_dir}/api-gateway.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-guangyuan.jar src=${version_dir}/api-guangyuan.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-mall.jar src=${version_dir}/api-mall.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-oss.jar src=${version_dir}/api-oss.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-uaa.jar src=${version_dir}/api-uaa.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-enterprise.jar src=${version_dir}/api-enterprise.jar state=link force=yes
  - name: "服务重启"
    shell: sudo systemctl restart ${jar_name}.service
  - name: "服务重启中~~~~~~~"
    shell: sleep 5
  - name: "版本目录保持五个版本"
    script: ${deploy_scripts_dir}/keepfile.sh
  - name: "生成远程主机版本列表"
    shell: ls -t ${release_dir} | grep -v release.log > ${release_dir}/release.log
  - name: "同步远程版本列表到部署主机"
    synchronize: src=${release_dir}/release.log dest=${deploy_scripts_dir}/release.log mode=pull
  - name : "检查服务是否启动"
    shell: ps -ef | grep ${jar_name} | grep -v grep
    register: get_server_status
  - name: "显示服务状态"
    debug: msg={{ get_server_status.stdout_lines }} 
EOF
cat > ${deploy_scripts_dir}/deploy_all.yaml << EOF
---
- hosts: "remote"
  remote_user: kkt
#  become: true
  tasks:
  - name: "定义生产环境项目目录"
    file: path=${itemname_dir} state=directory
  - name: "定义远程主机的版本ID目录"
    file: path=${version_dir} state=directory
  - name: "将项目拷贝至远程主机版本目录"
    synchronize: src=${WORKSPACE}/target/api-activity/api-activity.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-gateway/api-gateway.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-guangyuan/api-guangyuan.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-mall/api-mall.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-oss/api-oss.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-uaa/api-uaa.jar dest=${version_dir}/
  - name: ""
    synchronize: src=${WORKSPACE}/target/api-enterprise/api-enterprise.jar dest=${version_dir}/
  - name: "将项目部署到生产目录"
    file: path=${itemname_dir}/api-activity.jar src=${version_dir}/api-activity.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-gateway.jar src=${version_dir}/api-gateway.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-guangyuan.jar src=${version_dir}/api-guangyuan.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-mall.jar src=${version_dir}/api-mall.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-oss.jar src=${version_dir}/api-oss.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-uaa.jar src=${version_dir}/api-uaa.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-enterprise.jar src=${version_dir}/api-enterprise.jar state=link force=yes
  - name: "服务重启"
    shell: sudo systemctl restart api-*.service
  - name: "服务重启中~~~~~~~"
    shell: sleep 5
  - name: "版本目录保持五个版本"
    script: ${deploy_scripts_dir}/keepfile.sh
  - name: "生成远程主机版本列表"
    shell: ls -t ${release_dir} | grep -v release.log > ${release_dir}/release.log
  - name: "同步远程版本列表到部署主机"
    synchronize: src=${release_dir}/release.log dest=${deploy_scripts_dir}/release.log mode=pull
  - name : "检查服务是否启动"
    shell: ps -ef | grep "gy-channel-v2" | grep -v grep
    register: get_server_status
  - name: "显示服务状态"
    debug: msg={{ get_server_status.stdout_lines }} 
EOF
'''
                }
            }
        }
        stage('部署') {
            when {
                environment name: 'mode',value: 'deploy'
            }
            steps {
                script {
                    if (params.jar_name == 'all'){
                    sh '''
                    ansible-playbook -i ${deploy_scripts_dir}/hosts.ini ${deploy_scripts_dir}/deploy_all.yaml
                    '''
                    }else{
                    sh '''
                    ansible-playbook -i ${deploy_scripts_dir}/hosts.ini ${deploy_scripts_dir}/deploy.yaml
                    '''
                    }
                }
            }
        }
        stage('回滚') {
            when {
                environment name: 'mode',value: 'rollback'
            }
            steps {
                //checkout([$class: 'GitSCM',
                //          branches: [[name: "${params.tag}"]],
                //          doGenerateSubmoduleConfigurations: false,
                //          extensions: [],
                //          gitTool: 'Default',
                //          submoduleCfg: [],
                //          userRemoteConfigs: [[url: "${git_url}", credentialsId: "git-tlp"]]
                //        ])
                script {
                    if (params.version_id == '1' && params.jar_name == 'all'){                        
sh '''
echo "选择回滚的是${jar_name},回滚的版本是提前${version_id}个版本,将回滚到${version_name}制品,回滚即将进行..."
version_list=($(cat ${deploy_scripts_dir}/release.log))
version_name=${version_list[${version_id}]}
cat > ${deploy_scripts_dir}/rollback_all.yaml << EOF
---
- hosts: "remote"
#  remote_user: kkt
  tasks:
  - name: "将项目回滚到对应期望的构建"
    file: path=${itemname_dir}/api-activity.jar src=${release_dir}/${version_name}/api-activity.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-gateway.jar src=${release_dir}/${version_name}/api-gateway.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-guangyuan.jar src=${release_dir}/${version_name}/api-guangyuan.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-mall.jar src=${release_dir}/${version_name}/api-mall.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-oss.jar src=${release_dir}/${version_name}/api-oss.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-uaa.jar src=${release_dir}/${version_name}/api-uaa.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-enterprise.jar src=${release_dir}/${version_name}/api-enterprise.jar state=link force=yes
  - name: "服务重启"
    shell: sudo systemctl restart api-*.service
  - name: "服务重启中~~~~~~~"
    shell: sleep 5
  - name : "检查服务是否启动"
    shell: ps -ef | grep "gy-channel-v2" | grep -v grep
    register: get_server_status
  - name: "显示服务状态"
    debug: msg={{ get_server_status.stdout_lines }}
EOF
ansible-playbook -i ${deploy_scripts_dir}/hosts.ini ${deploy_scripts_dir}/rollback_all.yaml
echo "项目已回滚完成!"
'''
                    } else if (params.version_id != '1' && params.jar_name == 'all'){
sh '''
echo "选择回滚的是${jar_name},回滚的版本是提前${version_id}个版本,将回滚到${version_name}制品,回滚即将进行..."
version_list=($(cat ${deploy_scripts_dir}/release.log))
version_name=${version_list[${version_id}]}
cat > ${deploy_scripts_dir}/rollback_all2.yaml << EOF
---
- hosts: "remote"
#  remote_user: kkt
  tasks:
  - name: "将项目回滚到对应期望的构建"
    file: path=${itemname_dir}/api-activity.jar src=${release_dir}/${version_name}/api-activity.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-gateway.jar src=${release_dir}/${version_name}/api-gateway.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-guangyuan.jar src=${release_dir}/${version_name}/api-guangyuan.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-mall.jar src=${release_dir}/${version_name}/api-mall.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-oss.jar src=${release_dir}/${version_name}/api-oss.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-uaa.jar src=${release_dir}/${version_name}/api-uaa.jar state=link force=yes
  - name: ""
    file: path=${itemname_dir}/api-enterprise.jar src=${release_dir}/${version_name}/api-enterprise.jar state=link force=yes
  - name: "服务重启"
    shell: sudo systemctl restart api-*.service
  - name: "服务重启中~~~~~~~"
    shell: sleep 5
  - name : "检查服务是否启动"
    shell: ps -ef | grep "gy-channel-v2" | grep -v grep
    register: get_server_status
  - name: "显示服务状态"
    debug: msg={{ get_server_status.stdout_lines }}
EOF
ansible-playbook -i ${deploy_scripts_dir}/hosts.ini ${deploy_scripts_dir}/rollback_all2.yaml
echo "项目已回滚完成!"
'''
                    } else {
sh '''
echo "选择回滚的是${jar_name},回滚的版本是提前${version_id}个版本,将回滚到${version_name}制品,回滚即将进行..."
version_list=($(cat ${deploy_scripts_dir}/release.log))
version_name=${version_list[${version_id}]}
cat > ${deploy_scripts_dir}/rollback.yaml << EOF
---
- hosts: "remote"
#  remote_user: kkt
  tasks:
  - name: "将项目回滚到对应期望的构建"
    file: path=${itemname_dir}/${jar_name}.jar src=${release_dir}/${version_name}/${jar_name}.jar state=link force=yes
  - name: "服务重启"
    shell: sudo systemctl restart ${jar_name}.service
  - name: "服务重启中~~~~~~~"
    shell: sleep 5
  - name : "检查服务是否启动"
    shell: ps -ef | grep ${jar_name} | grep -v grep
    register: get_server_status
  - name: "显示服务状态"
    debug: msg={{ get_server_status.stdout_lines }}
EOF
ansible-playbook -i ${deploy_scripts_dir}/hosts.ini ${deploy_scripts_dir}/rollback.yaml
echo "项目已回滚完成!"
'''
                    }
                }
            }
        }
    }
}