Jenkins+Pipeline+Ansible 自动化部署(3)
这篇文章是在 Jenkins+Pipeline基础上开发的 Jenkins构建发布Pipeline流水线项目
1.安装ansible
简单网上很多文章,就不介绍了
2.配置ansible
2.1.配置hosts文件
[web] 127.0.0.1 ansible_connection=local 192.168.40.142
[web1]
192.168.40.142 ansible_ssh_user='root' ansible_sudo_pass='密码' ansible_ssh_pass='密码' ansible_su_pass='密码'
web简单配置,这个配置的前提的ssh已经同步到远程服务器了,即 生成秘钥 ssh-keygen
2.2.编写 variables.yml 文件
---
- hosts: "{{host | default('web')}}" ##all
remote_user: root
tasks:
- name: "copy webdir"
synchronize: src={{workspace}}/ dest=/www/item/{{item}} rsync_opts=--delete rsync_opts="--exclude={{exclude}}"
{{host | default('web')}} 指定hosts中的服务器,默认是web
{{workspace}} 是需要同步的目录
{{item}} 远程项目名称(主要是为了和pipeline脚本保存一致)
{{exclude}} 忽略的同步的文件/文件夹
3.通过ansible来多节点发布
3.1 pipeline脚本式代码:
node { //全局变量(外部可以使用,比如shell中使用) env.ENVI = "test" //定义环境 env.WECHAT_TOKEN = "key" env.ERRI = "false" env.WORKSPACE = "/www/jenkins/workspace/${JOB_NAME}" //项目目录,根据jenkins来设置 ${JOB_NAME} 项目名称 //局部变量(在shel中不能使用) def GIT_URL = "git地址" try{ stage('拉取代码') { //拉取代码 echo '拉取代码开始' checkout([ $class: 'GitSCM', branches: [[name: '${TAGNAME}']], extensions: [[$class: 'CleanCheckout', deleteUntrackedNestedRepositories: true]], userRemoteConfigs: [[credentialsId: '4e89640d-3576-4043-a4e2-47d', url: "${GIT_URL}"]] ]) echo "拉取的TAG:${TAGNAME}" echo '拉取代码结束' } stage('编译打包') { // 编译打包 echo '编译打包开始' echo '编译打包结束' } stage('部署上线') { echo '部署上线开始'
// variables.yml 文件 sh 'ansible-playbook -e "host=wb workspace=${WORKSPACE} item=${JOB_NAME} exclude=.git*" /etc/ansible/variables.yml' echo '部署上线结束' } env.RESULT = currentBuild.currentResult }catch(err){ echo "编译失败,错误原因如下:${err} " env.ERRI = "true" env.RESULT = "FAILURE:\n ${err}" }finally{ } //获取构建用时 env.DURATION_STRING = currentBuild.durationString //企微通知 sh 'sh /var/lib/jenkins/pipeline/wechat_send.sh "${WECHAT_TOKEN}" \ "${ENVI}" \ "${JOB_NAME}" \ "${TAGNAME}" \ "${BUILD_DISPLAY_NAME}" \ "${DURATION_STRING}" \ "${RESULT}" \ "${BUILD_USER}"' //判断是否失败,如果是强制显示失败图标 if(env.ERRI == "true"){ script { error "${ERRI}" } } }
3.2 构建/发布
问题:
1.发布到一半,发布系统出现问题,导致项目服务器代码不同步怎么处理?
解决方案:每次发到项目服务器时命名不同的文件夹,比如 项目名称_时间。。。 然后在代码全部上传完之后,再把项目真正的目录 软链(ln -s 源文件 目标文件) 到刚刚上传的目录(项目名称_时间。。。)