CICD篇之通过Jenkins中书写pipeline构建编译打包发布流程

1. Jenkins中Pipeline作用

在 Jenkins 中使用 Pipeline 来构建、打包、编译和发布代码的流水线,可以帮助团队实现自动化的持续集成与持续交付(CI/CD)。

我们可以通过 Jenkins Pipeline 管道,自动化执行从代码检出、构建、测试到发布的所有步骤。

2. Jenkins Pipeline 基本概念

Jenkins 提供了两种主要的 Pipeline 类型:

  1. Declarative Pipeline:声明式 Pipeline,采用简洁的语法,易于配置。
  2. Scripted Pipeline:脚本化 Pipeline,使用自由格式的 Groovy 语言,适用于复杂场景,但相对复杂。

3. Jenkins Pipeline 打包编译代码的流程

一个典型的流水线过程包括以下几个步骤:

  • Checkout 代码:从代码仓库(如 Git)检出源代码。
  • 构建编译:执行编译构建操作(如 Maven、Gradle、Ant 等)。
  • 单元测试:运行单元测试,验证代码质量。
  • 打包:将构建的代码打包成可部署的文件(如 JAR、WAR、Docker 镜像等)。
  • 存档构建产物:保存构建产物,以供后续步骤使用。
  • 部署到测试环境:将打包好的应用部署到测试环境。
  • 通知:发送构建结果的通知(如成功或失败)。
  • 清理:进行资源清理,确保环境的整洁。

4. Jenkins Pipeline 完整示例

pipeline {
    agent any  // 代表可以在任何可用的节点上运行流水线
    environment {
        MAVEN_HOME = '/usr/local/maven'  // 设置 Maven 安装路径
        APP_NAME = 'your-app-name'  // 应用名称
        DEPLOY_DIR = '/path/to/deploy'  // 部署目录
    }

    stages {
        stage('Checkout') {
            steps {
                // 从 Git 仓库检出代码
                git 'https://github.com/your-repository/your-project.git'
            }
        }

        stage('Build') {
            steps {
                // 使用 Maven 进行构建
                script {
                    sh "'${MAVEN_HOME}/bin/mvn' clean install -DskipTests"
                }
            }
        }

        stage('Test') {
            steps {
                // 运行单元测试
                script {
                    sh "'${MAVEN_HOME}/bin/mvn' test"
                }
            }
        }

        stage('Package') {
            steps {
                // 使用 Maven 打包应用
                script {
                    sh "'${MAVEN_HOME}/bin/mvn' package"
                }
            }
        }

        stage('Archive Artifacts') {
            steps {
                // 存档构建产物,以便后续步骤使用
                archiveArtifacts artifacts: 'target/*.jar', allowEmptyArchive: true
            }
        }

        stage('Deploy to Test Environment') {
            steps {
                script {
                    // 将应用部署到测试环境
                    echo 'Deploying to test environment...'
                    sh 'scp target/your-app.jar user@your-test-server:/path/to/deploy/'
                }
            }
        }

        stage('Notify') {
            steps {
                script {
                    if (currentBuild.result == 'SUCCESS') {
                        echo 'Build successful! Deploying to test environment...'
                    } else {
                        echo 'Build failed! Please check the logs.'
                    }
                }
            }
        }
    }

    post {
        always {
            // 在构建完成后执行,进行必要的清理
            echo 'Pipeline completed.'
        }
        success {
            echo 'Build was successful.'
        }
        failure {
            echo 'Build failed.'
        }
    }
}

