Jenkins安装
配置国内yum源
http://mirrors.aliyun.com/repo/Centos-7.repo的内容覆盖/etc/yum.repos.d/CentOS-Base.repo文件
wget http://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS-Base.repo
执行
yum clean all yum makecache
安装JDK11
yum install java-11-openjdk* -y
安装目录为:/usr/lib/jvm
安装、配置、启动jenkins
下载页面:https://jenkins.io/zh/download/ 或 清华镜像站 安装文件:jenkins-2.446-1.1.noarch.rpm
安装
rpm -ivh jenkins-2.446-1.1.noarch.rpm
配置
# jenkins低版本配置文件
vi /etc/sysconfig/jenkins
#高版本配置文件
vi /usr/lib/systemd/system/jenkins.service
修改内容如下:
JENKINS_PORT="8888"
启动Jenkins
# 开放端口
firewall-cmd --zone=public --add-port=8888/tcp --permanent
firewall-cmd --reload
# 启动
systemctl start jenkins
访问
http://192.168.40.101:8888
获取admin账户密码输入
cat /var/lib/jenkins/secrets/initialAdminPassword
初始自定义Jenkins
Jenkins插件需要连接默认官网下载,速度非常慢,跳过插件安装
点击无取消选中的插件
安装
创建第一个管理员用户
实例配置
保存
Jenkins插件
Jenkins本身不提供很多功能,通过使用插件来满足我们的使用。
例如从Gitlab拉取代码,使用Maven构建项目等功能需要依靠插件完成。
修改Jenkins插件下载地址
服务器上
cd /var/lib/jenkins/updates
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
jenkins中 Jenkins->Manage Jenkins-> Plugins -> Advanced settings,点击Advanced,将Update Site的URL替换为
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
重启jenkins
http://192.168.159.101:8888/restart
汉化插件安装
Jenkins->Manage Jenkins-> Plugins -> Available plugins 搜索:Chinese 安装即可
用户权限管理
Role-based Authorization Strategy 插件来管理Jenkins用户权限
开启该插件权限
Jenkins->Manage Jenkins->Security->Security,授权策略切换为"Role-Based Strategy",保存。
测试
创建角色
jenkins->Manage Jenkins->Security->Manage and Assign Roles->Manage Roles
有三种角色
- Global roles(全局角色):管理员等高级用户可以创建基于全局的角色
- Item roles(项目角色):针对某个或者某些项目的角色
- Agent roles(奴隶角色):节点相关的权限
添加三个角色
baseRole:全局角色。需要绑定Overall下面的Read权限,是为了给所有用户绑定最基本的Jenkins访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing the Overall/Read permission role1:该角色为项目角色。绑定所有权限,使用正则表达式绑定test.*,只能操作test开头的项目。 role2:该角色为项目角色。绑定所有权限,使用正则表达式绑定chy.*,只能操作chy开头的项目。
创建用户
jenkins->Manage Jenkins->Security->Users
新建2个用户,一个zs,一个ls
然后进入角色页面进行用户角色分配
jenkins->Manage Jenkins->Security->Manage and Assign Roles->Assign Roles
- zs绑定baseRole角色和role1角色
- ls绑定baseRole角色和role2角色
测试项目权限
使用管理员账户创建2个项目,test-chy,chy-test
zs用户只能看到test-chy项目
ls用户只能看到chy-test项目
凭证管理
存储需要密文保护的数据库密码、Gitlab密码信息、Docker私有仓库密码等,以便Jenkins可以和这些第三方的应用进行交互。
要在Jenkins使用凭证管理功能,需要安装Credentials Binding插件.
可以添加5类凭证
jenkins->Manage Jenkins->Security->Credentials
- Username with password:用户名和密码
- SSH Username with private key: 使用SSH用户和密钥
- Secret file:需要保密的文本文件,使用时Jenkins会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的Secret file就会被删除。
- Secret text:需要保存的一个加密的文本串,如钉钉机器人或Github的api token
- Certificate:通过上传证书文件的方式
常用的凭证类型有:Username with password(用户密码)和SSH Username with private key(SSH密钥)
测试使用Git工具到github拉取项目源码
安装
服务器上安装Git工具
# 安装
yum install git -y
# 安装后查看版本
git --version
jenkins安装Git插件-搜索git安装即可
创建项目
项目名要求跟仓库名一致
创建一个项目,新建Item->Freestyle project>确定,源码管理选择Git然后配置github的项目URL
https://github.com/CN-chy/position.git
创建SSH密钥类型凭证-使用SSH免密登录
使用root用户在/root/.ssh/生成公钥和私钥
ssh-keygen -t rsa
github服务器存放公钥(id_rsa.pub)
jenkins服务器存放私钥(id_rsa)
把生成的公钥放在github中 头像->settings->SSH and GPG keys->New SSH key
把生成的私钥配置在SSH Username with private key凭证中,需要填入
- Username
- Private Key
- Passphrase(如果设置的话)
构建
点击项目中的Build Now
查看构建历史的控制台输出,可看到成功,项目在服务器的/var/lib/jenkins/workspace/position 位置
Jenkins项目构建细节
项目的设置->构建触发器
常用的构建触发器
触发远程构建
填写身份验证令牌 如token=666
那么手动触发http://192.168.40.101:8888/job/position/build?token=6666 就能进行构建
其他工程构建后触发(Build after other projects are build)
项目的设置->构建触发器->Build after other projects are build
填入关注的项目
和触发条件
- 只有构建稳定时触发
- 即使构建不稳定时也会触发
- 即使构建失败时也会触发
- Always trigger, even if the build is aborted
定时构建(Build periodically)
定时字符串从左往右分别为: 分 时 日 月 周
一些定时表达式的例子
每30分钟构建-次:H代表形参 H/30****
每2个小时构建一次: H H/2 ***
每天的8点,12点,22点,一天构建3次:(多个时间点中间用逗号隔开) 0 8,12,22 ***
每天中午12点定时构建一次 H 12***
每天下午18点定时构建一次 H 18***
在每个小时的前半个小时内的每10分钟 H (0-29)/10****
每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38) H H(9-16)/2**1-5
轮询SCM(Poll SCM)
定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建
*****
每分钟Jenkins会定时扫描本地整个项目的代码,增大系统的开销,不建议使用
Git hook自动触发构建
利用Github或gitlab的webhook实现代码push到仓库,立即触发项目自动构建
如果要使用github,需要github能访问jenkins
本地jenkins可以使用本地gitlab实现自动触发
Jenkins的参数化构建
如自定义分支名称进行构建
项目配置中的General
选择This project is parameterized 添加 String Parameter
名称 branch
默认值 master
pipeline {
agent any
stages {
stage('checkout') {
steps {
git branch: '${branch}', credentialsId: 'efde19be-c1ba-4360-8a09-514fe653079e', url: 'https://github.com/CN-chy/position.git'
}
}
}
}
构建即可传入值
配置邮箱服务器发送构建结果
jenkins添加QQ邮箱跟授权码 jenkins email_mob6454cc64e36b的技术博客_51CTO博客
安装Email Extension template插件
jenkins->Manage Jenkins->System Configuration->System
填入如下
Jenkins Location
系统管理员邮件地址
495936663@qq.com
Extended E-mail Notification
SMTP server
smtp.qq.com
SMTP Port
465
点击高级设置认证信息
添加用户名密码认证,分别为邮箱和授权码
勾选使用SSL
Default user e-mail suffix
@qq.com
Default Content Type
HTML(text/html)
Default Recipients 接受邮件的邮箱
495936663@qq.com
邮件通知
SMTP服务器
smtp.qq.com
用户默认邮件后缀
@qq.com
点击高级设置认证信息
勾选使用SMTP认证
用户名 495936663@qq.com
密码 授权码
勾选使用SSL协议
SMTP端口465
配置邮件模版
安装插件
Config File Provider: 提供文件的存储插件。 Pipeline Utility steps: 提供文件的读写的插件。
添加模板文件
jenkins->Manage Jenkins->System Configuration->Managed files->Add a new Config
选择“Extended Email Publisher Groovy Template”类型,然后添加邮件模板。
模版内容如下
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<td>各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>项目名称 : ${PROJECT_NAME}</li>
<li>构建编号 : 第${BUILD_NUMBER}次构建</li>
<li>触发原因: ${CAUSE}</li>
<li>构建状态: ${BUILD_STATUS}</li>
<li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
<li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
</ul>
</td>
</tr>
<tr>
<td><b><font color="#0B610B">历史变更记录:</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat=" %p"}
</td>
</tr>
</table>
</body>
</html>
pipeline脚本添加构建后发送邮件
pipeline {
agent {
node {
label 'test'
}
}
stages {
stage('Hello') {
steps {
bat '''cd C:\\Users\\Administrator\\Desktop
test1.bat'''
}
}
stage('Hello1') {
steps {
bat '''cd C:\\Users\\Administrator\\Desktop
test1.bat'''
}
}
}
post {
always {
echo "发送邮件"
// 设置生成模板文件
configFileProvider([configFile(fileId: '3b499d06-bafb-474c-90ad-878913466d25',targetLocation: 'email.html',variable: 'email_template')]) {
script {
// 读取模板
template = readFile encoding: 'UTF-8', file: "${email_template}"
// 发送邮件
emailext(subject: '任务构建情况',
attachLog: true,
to: '495936663@qq.com',
body: """${template}""")
}
}
}
}
}
jenkins配置windows执行机
jenkins->Manage Jenkins->System Configuration->Nodes->New Node
添加节点,任意命名,选择Permanent Agent Type
配置如下信息
名字
描述
远程工作目录-Windows节点的工作目录选择任意目录即可
标签-可以任意填写后续再配置jenkins任务的时候用到
启动方式
默认通过Java Web启动代理,需要开启代理,不然会报错。/jenkins/tcpSlaveAgentListener/ is invalid: 404 null
用法
尽可能多的使用该节点
匹配标签使用(选择)
保存之后,执行如下(节点 状态中有对应linux和windows的命令)
从服务器获取代理文件
curl.exe -sO http://192.168.40.101:8888/jnlpJars/agent.jar
执行如下,如果jenkins->Manage Jenkins->Security->代理为禁用需要加上-webSocket,否则不需要加
java -jar agent.jar -webSocket -url http://192.168.40.101:8888/ -secret 297f240cff075981dc9fac4b6b4e276b77ef12ba19b48773277144e6ba9ed8b0 -name win1 -workDir "C:\Users\Administrator\Desktop"
使用执行机执行任务
新建项目
General中配置限制项目的运行节点,使用标签表达式去选择节点
配置构建步骤中添加-Execute Windows batch command
填入
cd C:\Users\Administrator\Desktop
test1.bat
test1.bat内容
python test.py
test.py内容
import time
for i in range(100):
time.sleep(1)
print(i)
两文件在同一目录下
进行构建即可,可以查看输出
但是是无界面进行的,
Pipeline项目构建
构建流水线Pipeline项目需要安装Pipeline插件
Pipeline就是一套运行在Jenkins上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
Pipeline脚本
Pipeline脚本是由Groovy语言实现的
Pipeline支持两种语法(可通过流水线语法助手生成片段等,以及输入框右上角一些模版生成)
- Declarative(声明式)
pipeline {
agent {
node {
label 'test'
}
}
stages {
stage('Hello') {
steps {
bat '''cd C:\\Users\\Administrator\\Desktop
test1.bat'''
}
}
stage('Hello1') {
steps {
bat '''cd C:\\Users\\Administrator\\Desktop
test1.bat'''
}
}
}
}
- Scripted Pipeline(脚本式)语法
Pipeline脚本两种创建方法(pipeline项目的配置中的流水线)
- 直接在Jenkins的Web UI界面中输入脚本
- 直接从源代码控制( SCM) 中直接获取jenklnsfile
创建pipeline项目
新建项目->选择pipeline即可
Pipeline项目各步骤可视化
安装Pipeline: Stage ViewVersion插件可以对Pipeline项目生成阶段视图
项目实践
组织测试套
- 按业务流程划分 如果业务流程是相对完整的,可以将整个流程作为一个测试套。例如,设计一个测试套来验证用户从注册到下单再到支付的整个流程。
- 按功能模块划分 如果系统功能被分成多个模块(如用户管理、订单管理、支付管理等),可以为每个模块设计一个测试套,确保每个模块的功能正常且稳定。
- 按用户角色划分 如果系统需要支持不同权限级别的用户,可以为每个用户角色设计一个测试套,确保系统能够正确处理不同用户的操作。
- 按测试类型划分 如果需要进行功能测试、回归测试、性能测试或安全测试,可以将测试用例按测试类型进行组织。例如,功能测试用例放在一个测试套中,性能测试用例放在另一个测试套中。
假设系统有以下几个主要功能模块:
- 用户注册
- 用户登录
- 用户信息管理
- 订单创建
- 订单支付
- 订单发货
- 订单确认
可以将测试套按模块划分如下:
- 用户管理模块测试套:包含用户注册、用户登录、用户信息管理等功能的测试用例。
- 订单管理模块测试套:包含订单创建、订单支付、订单发货、订单确认等功能的测试用例。
- 支付模块测试套:专门针对支付功能的测试用例,例如支付方式选择、支付状态验证等。
- 系统安全测试套:包含用户权限验证、系统防护机制等测试用例。
jenkins + unittest + BeautifulReport
jenkins创建pipeline风格项目
python工程目录结构
├─docs
│ security_report.html
│ user_report.html
│ payment_report.html
│ order_report.html
│
├─tool 发送邮件通知,携带docs目录下的附件
│ mail.py
│
└─unit 相关模块,每个模块一个测试套,使用BeautifulReport生成测试报告
├─order
│ order.py
│
├─payment
│ payment.py
│
├─security
│ security.py
│
├─user
│ user.py
Jenkinsfile 流水线 jenkins使用
具体代码见github仓库
jenkins + pytest + allure
freestyle风格项目配置
jenkins安装allure插件
jenkins创建freestyle风格项目即可
配置git源码仓
配置构建步骤中添加Execute Windows batch command执⾏配置的命令
pytest
exit 0
配置Allure
构建后操作添加Allure Report,Path与--alluredir=report 中的report一致
jenkins->Manage Jenkins->System Configuration->Tools->Allure Commandline 安装->新增 Allure Commandline
去勾选Install automatically
填入allure的安装目录
配置构建后邮箱
构建后操作添加Editable Email Notification
Default Content(报告模版,使用以下html代码即可):
<hr/>(本邮件是程序自动下发的,请勿回复!)<hr/>
项目名称:$PROJECT_NAME<br/><hr/>
构建编号:$BUILD_NUMBER<br/><hr/>
git版本号:${GIT_REVISION}<br/><hr/>
构建状态:$BUILD_STATUS<br/><hr/>
触发原因:${CAUSE}<br/><hr/>
构建日志地址:<a href=" ">${BUILD_URL}console</a ><br/><hr/>
构建地址:<a href="$BUILD_URL">$BUILD_URL</a ><br/><hr/>
报告地址:<a href="${BUILD_URL}allure">${BUILD_URL}allure</a ><br/><hr/>
失败数:${FAILED_TESTS}<br/><hr/>
成功数:${FAILED_TESTS}<br/><hr/>
变更集:${JELLY_SCRIPT,template="html"}<br/><hr/>
Attach Build Log 可选择
点击Advanced Settings
Add Trigger
选择always的情况发送给谁
注意:用例只要失败的,项目的状态最后会变成unstable
python工程目录结构
└─unit
├─order
│ │ order.py
├─payment
│ │ payment.py
├─security
│ │ security.py
└─user
│ user.py
pytest.ini
具体代码见github仓库
python发送邮件
Python——自动化发送邮件_python 发送电子邮件-CSDN博客
使用smtplib来发送邮件,以及email库来构建邮件内容
构建邮件内容
邮件内容可以通过email库中的几个类来构建,包括MIMEText和MIMEMultipart。MIMEText用于纯文本内容,而MIMEMultipart则可以包含多种类型的数据,如文本、HTML和附件
# 创建一个MIMEMultipart对象
msg = MIMEMultipart()
msg['From'] = '495936663@qq.com'
msg['To'] = '495936663@qq.com'
msg['Subject'] = '邮件主题'
# 添加文本正文
text = '这是邮件的文本部分。'
text_part = MIMEText(text, 'plain')
msg.attach(text_part)
# 添加HTML正文
html = '<h1>这是邮件的HTML部分</h1>'
html_part = MIMEText(html, 'html')
msg.attach(html_part)
# 添加附件
attachment = MIMEBase('application', 'octet-stream')
attachment.set_payload(open('filename.txt', 'rb').read())
encoders.encode_base64(attachment)
attachment.add_header('Content-Disposition', 'attachment', filename='1.txt')
msg.attach(attachment)
发送邮件
需要SMTP服务器的地址和端口,以及邮箱账号和密码
#连接到SMTP服务器
import smtplib
server = smtplib.SMTP_SSL('smtp.qq.com', 465) # 使用SSL连接
server.login('495936663@qq.com', 'qudzveekbkcbbigb')
#发送邮件
server.send_message(msg)
#关闭与SMTP服务器的连接
server.quit()
完整示例
import os
from email import encoders
from email.mime.base import MIMEBase
# 导入所需的库
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_email(sender_email, sender_password, recipient_email, subject, attachments_dir):
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = recipient_email
msg['Subject'] = subject
# 添加HTML正文
html = '<h1>见附件</h1>'
html_part = MIMEText(html, 'html')
msg.attach(html_part)
# 添加目录下的所有附件
for root, dirs, files in os.walk(attachments_dir):
for file in files:
attachment = MIMEBase('application', 'octet-stream')
attachment.set_payload(open(os.path.join(root, file), 'rb').read())
encoders.encode_base64(attachment)
attachment.add_header('Content-Disposition', 'attachment', filename=file)
msg.attach(attachment)
try:
# 使用 SSL 连接
server = smtplib.SMTP_SSL('smtp.qq.com', 465)
server.login(sender_email, sender_password)
server.send_message(msg)
print("邮件发送成功!")
except Exception as e:
print(f"发送邮件时出错: {e}")
finally:
server.quit()
attachments_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + '/docs'
send_email('495936663@qq.com', 'qudzveekbkcbbigb', '495936663@qq.com', '自动化用例运行情况', attachments_dir)