jenkins自动化部署代码-pipeline流水线风格
pipeline介绍
Jenkins 2.0的精髓是Pipeline as Code,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。
pipeline概念
Pipeline 是一个用户定义的 CD 流水线模式。Pipeline 代码定义了通常包含构建、测试和发布步骤的完整的构建过程。
Node (ansible中的- hosts:)
node 是一个机器,它是 Jenkins 环境的一部分,并且能够执行 Pipeline。同时,node 代码块也是脚本式 Pipeline 语法的关键特性。
Stage (ansible中的任务tasks)
Stage 块定义了在整个 Pipeline 中执行的概念上不同的任务子集(例如“构建”,“测试”和“部署”阶段),许多插件使用它来可视化或呈现 Jenkins 管道状态/进度。
Step (ansible中的- name)
一项任务。从根本上讲,一个步骤告诉 Jenkins 在特定时间点(或过程中的“步骤”)要做什么。例如,使用 sh step:sh 'make' 可以执行 make 这个 shell 命令。
pipeline脚本模板(jenkins file)
声明式 脚本式
脚本式语法格式:
pipeline{
agent any
stages{
stage("get code"){
steps{
echo "get code from scm"
}
}
stage("package"){
steps{
echo "packge code"
}
}
stage("deploy"){
steps{
echo "deploy packge to node1"
}
}
}
}
创建pipeline
脚本内容
# pipeline脚本内容
pipeline{
agent any
stages{
stage("获取代码"){
steps{
checkout scmGit(branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'git@gitlab.xiaoyuanwiki.com:root/hello-word.git']])
}
}
stage("代码检测"){
steps{
sh '''/usr/lib/apache-maven-3.9.4/bin/mvn clean verify sonar:sonar \\
-Dsonar.projectKey=java \\
-Dsonar.projectName=\'java\' \\
-Dsonar.host.url=http://10.0.0.7:9000 \\
-Dsonar.token=squ_7829c7828b146ca06e463e1883673985bbe29f64'''
}
}
stage("构建"){
input {
message "是否继续构建?"
ok "构建"
}
steps{
sh '/usr/bin/sh -x /var/lib/jenkins/scripts/mvn.sh '
}
}
}
}
# 执行的shell脚本内容
#!/bin/bash
# 版本:
version=$(awk -F '[<> ]' 'NR==6{print $3}' ${WORKSPACE}/pom.xml)
his='/hello_version'
ssh_user=root
ssh_port=22
dev=7
test=8
prod=9
for num in ${!env};do
scp ${WORKSPACE}/target/hello-world-war-${version}.war ${ssh_user}@172.16.1.$num:${his}
ssh -o StrictHostKeyChecking=no -o BatchMode=yes ${ssh_user}@172.16.1.$num "unzip -n ${his}/hello-world-war-${version}.war -d ${his}/hello-world-war-${version}"
ssh ${ssh_user}@172.16.1.$num "rm -f /usr/share/tomcat/webapps/ROOT"
ssh ${ssh_user}@172.16.1.$num "ln -s ${his}/hello-world-war-${version} /usr/share/tomcat/webapps/ROOT"
ssh ${ssh_user}@172.16.1.$num "systemctl restart tomcat"
done
version=$(awk -F '[<> ]' 'NR==6{print $3}' ${WORKSPACE}/pom.xml)
his='/hello_version'
ssh_user=root
ssh_port=22
dev=7
test=8
prod=9
for num in ${!env}; do
# 检查解压后的目录是否存在同名文件
file_exists=$(ssh ${ssh_user}@172.16.1.$num "ls ${his}/hello-world-war-${version}")
if [ -z "$file_exists" ]; then
# 文件不存在,执行解压操作
scp ${WORKSPACE}/target/hello-world-war-${version}.war ${ssh_user}@172.16.1.$num:${his}
ssh ${ssh_user}@172.16.1.$num "unzip -n ${his}/hello-world-war-${version}.war -d ${his}/hello-world-war-${version}"
ssh ${ssh_user}@172.16.1.$num "rm -f /usr/share/tomcat/webapps/ROOT"
ssh ${ssh_user}@172.16.1.$num "ln -s ${his}/hello-world-war-${version} /usr/share/tomcat/webapps/ROOT"
ssh ${ssh_user}@172.16.1.$num "systemctl restart tomcat"
else
# 文件已存在,跳过解压操作
ssh ${ssh_user}@172.16.1.$num "rm -f /usr/share/tomcat/webapps/ROOT"
ssh ${ssh_user}@172.16.1.$num "ln -s ${his}/hello-world-war-${version} /usr/share/tomcat/webapps/ROOT"
ssh ${ssh_user}@172.16.1.$num "systemctl restart tomcat"
fi
done
发邮件工具
安装sendemail
[root@jenkins ~]# mv sendEmail-v1.56 /app/sendemail-1.56
[root@jenkins ~]# ln -s /app/sendemail-1.56 /app/sendemail
[root@jenkins ~]# vim /etc/profile.d/sendemail.sh
[root@jenkins ~]# source /etc/profile
-f 112233@qq.com # 发件人邮箱地址
-t 445566@qq.com # 收件人邮箱地址
-s smtp.qq.com # 发件人邮箱的smtp服务器地址
-u 'zls test email' # 邮件标题
-m 'test mail content' # 邮件内容
-a /tmp/data.txt /tmp/1.jpg #发送附件
-xu 112233 # 发件人邮箱登录用户名
-xp fdnzuslqhshgkslxj # 发件人邮箱登录密码(QQ邮箱的授权码)
-cc 222222@qq.com # 抄送指定用户
-bcc 333333@qq.com # 加密抄送
-o message-content-type=html# 邮件内容格式为html
-o message-file=FILE # 指定某个文件内容作为邮件内容
-o message-charset=utf8# 邮件内容编码为utf8
-o tls=no #关闭tls握手
发邮件脚本
#!/bin/bash
# File Name: __send_test_mail.sh__
# Version: __v1.1__
# Author: __DriverZeng__
# Mail: __133411023@qq.com__
# Blog: __https://blog.driverzeng.com__
# 当前时间
now_time=`date +%F\ %T`
# 主机IP
ip_address=`ifconfig eth0|awk 'NR==2{print $2}'`
# 收件箱
reciver="133411023@qq.com"
# 发送者邮箱
sender=253097001@qq.com
# 邮箱用户名
login_user=253097001
# 邮箱密码
# 使用qq邮箱发邮件,首先需要开启:POP3/SMTP服务,然后使用授权码发送。而不是邮箱密码
login_pass=passwdpasswdpasswd
# smtp服务器地址
smtp_host=smtp.qq.com
# 邮件标题
email_title="${ip_address}_${HOSTNAME}:文件被修改告警"
# 指定文件
email_file="/root/file_status.html"
sendEmail \
-f ${sender} \
-t ${reciver} \
-s ${smtp_host} \
-u ${email_title} \
-xu ${login_user} \
-xp ${login_pass} \
-o message-file=${email_file} \
-o message-charset=utf-8 \
-o message-content-type=html \
-o tls=no
企业微信构建后通知
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=2013c7a4-4e12-4d57-8d89-ebac7fa7225c
钉钉构建后通知
https://oapi.dingtalk.com/robot/send?access_token=ce8724fe3e16e6687f72642055acc324b4064e4fe4c65f84393e0a211443b3fe
邮箱构建后通知(未完成)
# 获取授权码
jenkins自带邮件配置在这里可以先测试一下我们的邮箱配置是否正确,邮件能否发送成功进入系统管理-->系统配置,做如下配置先增加系统管理员邮件地址
找邮件通知的区域,进行配置并测试