本文目录导读:

- 案例 1:最简单的声明式 Pipeline
- 案例 2:多分支 + 环境变量 + 参数化构建
- 案例 3:使用 Docker + 并行阶段
- 案例 4:包含 K8s 部署和审批
- 案例 5:复杂流程 - 多项目共享库
- 最佳实践建议
这里为您提供几个不同场景的 Jenkinsfile 案例,从最简单到复杂,并附带详细注释。
案例 1:最简单的声明式 Pipeline
适用于:简单的构建、测试、打包,无并行、无多环境。
// 声明式 Pipeline
pipeline {
// 在任何可用的 Agent 上运行
agent any
// 定义环境变量
environment {
APP_NAME = 'my-app'
VERSION = '1.0.0'
}
// 定义阶段
stages {
stage('Checkout') {
steps {
// 从 Git 拉取代码
checkout scm
echo "代码已拉取,版本: ${VERSION}"
}
}
stage('Build') {
steps {
echo "开始构建 ${APP_NAME}..."
// 假设是 Maven 项目
// sh 'mvn clean package'
// 如果没有 Maven,模拟构建
sh 'echo "构建完成" > artifact.jar'
}
}
stage('Test') {
steps {
echo "运行单元测试..."
// sh 'mvn test'
}
}
stage('Deploy') {
steps {
echo "部署到测试服务器..."
// 模拟部署
sh 'echo "部署成功"'
}
}
}
// 构建后操作
post {
always {
echo 'Pipeline 结束,清理工作区...'
cleanWs()
}
success {
echo "构建成功!"
}
failure {
echo "构建失败,请查看日志。"
}
}
}
案例 2:多分支 + 环境变量 + 参数化构建
适用于:开发、测试、生产多环境,需要手动或自动选择构建参数。
pipeline {
agent any
// 参数化构建(点击"Build with Parameters"后可选择)
parameters {
choice(name: 'ENVIRONMENT', choices: ['dev', 'staging', 'prod'], description: '选择部署环境')
string(name: 'BRANCH', defaultValue: 'develop', description: '要构建的分支')
booleanParam(name: 'SKIP_TESTS', defaultValue: false, description: '是否跳过测试')
}
// 设置环境变量(根据选择的参数动态设置)
environment {
// 根据环境设置不同的服务器地址
DEV_SERVER = 'dev.example.com'
PROD_SERVER = 'prod.example.com'
}
stages {
stage('Checkout') {
when {
// 仅当分支匹配时才执行
branch 'develop', 'main', 'release/*'
}
steps {
checkout scm
echo "检查分支: ${params.BRANCH}"
}
}
stage('Build') {
steps {
echo "构建环境: ${params.ENVIRONMENT}"
// 不同环境执行不同命令
if (params.ENVIRONMENT == 'dev') {
sh 'echo "开发模式构建"'
} else if (params.ENVIRONMENT == 'prod') {
sh 'echo "生产模式构建,使用压缩优化"'
}
}
}
stage('Test') {
when {
// 只有当 SKIP_TESTS 为 false 时执行
not { expression { params.SKIP_TESTS } }
}
steps {
echo "运行测试..."
}
}
stage('Deploy') {
steps {
// 根据环境部署到不同服务器
script {
def targetServer = params.ENVIRONMENT == 'dev' ? DEV_SERVER : PROD_SERVER
echo "正在部署到 ${targetServer}..."
sh "echo '部署到 ${targetServer} 成功'"
}
}
}
}
}
案例 3:使用 Docker + 并行阶段
适用于:微服务、多模块项目,需要并行构建多个子项目。
pipeline {
agent any
options {
// 保留最近 5 次构建
buildDiscarder(logRotator(numToKeepStr: '5'))
// 超时时间 30 分钟
timeout(time: 30, unit: 'MINUTES')
// 不打印默认的前缀
disableConcurrentBuilds()
}
stages {
stage('准备') {
steps {
sh 'echo "检查环境...: $(pwd)"'
sh 'docker --version'
sh 'node --version'
}
}
// 并行执行多个模块的构建和测试
stage('并行构建和测试') {
parallel {
stage('前端 (React)') {
agent { label 'node-agent' } // 使用指定标签的 agent
steps {
sh '''
cd frontend
npm install
npm run build
npm test
'''
}
}
stage('后端 (Spring Boot)') {
steps {
sh '''
cd backend
mvn clean package -DskipTests=false
'''
}
}
stage('数据库脚本') {
steps {
sh '''
echo "执行数据库迁移脚本..."
ls database/
'''
}
}
}
}
stage('构建 Docker 镜像') {
steps {
script {
// 根据后端构建的 jar 包构建镜像
sh '''
cd backend
docker build -t my-backend:${BUILD_NUMBER} .
'''
}
}
}
stage('推送镜像') {
steps {
sh '''
docker tag my-backend:${BUILD_NUMBER} myregistry.com/my-backend:latest
docker push myregistry.com/my-backend:latest
'''
}
}
}
post {
always {
sh 'docker system prune -f' // 清理无用镜像
}
}
}
案例 4:包含 K8s 部署和审批
适用于:生产环境,需要手动审批才部署。
pipeline {
agent any
environment {
REGISTRY = 'registry.example.com'
IMAGE_NAME = 'my-service'
IMAGE_TAG = "${GIT_COMMIT.take(8)}" // 使用 Git 短哈希作为标签
K8S_NAMESPACE = 'production'
}
stages {
stage('构建和推送镜像') {
steps {
script {
sh "docker build -t ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} ."
sh "docker push ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"
}
}
}
stage('部署到 K8s') {
steps {
script {
// 使用 kubectl 更新部署
sh """
kubectl set image deployment/${IMAGE_NAME} \
${IMAGE_NAME}=${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} \
-n ${K8S_NAMESPACE}
kubectl rollout status deployment/${IMAGE_NAME} -n ${K8S_NAMESPACE}
"""
}
}
}
stage('冒烟测试') {
steps {
sh '''
echo "运行冒烟测试..."
curl -f http://localhost:8080/health || exit 1
'''
}
}
}
post {
success {
echo "✨ 部署成功!访问 http://my-service.example.com"
}
failure {
echo "❌ 部署失败,正在回滚..."
// 模拟回滚
sh 'echo "执行回滚操作"'
}
}
}
案例 5:复杂流程 - 多项目共享库
// 加载共享库
@Library('my-shared-library') _
def buildDocker(String module, String env) {
// 使用共享库中的函数
utils.buildDockerImage(module, env)
}
pipeline {
agent any
tools {
maven 'M3'
jdk 'JDK11'
}
environment {
// 从 Credentials 获取敏感信息
DOCKER_REGISTRY = credentials('docker-registry')
K8S_CREDENTIALS = credentials('k8s-prod')
}
stages {
stage('多模块并行构建') {
parallel {
stage('Module A') {
steps { buildDocker('module-a', 'dev') }
}
stage('Module B') {
steps { buildDocker('module-b', 'dev') }
}
}
}
stage('分布式测试') {
steps {
script {
// 使用插件
catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') {
script {
// 执行测试
if (params.RUN_PERFORMANCE_TEST) {
// 跑性能测试
}
}
}
}
}
}
}
}
| 特性 | 推荐用法 |
|---|---|
| 声明式 vs 脚本式 | 推荐声明式,更易读、易维护 |
| Agent | 根据阶段使用不同 agent:agent any、agent { label 'docker' } |
| 参数化 | 用 parameters 定义用户输入 |
| 环境变量 | 用 environment 定义全局环境变量 |
| 条件执行 | 用 when 块控制阶段是否执行 |
| 并行执行 | 用 parallel 块实现并行构建 |
| 错误处理 | 用 post 和 catchError 处理失败情况 |
| 敏感信息 | 用 credentials 存储用户名密码/Token |
| 超时控制 | 用 options 中的 timeout 防止卡死 |
最佳实践建议
- 保持简单 - 不要过度设计,只写需要的 Stage
- 使用插件 - 优先使用 Jenkins 生态中成熟的插件
- 错误处理 - 重要步骤要加
catchError或post处理 - 清晰命名 - Stage 名称要能清晰表达其功能
- 共享库 - 多个 Pipeline 复用的代码抽取到共享库
- 安全 - 敏感信息绝对不要硬编码在 Pipeline 中
- 日志 - 在关键步骤添加清晰的日志输出
需要针对特定场景的详细配置(GitLab、Gitee、K8s、Docker 等),告诉我您的具体需求,我可以提供更详细的配置。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播