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