接口自动化测试持续集成CI/CD(Jenkins)

一、Linux( Debian 12)操作系统部署docker

1. 更新系统并安装依赖

复制代码
更新 apt 包索引

sudo apt update
sudo apt upgrade -y

# 安装必要的工具

sudo apt install -y ca-certificates curl gnupg lsb-release

2. 添加 Docker 官方 GPG 密钥

复制代码
# 创建 keyrings 目录
sudo mkdir -p /etc/apt/keyrings

# 下载并导入 Docker GPG 密钥
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

ps:错误提示:gpg: no valid OpenPGP data found.(使用手机热点)


3. 添加 Docker APT 源

复制代码
# 设置 Docker 官方仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 更新 apt 包索引
sudo apt update

4. 安装 Docker Engine

复制代码
# 安装 Docker(包括 Docker Engine、CLI、Containerd)
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

5. 启动 Docker 并设置开机自启

复制代码
# 启动 Docker 服务
sudo systemctl enable --now docker

# 检查 Docker 状态
sudo systemctl status docker

预期输出

复制代码
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; preset: enabled)
     Active: active (running) since ...

6. 验证 Docker 是否正常工作

复制代码
# 运行测试容器
sudo docker run hello-worldw

预期输出

复制代码
Hello from Docker!
This message shows that your installation appears to be working correctly.

7. 编辑 daemon.json 文件

如遇到网络问题,修改 /etc/docker/daemon.json 文件

{

"registry-mirrors": [

"https://registry.cn-hangzhou.aliyuncs.com",

"https://dockerproxy.com",

"https://hub-mirror.c.163.com",

"https://docker.m.daocloud.io",

"https://dockerhub.icu",

"https://docker.mirrors.ustc.edu.cn"

]

}

然后重启 Docker:

sudo systemctl daemon-reload

sudo systemctl restart docker

最后再验证下docker是否正常工作

二、测试环境部署jenkins

1、创建网络

docker network create jenkins

2、下载并运行jenkins镜像

docker pull jenkins/jenkins

3、启动自己的jenkins镜像

docker run --name myjenkins --restart=on-failure --detach --network jenkins --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 --volume jenkins-data:/var/jenkins_home --volume jenkins-docker-certs:/certs/client:ro -v /etc/localtime:/etc/localtime -e TZ=Asia/Shanghai --publish 8080:8080 --publish 50000:50000 jenkins/jenkins:latest

4、运行后查看容器执行日志

docker logs -f myjenkins

复制保存密钥,后面会用到

在浏览器访问http://ip:8080 ip要替换成你服务器的ip需要等待大概10分钟的样子,才能进入到初始

安装页面

5、重启下Jenkins然后就可以登录Jenkins了:

docker restart myjenkins

三、Jenkins配置

1、安装Allure插件(其他需要的插件)

1、系统管理》插件管理》下载Allure插件

2、配置git和Allure,

1、系统管理》全局工具配置》

3、邮件发送配置

系统管理》凭据管理》

系统配置

调试下邮件是否能发送

4、邮件模板

5、全局安全配置

全局安全配置》

6、节点配置

系统管理》节点和云管理

7、docker部署slave_api_auto节点以及连接

1、创建Dockerfile文件

FROM jenkins/inbound-agent

USER root

WORKDIR /home/jenkins

RUN apt-get update && \

apt-get install -y python3 python3-pip

2、创建镜像

docker build -t autotest1:latest .

3、创建容器

docker run -itd \

--network jenkins \

--name slave_api_auto \

autotest1 \

-url http://192.168.1.126:8080 \

-secret a9c77fddbdcb27e8e229c3615280d5696c326afc6c933c03d61d4eee3aa030d9 \

-name slave_api_auto

参数 作用 示例/说明
-itd 启动容器并分配伪终端(交互式后台运行) -i 交互式,-t 分配终端,-d 后台运行
--network jenkins 指定容器使用的网络 连接到名为 jenkins 的 Docker 网络
--name slave_api_auto 设置容器名称 Jenkins节点名称
autotest1 使用的镜像名称 基于之前构建的 autotest1:latest 镜像
-url http://192.168.0.188:8080 Jenkins Agent 参数 指定 Jenkins 的 URL
374c182a0091... Jenkins Agent 的 Secret Token 用于连接 Jenkins 的认证密钥,查看节点详情

