Jenkins自动化构建与CI/CD流水线实战

本文详解Jenkins的安装配置、Pipeline编写、自动化构建部署的完整实践。

前言

持续集成/持续部署(CI/CD)是现代软件开发的标配:

  • 自动化构建:代码提交后自动编译打包
  • 自动化测试:每次构建自动运行测试
  • 自动化部署:测试通过后自动发布

Jenkins是最流行的开源CI/CD工具:

  • 插件生态丰富(1800+插件)
  • 支持各种语言和框架
  • Pipeline as Code

今天来搭建一套完整的Jenkins CI/CD环境。


一、Jenkins部署

1.1 Docker部署(推荐)

yaml 复制代码
# docker-compose.yml
version: '3.8'

services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    privileged: true
    user: root
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - ./jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
    environment:
      - TZ=Asia/Shanghai
    restart: unless-stopped
bash 复制代码
# 创建目录并启动
mkdir jenkins_home
docker compose up -d

# 获取初始密码
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

1.2 初始化配置

复制代码
1. 访问 http://服务器IP:8080
2. 输入初始密码
3. 安装推荐插件(或自定义选择)
4. 创建管理员账号
5. 配置Jenkins URL

1.3 必装插件

插件 用途
Pipeline 流水线支持
Git Git集成
Docker Pipeline Docker构建支持
Blue Ocean 现代化UI
Credentials Binding 凭证管理
SSH Agent SSH部署
复制代码
安装路径:
Manage Jenkins → Plugins → Available plugins

二、第一个Pipeline

2.1 创建Pipeline项目

复制代码
1. Dashboard → New Item
2. 输入名称,选择"Pipeline"
3. 点击OK

2.2 Hello World Pipeline

groovy 复制代码
pipeline {
    agent any
    
    stages {
        stage('Hello') {
            steps {
                echo 'Hello, Jenkins Pipeline!'
            }
        }
        
        stage('Build') {
            steps {
                echo 'Building...'
                sh 'echo "Build number: ${BUILD_NUMBER}"'
            }
        }
        
        stage('Test') {
            steps {
                echo 'Testing...'
            }
        }
        
        stage('Deploy') {
            steps {
                echo 'Deploying...'
            }
        }
    }
    
    post {
        always {
            echo 'Pipeline finished!'
        }
        success {
            echo 'Success!'
        }
        failure {
            echo 'Failed!'
        }
    }
}

2.3 运行Pipeline

复制代码
1. 点击"Build Now"
2. 查看"Console Output"
3. 或使用Blue Ocean查看可视化流程

三、实战:Java项目CI/CD

3.1 项目结构

复制代码
my-project/
├── src/
├── pom.xml
├── Dockerfile
└── Jenkinsfile

3.2 Jenkinsfile

groovy 复制代码
pipeline {
    agent any
    
    environment {
        DOCKER_REGISTRY = 'registry.example.com'
        IMAGE_NAME = 'my-app'
        DEPLOY_SERVER = '192.168.1.100'
    }
    
    tools {
        maven 'Maven-3.8'
        jdk 'JDK-11'
    }
    
    stages {
        stage('Checkout') {
            steps {
                checkout scm
                echo "Branch: ${env.BRANCH_NAME}"
                echo "Commit: ${env.GIT_COMMIT}"
            }
        }
        
        stage('Build') {
            steps {
                sh 'mvn clean compile -DskipTests'
            }
        }
        
        stage('Test') {
            steps {
                sh 'mvn test'
            }
            post {
                always {
                    junit '**/target/surefire-reports/*.xml'
                }
            }
        }
        
        stage('Package') {
            steps {
                sh 'mvn package -DskipTests'
                archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
            }
        }
        
        stage('Docker Build') {
            steps {
                script {
                    def imageTag = "${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER}"
                    sh "docker build -t ${imageTag} ."
                    sh "docker push ${imageTag}"
                }
            }
        }
        
        stage('Deploy') {
            when {
                branch 'main'
            }
            steps {
                script {
                    def imageTag = "${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER}"
                    sshagent(['deploy-server-key']) {
                        sh """
                            ssh -o StrictHostKeyChecking=no user@${DEPLOY_SERVER} '
                                docker pull ${imageTag}
                                docker stop my-app || true
                                docker rm my-app || true
                                docker run -d --name my-app -p 8080:8080 ${imageTag}
                            '
                        """
                    }
                }
            }
        }
    }
    
    post {
        success {
            echo 'Pipeline succeeded!'
            // 发送通知
        }
        failure {
            echo 'Pipeline failed!'
            // 发送告警
        }
    }
}

