ansible-yum源:

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

1.安装相关的插件

pipeline、git、git parameter 、extended choice parameter、ansible

2.生成相关插件的语法:

git parameter

extended choice parameter

choice选项参数

git

3.编写流水线脚本

pipeline {
agent {
label "test1"
}
environment {
git_address = "http://192.168.0.11/my-group/ms.git"
git_password = "c601674b-44e0-45a2-aaba-3f476e2c3c51"
ansible_ssh_auth = "242dbf20-4e53-4fa1-b8e7-1479e0a51572"
}
parameters {
gitParameter branch: '', branchFilter: 'origin/(.*)', defaultValue: 'origin/master', description: '请选择你要发布的分支:', name: 'branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH'
extendedChoice description: '请选择你要发布的微服务:', multiSelectDelimiter: ',', name: 'Service', quoteValue: false, saveJSONParameterToFile: false, type: 'PT_CHECKBOX', value: 'portal,gateway,product,stock,order', visibleItemCount: 5
choice choices: ['webservers1', 'webservers2'], description: '''请选择你要发布的服务器组:
[webservers1]
192.168.0.14
[webservers2]
192.168.0.15''', name: 'Servers'
}
stages {
stage('拉去取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: "${params.branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_password}", url: "${git_address}"]]])
}
}
stage('编译构建'){
steps {
sh "export JAVA_HOME=/usr/local/jdk"
sh "/usr/local/maven/bin/mvn clean package -Dmaven.skip.test=true"
}
}
stage('部署并启动'){
steps {
// 将用户选择的微服务的构建文件拷贝到临时目录,以便ansible统一推送
// Service=portal,gateway,product,stock,order
script {
def tmp_dir = "$WORKSPACE/tmp"
def services = "$Service".split(",")
for(name in services) {
sh """
echo $name
pwd
ls
mkdir $tmp_dir |true
cd $name-service
if ls |grep biz &>/dev/null;then
cd $name-service-biz
fi
mv target/*.jar $tmp_dir
ls $tmp_dir
"""
}
}

// 生成主机清单文件和playbook
sh """
cat > /opt/jenkins/.hosts << EOF
[webservers1]
192.168.0.14
[webservers2]
192.168.0.15
EOF
cat > /opt/jenkins/.playbook.yaml <<EOF
- hosts: $Servers
gather_facts: no
vars:
workspace: $WORKSPACE
work_dir: "/data/ms"
service_name: $Service # Service=portal,gateway,product,stock,order
tasks:
- name: 推送构建文件
copy:
src={{ item }}
dest={{ work_dir }}/{{ item.split("/")[-1].split("-")[0] }} #取的是最后一个数组中的第一个字符串
with_fileglob:
- "{{ workspace }}/tmp/*.jar" #/opt/jenkins/workspace/weifuwu为工作目录

- name: 重启服务
systemd: name={{ item }} state=restarted
loop: "{{ service_name.split(',') }}"
EOF
"""
ansiblePlaybook(
playbook: "/opt/jenkins/.playbook.yaml",
inventory: "/opt/jenkins/.hosts",
credentialsId: "${ansible_ssh_auth}"
)
}
}
}
}

最终效果图如下:

根据用户选择的微服务进行发布升级等操作。