将 Jenkins 与流行工具集成:实用概述
了解如何通过将 Jenkins 与关键开发工具集成来增强您的 CI/CD 工作流程。本实用概述涵盖了与 Git 完美集成以进行版本控制、与 Docker 集成以实现容器化,以及与各种测试框架的集成。探索可操作的示例和最佳实践,以自动化您的构建、测试和部署流程,从而实现更快的发布和更高的软件质量。
集成 Jenkins 与常用工具:实用概述
当 Jenkins 能够与你团队已有的工具(如 Git 用于代码管理、Docker 用于镜像构建、测试框架用于反馈、制品仓库用于发布)进行通信时,它才真正变得有用。目标不是安装所有能找到的插件,而是构建一个清晰的流水线:检出代码、构建、测试并发布结果。
本实用概述展示了 Jenkins 集成通常如何组合在一起,以及团队常犯的错误。
从源代码控制开始
大多数 Jenkins 流水线从 Git 检出开始。在流水线作业中,Jenkins 可以使用作业中配置的仓库并运行 checkout scm,也可以在 Jenkinsfile 中定义仓库。
对于多分支流水线,以下配置通常就足够了:
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
}
}
多分支作业可以从 GitHub、GitLab、Bitbucket 或其他 Git 服务器发现分支和拉取请求,具体取决于你安装和配置的插件。
对于简单的流水线作业,你可能会看到显式的检出:
git url: 'https://github.com/example/app.git', branch: 'main'
对于私有仓库,请使用 Jenkins 凭据。不要将令牌放在仓库 URL 中。
优先使用 Webhook 而非轮询
Jenkins 可以轮询 Git 以获取更改,但 Webhook 更简洁。当有人推送代码或打开拉取请求时,你的 Git 提供商会向 Jenkins 发送请求,Jenkins 启动相应的作业。
典型的设置如下:
- 安装适用于你的 Git 提供商的 Jenkins 插件,例如 GitHub Branch Source 或 GitLab Branch Source。
- 创建一个多分支流水线作业。
- 添加仓库或组织源。
- 在 Jenkins 凭据中存储凭据。
- 在你的 Git 提供商设置中添加 Webhook URL。
在受限网络中轮询仍然有效,但它会增加延迟和不必要的负载。
构建并推送 Docker 镜像
只要运行构建的代理具有 Docker 访问权限,Jenkins 就可以构建 Docker 镜像。这可能是安装了 Docker 的虚拟机、使用 Kaniko 或 BuildKit 等构建工具的 Kubernetes 代理,或者受控的 Docker 套接字设置。
以下是一个简单的 Docker 构建和推送流程:
pipeline {
agent any
environment {
IMAGE = 'registry.example.com/team/app'
}
stages {
stage('Build Image') {
steps {
sh 'docker build -t $IMAGE:$BUILD_NUMBER .'
}
}
stage('Push Image') {
steps {
withCredentials([usernamePassword(
credentialsId: 'registry-login',
usernameVariable: 'REGISTRY_USER',
passwordVariable: 'REGISTRY_PASSWORD'
)]) {
sh '''
echo "$REGISTRY_PASSWORD" | docker login registry.example.com \
--username "$REGISTRY_USER" --password-stdin
docker push "$IMAGE:$BUILD_NUMBER"
'''
}
}
}
}
}
关键细节是 --password-stdin。它避免了在命令行中暴露注册表密码,比 docker login -p 更安全。
运行测试并发布结果
Jenkins 不需要理解你的测试框架来运行它。它需要你的构建命令生成 Jenkins 可以读取的报告格式。
对于使用 JUnit 风格 XML 报告的 Maven 项目:
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
}
}
post { always { ... } } 块很重要。即使测试失败,它也会发布测试结果,这样你就可以在 Jenkins UI 中看到失败信息。
Python、JavaScript 和 Go 项目如果生成兼容的报告,也可以使用相同的模式。例如,许多 Python 团队运行 pytest --junitxml=reports/junit.xml,然后发布 reports/junit.xml。
将构建输出存储在制品仓库中
不要将 Jenkins 工作区视为长期存储。工作区是临时的,当代理被清理时可能会消失。
对于发布输出,请使用制品仓库,例如 Nexus、Artifactory、容器注册表或云对象存储。Jenkins 可以使用 archiveArtifacts 归档小型诊断文件,但生产包应存储在专为保留和访问控制设计的系统中。
以下示例用于保留构建日志或报告:
post {
always {
archiveArtifacts artifacts: 'reports/**', allowEmptyArchive: true
}
}
这用于构建证据,而不是作为唯一的发布仓库。
将凭据保存在 Jenkins 中,而不是流水线中
Jenkins 凭据可以存储用户名、密码、SSH 密钥、令牌和机密文件。你的流水线应引用 credentialsId,而不是机密值。
对于 shell 命令,仅在需要它们的步骤周围绑定凭据:
withCredentials([string(credentialsId: 'slack-webhook', variable: 'SLACK_WEBHOOK')]) {
sh 'curl -X POST -H "Content-type: application/json" --data "{\"text\":\"Build complete\"}" "$SLACK_WEBHOOK"'
}
保持范围较小。这可以降低通过日志或后续命令泄露机密的风险。
后续可添加的有用集成
一旦核心流水线稳定下来,根据实际工作流程需求添加集成:
| 工具类型 | 常见用途 |
|---|---|
| Git 提供商 | 分支发现、拉取请求构建、提交状态更新 |
| Docker 或镜像构建器 | 构建和发布容器镜像 |
| 测试报告 | 显示失败、趋势和不稳定测试 |
| 制品仓库 | 存储构建输出和发布包 |
| 聊天或事件工具 | 在构建失败或发布时通知相应频道 |
| 安全扫描器 | 在发布前检查依赖项、镜像或源代码 |
一次添加一个集成,并确保流水线仍然能清晰地显示失败。一个有用的 Jenkins 设置是平淡无奇的:开发人员推送代码,Jenkins 构建它、测试它、发布制品,并准确显示失败发生的位置。