3.3 Dockerfile

dockerfile 复制代码
FROM openjdk:11-jre-slim

WORKDIR /app

COPY target/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]

3.4 配置Git仓库

复制代码
1. 创建Pipeline项目
2. Pipeline → Definition: "Pipeline script from SCM"
3. SCM: Git
4. Repository URL: 填写Git地址
5. Credentials: 添加Git凭证
6. Branch: */main
7. Script Path: Jenkinsfile

四、凭证管理

4.1 添加凭证

复制代码
Manage Jenkins → Credentials → System → Global credentials → Add Credentials

4.2 凭证类型

类型 用途
Username with password Git账号、Docker Registry
SSH Username with private key 服务器部署
Secret text Token、API Key
Secret file 配置文件

4.3 在Pipeline中使用

groovy 复制代码
pipeline {
    agent any
    
    stages {
        stage('Deploy') {
            steps {
                // 方式1:SSH凭证
                sshagent(['my-ssh-key']) {
                    sh 'ssh user@server "command"'
                }
                
                // 方式2:用户名密码
                withCredentials([usernamePassword(
                    credentialsId: 'docker-registry',
                    usernameVariable: 'DOCKER_USER',
                    passwordVariable: 'DOCKER_PASS'
                )]) {
                    sh 'docker login -u $DOCKER_USER -p $DOCKER_PASS'
                }
                
                // 方式3:Secret文本
                withCredentials([string(
                    credentialsId: 'api-token',
                    variable: 'API_TOKEN'
                )]) {
                    sh 'curl -H "Authorization: $API_TOKEN" ...'
                }
            }
        }
    }
}

五、多分支Pipeline

5.1 创建多分支Pipeline

复制代码
1. New Item → Multibranch Pipeline
2. 配置Git仓库
3. Jenkins自动扫描所有分支
4. 每个分支独立构建

5.2 分支策略

groovy 复制代码
pipeline {
    agent any
    
    stages {
        stage('Build') {
            steps {
                sh 'mvn package'
            }
        }
        
        stage('Deploy to Dev') {
            when {
                branch 'develop'
            }
            steps {
                echo 'Deploying to dev environment...'
            }
        }
        
        stage('Deploy to Staging') {
            when {
                branch 'release/*'
            }
            steps {
                echo 'Deploying to staging environment...'
            }
        }
        
        stage('Deploy to Production') {
            when {
                branch 'main'
            }
            steps {
                input message: '确认部署到生产环境?'
                echo 'Deploying to production...'
            }
        }
    }
}

六、触发器配置

6.1 常用触发器

groovy 复制代码
pipeline {
    agent any
    
    triggers {
        // 定时构建(每天凌晨2点)
        cron('0 2 * * *')
        
        // 轮询SCM(每5分钟检查一次)
        pollSCM('H/5 * * * *')
        
        // GitLab/GitHub Webhook触发
        // 需要在仓库配置Webhook
    }
    
    stages {
        // ...
    }
}

6.2 Webhook配置

GitLab:

复制代码
Settings → Webhooks → Add webhook
URL: http://jenkins-server:8080/project/项目名
Trigger: Push events

GitHub:

复制代码
Settings → Webhooks → Add webhook
Payload URL: http://jenkins-server:8080/github-webhook/
Content type: application/json

七、跨网络部署

7.1 场景

复制代码
常见情况:
- Jenkins在公司内网
- 生产服务器在云上或分部机房
- 网络不通,无法SSH部署

7.2 组网方案

使用组网软件(如星空组网)打通Jenkins和部署服务器:

