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项目生成阶段视图

项目实践

组织测试套

  1. 按业务流程划分 如果业务流程是相对完整的,可以将整个流程作为一个测试套。例如,设计一个测试套来验证用户从注册到下单再到支付的整个流程。
  2. 按功能模块划分 如果系统功能被分成多个模块(如用户管理、订单管理、支付管理等),可以为每个模块设计一个测试套,确保每个模块的功能正常且稳定。
  3. 按用户角色划分 如果系统需要支持不同权限级别的用户,可以为每个用户角色设计一个测试套,确保系统能够正确处理不同用户的操作。
  4. 按测试类型划分 如果需要进行功能测试、回归测试、性能测试或安全测试,可以将测试用例按测试类型进行组织。例如,功能测试用例放在一个测试套中,性能测试用例放在另一个测试套中。

假设系统有以下几个主要功能模块:

  • 用户注册
  • 用户登录
  • 用户信息管理
  • 订单创建
  • 订单支付
  • 订单发货
  • 订单确认

可以将测试套按模块划分如下:

  1. 用户管理模块测试套:包含用户注册、用户登录、用户信息管理等功能的测试用例。
  2. 订单管理模块测试套:包含订单创建、订单支付、订单发货、订单确认等功能的测试用例。
  3. 支付模块测试套:专门针对支付功能的测试用例,例如支付方式选择、支付状态验证等。
  4. 系统安全测试套:包含用户权限验证、系统防护机制等测试用例。

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使用

CN-chy/myproject-unittest

具体代码见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

CN-chy/myproject-pytest

具体代码见github仓库

python发送邮件

Python——自动化发送邮件_python 发送电子邮件-CSDN博客

使用smtplib来发送邮件,以及email库来构建邮件内容

构建邮件内容

邮件内容可以通过email库中的几个类来构建,包括MIMETextMIMEMultipartMIMEText用于纯文本内容,而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)

results matching ""

    No results matching ""