Pipeline H5

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 ="cxwhg"
        // 定义项目git地址
        def git_url = "https://git.h5.git"
        // 定义项目远程主机ip列表
        def remote_host = "192.168.x.x"
        // 定义项目远程主机端口
        def remote_port = "22"
        // 定义项目远程主机的webroot目录 
        def itemname_dir = "/data/html_test/test/${itemname}"
        // 定义项目远程主机的版本目录
        def release_dir = "/data/html_test/test/release"
        // 定义项目远程主机的版本ID目录
        def version_dir = "${release_dir}/${itemname}/${_version}"
        // 定义项目部署主机脚本目录
        def deploy_scripts_dir = "${WORKSPACE}/ansible_scripts/${itemname}"
        // 定义项目远程主机脚本目录
        //def itemname_scripts_dir = "${itemname_dir}/scripts"
    }
    options {
        timestamps()
        disableConcurrentBuilds()
        timeout(time: 30, unit: 'MINUTES')
        buildDiscarder(logRotator(numToKeepStr: '10'))
    }
    parameters {
        //gitParameter name: 'tag', type: 'PT_BRANCH_TAG', defaultValue: 'master', description: '请输入将要构建的代码标签'
        string(name: 'branch', defaultValue: 'master', description: '请输入将要构建的代码分支')        
        choice(name: 'mode', choices: ['deploy','rollback'], description: '请选择发布或者回滚?')
        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: "jenkins-hw2git-cuubd.-com"]]
                //        ])
                script {
                    git branch: "${branch}", credentialsId: 'git-tlp', url: "${git_url}"
                }
            }
		}
        stage('编译项目') {
            when {
                environment name: 'mode',value: 'deploy'
            }
            steps {
            	echo "bulid ${itemname}"
                script {
                    sh 'if [ -d uni-app/ ];then rm -rf uni-app/;fi'
                    sh 'cp -a /data/jenkins/uni-app .'
                    sh 'cp -a node_modules/* uni-app/node_modules/'
                    sh 'cp -a \$(ls | grep -v uni-app) uni-app/src/'
                //    sh 'cd uni-app && npm i -D sass --registry=--registry=https://registry.npmmirror.com && npm i less-loader --registry=--registry=https://registry.npmmirror.com && npm run build:h5'
                //    sh 'cd uni-app && npm i less-loader'
                	sh 'cd uni-app && npm run build:h5'
                //	sh 'npm install @vue/cli-init --registry=https://registry.npm.taobao.org'
                //	sh 'vue init uni-preset-vue init'
                	//sh 'npm install --registry=https://registry.npm.taobao.org'
                	//sh 'npm run build:prod'
                //	archiveArtifacts artifacts: '**/uni-app/dist/build/h5/**', 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}/${itemname}" > ${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_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
  tasks:
  - name: "定义生产环境项目目录"
    file: path=${itemname_dir} state=directory
  - name: "定义远程主机的版本ID目录"
    file: path=${version_dir} state=directory
  - name: "将项目拷贝至远程主机版本目录"
    synchronize: src=${WORKSPACE}/uni-app/dist/build/h5/ dest=${version_dir}/
  - name: "将项目部署到生产目录"
    file: path=${itemname_dir} src=${version_dir} state=link force=yes
  - name: "版本目录保持五个版本"
    script: ${deploy_scripts_dir}/keepfile.sh
  - name: "生成远程主机版本列表"
    shell: ls -t ${release_dir}/${itemname} | grep -v release.log > ${release_dir}/${itemname}/release.log
  - name: "同步远程版本列表到部署主机"
    synchronize: src=${release_dir}/${itemname}/release.log dest=${deploy_scripts_dir}/release.log mode=pull

EOF
'''
                }
            }
        }
        stage('部署') {
			when {
                environment name: 'mode',value: 'deploy'
            }
            steps {
                script {
                	sh '''
                	sudo 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: "jenkins-hw2git-cuubd.-com"]]
                //        ])
                script {
					if (params.version_id == '1'){                        
sh '''
echo "选择回滚的版本是默认,将回滚到上次制品,回滚即将进行..."
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} src=${release_dir}/${itemname}/${version_name} state=link force=yes

EOF
sudo ansible-playbook -i ${deploy_scripts_dir}/hosts.ini ${deploy_scripts_dir}/rollback.yaml
echo "项目已回滚完成!"
'''
					} else {
sh '''
echo "选择回滚的版本是${version_id},将回滚到${version_id}制品,回滚即将进行..."
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} src=${release_dir}/${itemname}/${version_name} state=link force=yes

EOF
sudo ansible-playbook -i ${deploy_scripts_dir}/hosts.ini ${deploy_scripts_dir}/rollback.yaml
echo "项目已回滚完成!"
'''
		    }
                }
	    }
        }
    }
}