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 "项目已回滚完成!"
'''
}
}
}
}
}
}