4、验证是否连接成功

四、自动化任务配置

1、创建流水线任务

2、 流水线环境切换配置(暂时不用)

3、构建触发器(工程触发后,构建流水线)

4、构建触发器(定时触发)

每周一到周五,晚上12点开始执行

5、流水线脚本配置

使用 Personal Access Token (PAT) 连接 Jenkins 和 GitHub 的完整步骤
1. 在 GitHub 生成 Personal Access Token
  1. 登录 GitHub 账户

    • 打开 github.com,点击右上角头像 → Settings
  2. 进入开发者设置

    • 左侧菜单 → Developer settingsPersonal access tokensTokens (classic)
  3. 生成新 Token

    • 点击 Generate new token → 选择 Classic token

    • Note 填写描述(如 Jenkins-CI

    • Expiration :建议选择 No expiration(否则需定期更新)

    • 勾选权限

      • repo(必选):访问代码仓库

      • admin:repo_hook(可选):管理 Webhook

      • workflow(可选):如果涉及 GitHub Actions

    • 点击 Generate token

  4. 复制 Token

    • 重要! Token 只显示一次,立即复制保存到安全位置(如密码管理器)。

    • 如果丢失,必须重新生成。


2. 在 Jenkins 配置 Token 凭据
  1. 进入 Jenkins 管理界面

    • 登录 Jenkins → 点击左侧 Manage JenkinsManage Credentials
  2. 选择凭据存储范围

    • 点击 全局凭据 (Global credentials)Add Credentials
  3. 填写凭据信息

    • Kind :选择 Username with password

    • Scope :保持 Global

    • Username

      • 可填写任意名称(如 github-pat),GitHub 实际只校验 Token
    • Password:粘贴刚才复制的 Personal Access Token

    • ID :建议填写 github-pat(后续任务中方便选择)

    • Description :可选描述(如 GitHub Token for Jenkins

  4. 保存凭据

    • 点击 Create

3. 在 Jenkins 任务中配置 Git 仓库
  1. 创建或修改任务

    • 新建任务:点击 New Item → 输入任务名 → 选择 Freestyle project

    • 或编辑现有任务:点击任务名 → Configure

  2. 配置源码管理

    • Source Code Management 部分 → 选择 Git

    • Repository URL:填写 HTTPS 地址

      复制代码
      https://github.com/wangkaidashuaige/learn_python_data.git
    • Credentials :选择刚刚添加的 github-pat

    • Branches to build :指定分支(如 */main

  3. 测试连接

    • 点击 ApplySave

    • 手动触发一次构建,观察日志是否成功拉取代码。

示例:(其中字段需要手动替换成自己的参数)

复制代码
pipeline {
    // 指定在标签为'slave_api_auto'的节点上运行
    agent {
        label 'slave_api_auto'
    }
    stages {
        // 阶段1:拉取代码
        stage("拉取自动化代码") {
            steps {
                    git(
                        url: 'https://github.com/wangkaidashuaige/shixun_api_project.git',
                        credentialsId: 'github-pat',
                        branch: 'master',
                        poll: false
                    )
                }
        }
        
        // 阶段2:执行测试
        stage("执行自动化测试") {
            steps {
                // 安装Python依赖
                sh 'pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple --break-system-packages'
                // 执行测试脚本,传入环境变量,如果命令行需要选定环境,使用 ${env_name}变量
                sh 'python3 run.py'
                
                /* Windows节点备用命令,环境变量使用%env_name%
                bat 'pip install -r requirements.txt'
                bat 'python run.py'
                */
            }
        }
        // 阶段3:生成报告
        stage("生成测试报告") {
            steps {
                // 使用Allure生成测试报告
                allure includeProperties: false, 
                      jdk: '', 
                      results: [[path: 'temp']]  // Allure报告数据目录
            }
        }
        
        // 阶段4:邮件通知
        stage("邮件结果通知") {
            steps {
                emailext(
                    // 邮件主题
                    subject: '$PROJECT_NAME - 执行 #$BUILD_NUMBER - $BUILD_STATUS!',
                    // 收件人列表,多个用逗号分隔
                    to: '2421110201@qq.com',
                    // 邮件正文(美化后的HTML)
                    body: '''<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>$PROJECT_NAME - 第$BUILD_NUMBER次构建日志</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            line-height: 1.6;
            margin: 20px;
            color: #333;
        }
        .container {
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            border: 1px solid #ddd;
            border-radius: 5px;
            background-color: #f9f9f9;
        }
        h2 {
            color: #2c3e50;
            border-bottom: 1px solid #eee;
            padding-bottom: 10px;
        }
        ul {
            padding-left: 20px;
        }
        a {
            color: #3498db;
            text-decoration: none;
        }
        a:hover {
            text-decoration: underline;
        }
        .success {
            color: #27ae60;
        }
        .failure {
            color: #e74c3c;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>构建信息</h2>
        <ul>
            <li><strong>项目名称:</strong>$PROJECT_NAME</li>
            <li><strong>构建状态:</strong><span class="$BUILD_STATUS.toLowerCase()">$BUILD_STATUS</span></li>
            <li><strong>构建编号:</strong>#$BUILD_NUMBER</li>
            <li><strong>详细测试日志:</strong> <a href="${BUILD_URL}console" target="_blank">查看控制台输出</a></li>
            <li><strong>详细测试报告:</strong> <a href="${JOB_URL}allure" target="_blank">查看Allure报告</a></li>
            <li><strong>触发原因:</strong> ${CAUSE}</li>
            <li><strong>项目地址:</strong> <a href="${BUILD_URL}" target="_blank">访问构建详情</a></li>
        </ul>
    </div>
</body>
</html>'''
                )
            }
        }
    }
}

五、手动执行脚本

六、遇到的问题

1、Jenkins流水线提示无法访问域名

解决方案:python脚本中,域名替换成IP地址(要先确认项目用IP地址可以访问)

2、ERROR: Error fetching remote repo 'origin'

无法连接远程仓库,如果之前的配置做好后有这样的问题一般是DNS配置问题

(1)检查 systemd-resolved 的真实 DNS 配置

运行以下命令查看实际使用的 DNS 服务器:resolvectl status

输出示例:Global DNS Servers: 8.8.8.8 # 应确保这里是可用的公共 DNS

如果输出中没有有效的公共 DNS(如 8.8.8.8),需修改配置。

(2) 修改 systemd-resolved 的 DNS 配置:sudo nano /etc/systemd/resolved.conf

取消注释并添加:

Resolve

DNS=8.8.8.8 223.5.5.5 # Google 和阿里 DNS

FallbackDNS=1.1.1.1

Domains=~

重启服务:sudo systemctl restart systemd-resolved

(3) 验证 DNS 解析
ping github.com
nslookup github.com
相关推荐
极小狐24 分钟前
GitLab 安全漏洞 CVE-2025-7739 解决方案
ci/cd·gitlab·devsecops·devops·极狐gitlab
睡觉z14 小时前
Jenkins持续集成系统
运维·ci/cd·jenkins
ClouGence1 天前
CloudDM 新增支持 GaussDB 与 openGauss:国产数据库管理更高效
数据库·sql·ci/cd
运维开发王义杰3 天前
YAML:锚点深度解析,告别重复,拥抱优雅的配置艺术
ci/cd·gitlab
朱小弟cs67 天前
Orange的运维学习日记--41.Ansible基础入门
linux·运维·学习·ci/cd·自动化·ansible·devops
无名咸鱼7 天前
Git与CI/CD相关知识点总结
git·ci/cd
hl04067 天前
GitLab CI + Docker 自动构建前端项目并部署 — 完整流程文档
ci/cd·docker·gitlab
无名咸鱼8 天前
CICD部署流程详解文档笔记
笔记·ci/cd