复制代码
┌─────────────────────────────────────────────────────────┐
│                    组网虚拟局域网                         │
│                                                          │
│  ┌──────────────────┐      ┌──────────────────┐         │
│  │   公司内网        │      │   云服务器/分部   │         │
│  │                  │      │                  │         │
│  │  Jenkins         │      │  生产服务器       │         │
│  │  10.10.0.1       │─────→│  10.10.0.2       │         │
│  │                  │  SSH │                  │         │
│  └──────────────────┘      └──────────────────┘         │
│                                                          │
└─────────────────────────────────────────────────────────┘

Jenkinsfile配置:

groovy 复制代码
environment {
    // 使用组网IP
    DEPLOY_SERVER = '10.10.0.2'
}

stage('Deploy') {
    steps {
        sshagent(['deploy-key']) {
            sh """
                ssh user@${DEPLOY_SERVER} '
                    docker pull my-app:latest
                    docker-compose up -d
                '
            """
        }
    }
}

优势:

  • 不需要公网暴露Jenkins
  • 不需要服务器开放SSH到公网
  • 加密传输,安全可靠
  • 配置简单,一次设置

八、Blue Ocean

8.1 安装Blue Ocean

复制代码
Manage Jenkins → Plugins → 搜索"Blue Ocean" → Install

8.2 使用Blue Ocean

复制代码
访问:http://jenkins:8080/blue

特点:
- 现代化可视化界面
- Pipeline编辑器
- 分支和PR视图
- 更好的日志展示

九、常见问题

9.1 构建卡住

groovy 复制代码
// 设置超时
options {
    timeout(time: 30, unit: 'MINUTES')
}

9.2 磁盘空间不足

groovy 复制代码
// 保留最近10次构建
options {
    buildDiscarder(logRotator(numToKeepStr: '10'))
}

9.3 并行构建

groovy 复制代码
stage('Parallel Tests') {
    parallel {
        stage('Unit Tests') {
            steps {
                sh 'mvn test -Dtest=*Unit*'
            }
        }
        stage('Integration Tests') {
            steps {
                sh 'mvn test -Dtest=*Integration*'
            }
        }
    }
}

十、总结

Jenkins CI/CD要点:

  1. Docker部署:最简单的部署方式
  2. Pipeline as Code:Jenkinsfile版本控制
  3. 凭证管理:安全存储敏感信息
  4. 多分支Pipeline:自动化分支构建
  5. Webhook触发:代码提交自动构建
  6. 跨网络部署:组网打通构建和部署环境

最佳实践:

复制代码
☑ Jenkinsfile放在代码仓库
☑ 使用声明式Pipeline
☑ 合理设置构建保留策略
☑ 配置构建通知(邮件/钉钉/企微)
☑ 定期清理工作空间

参考资料

  1. Jenkins官方文档:https://www.jenkins.io/doc/
  2. Jenkins Pipeline语法:https://www.jenkins.io/doc/book/pipeline/syntax/
  3. Jenkins插件中心:https://plugins.jenkins.io/

💡 建议:从简单的Pipeline开始,逐步添加测试、部署等阶段。先跑通流程,再优化细节。

复制代码
相关推荐
见合八方3 小时前
【噪声系数】高偏SOA噪声系数测试方法
网络·自动化·soa·光通信·激光雷达·半导体光放大器
曦尧3 小时前
Microsoft Ontology Playground:面向 Fabric IQ 的零后端本体可视化学习平台
ai·自动化
泡沫冰@4 小时前
在WSL上的部署Jenkins
jenkins
叮咚侠4 小时前
docker安装的kibana+elasticsearch,突然kibana界面打不开了
运维·jenkins
AlanBruce5 小时前
从串口仪表到西门子PLC:摩尔信使MThings的多协议设备接入能力
自动化·plc·modbus·mthings·摩尔信使·西门子s7
微硬创新16 小时前
耐达讯自动化 CC-Link IE 转 PROFINET网关在污水厂智能化升级实战
人工智能·物联网·网络协议·自动化·信息与通信
MC皮蛋侠客20 小时前
uv 系列(七):CI/CD、Docker 与私有索引——生产级交付
python·ci/cd·docker·uv
壮哥_icon1 天前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
xexpertS1 天前
分布式系统过载治理:如何通过较小服务控制请求节奏
微服务·自动化
diving deep1 天前
CI/CD
ci/cd