参数解释:
1. agent any:
代表流水线可以在任何可用的 Jenkins 节点上执行。这意味着 Jenkins 会根据可用的节点选择合适的执行环境。
2. environment:
在 environment 部分,可以设置全局环境变量,例如 Maven 安装路径、应用名称和部署目录。这样可以在整个流水线中使用这些环境变量。
3. stages:
定义了流水线的多个阶段,每个阶段执行不同的任务。
- git:用于从 Git 仓库检出代码。
- sh:执行 Shell 命令,比如运行 Maven 构建、测试和打包。
- archiveArtifacts:存档构建产物,方便后续步骤使用或下载。
- Checkout:从 Git 仓库中检出代码。
- Build:使用 Maven 进行构建,通常会执行 clean install 来清理旧的构建并安装依赖。
- Test:执行单元测试,通常会运行 mvn test 来确保代码质量。
- Package:使用 Maven 打包应用,生成 JAR、WAR 等文件。
- Archive Artifacts:存档构建产物(如 JAR 文件),以便后续步骤可以使用或部署。
- Deploy to Test Environment:将打包的文件部署到测试环境。可以使用 scp 或其他工具将文件复制到远程服务器。
- Notify:发送构建通知,通知团队构建是否成功。
4. post:
在流水线执行完后,无论成功与否,都会执行的部分。包括:
- always:始终执行的步骤,通常用来执行清理操作。
- success:当构建成功时执行的步骤。
- failure:当构建失败时执行的步骤。

5. 高级功能

5.1. 并行执行

如果你希望在流水线中并行执行多个任务,可以使用 parallel 来并行执行不同的阶段。

stage('Parallel Build') {
    parallel {
        stage('Unit Tests') {
            steps {
                sh 'mvn test'
            }
        }
        stage('Integration Tests') {
            steps {
                sh 'mvn verify'
            }
        }
    }
}

5.2. 集成外部工具

你可以集成 SonarQube 进行代码质量分析,或者使用 Docker 来容器化构建和部署。
1. SonarQube 集成示例:

stage('SonarQube Analysis') {
    steps {
        script {
            sh "'${MAVEN_HOME}/bin/mvn' sonar:sonar -Dsonar.projectKey=your-project-key"
        }
    }
}

2. Docker 构建示例:

pipeline {
    agent { docker { image 'maven:3.8-jdk-11' } }
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean install'
            }
        }
    }
}

5.3. 通知团队

在流水线完成后,发送通知到 Slack、邮件 或其他平台。

Slack 通知示例:

post {
    success {
        slackSend (channel: '#build-notifications', message: "Build SUCCESS")
    }
    failure {
        slackSend (channel: '#build-notifications', message: "Build FAILED")
    }
}

5.4. 构建多环境发布

如果你有多个部署环境(如开发、测试、生产),可以根据需要在不同的阶段发布到不同的环境。你可以使用 when 条件来实现这一点。

6. 总结

通过 Jenkins Pipeline,我们可以将代码从版本控制系统中检出,经过编译、测试、打包后,自动化发布到目标环境,实现真正的持续集成与持续交付(CI/CD)。上述示例展示了一个典型的流水线流程,你可以根据自己的项目需求和工具链,进一步扩展和优化流水线的步骤。

相关推荐
紫菜(Nori)几秒前
Jenkins 中 写 shell 命令执行失败,检测失败问题
jenkins
jwensh5 分钟前
【Jenkins】pipeline 的基础语法以及快速构建一个 jenkinsfile
pipeline·jenkins
你疯了抱抱我22 分钟前
【自用】通信内网部署rzgxxt项目_02,前端pipeCloud部署(使用 nginx 部署 + NSSM 控制非窗口运行)
运维·前端·nginx
林农24 分钟前
C05S13-MySQL数据库备份与恢复
运维·mysql·云计算
hqlai123431 分钟前
docker pull失败处理
运维·docker·容器
海涛高软44 分钟前
linux上qt打包(二)
linux·运维·服务器
**AE86**1 小时前
前端yarn工具打包时网络连接问题排查与解决
运维·前端·docker
小锋学长生活大爆炸2 小时前
【教程】apache设置禁止通过IP访问,只能域名访问
linux·运维·服务器·网络·网络协议·tcp/ip·apache
七七期2 小时前
解决JPS少DataNode的情况
linux·运维·服务器
枫舞雪域3 小时前
【Ubuntu】安装QQ
linux·运维·ubuntu