CICD 与 Jenkins 多分支管道

简介: Jenkins多分支管道可自动扫描Git仓库中的多个分支并创建作业,适用于不同分支的CI/CD流程管理。它支持自动构建、部署及测试,提升开发效率。

什么是 Jenkins 多分支管道?

根据官方文档,多分支管道作业类型允许您定义一个作业,其中 Jenkins 将在单个 git 存储库中检测多个分支,并在找到 Jenkinsfile 时创建嵌套作业

从上面的定义,我们可以理解,Jenkins可以扫描Git repo中的Jenkinsfile并自动创建作业。它需要我们提供的只是 Git Repo 详细信息。在本文中,我们将使用示例 GitHub 存储库。我们的示例 GitHub 存储库包含一个可以部署到 Tomcat 的示例 Spring Boot 项目。

在项目的根目录中,我们有 Jenkinsfile。我们使用 Jenkins 声明式管道语法来创建此 Jenkinsfile。

示例 Jenkins 文件:

pipeline {
   agent any
   stages {
       stage('Build Code') {
           steps {
               sh """
               echo "Building Artifact"
               """
           }
       }
      stage('Deploy Code') {
          steps {
               sh """
               echo "Deploying Code"
               """
          }
      }
   }
}

我们在 Jenkinsfile 中创建了两个阶段“构建代码”和“部署代码”,每个阶段都配置为打印适当的消息。现在我们已经准备好了带有 Jenkinsfile 的 Git 存储库。

Jenkins管道对比。多分支管道:

Jenkins 管道是新热点,但并不适合所有人。多分支管道仍然很棒。在 Jenkins 多分支管道教程的这一部分中,让我们通过 Jenkins 管道与多分支管道比较来了解 Jenkins 管道和多分支管道的理想用例。

Jenkins 管道是一个作业配置系统,允许您配置将代表您自动执行的作业管道。Jenkins 管道可以有多个阶段,每个阶段将由单个代理执行,所有阶段都在单台机器或多台机器上运行。通常为源代码的特定分支创建管道。当您创建新作业时,您将看到用于选择源代码存储库和分支的选项。您还可以为新项目或现有项目的新功能创建新的管道。

Jenkins 管道允许您拥有一个灵活的 Jenkinsfile,其中包含构建的各个阶段。因此,您可以在初始阶段运行 linting、测试等,然后使用单独的阶段来构建工件或部署它们。当您想在管道中执行多项操作时,这非常有用。

但如果你只有一件事要做怎么办?或者,如果您想要做的所有事情都根据某些配置而有所不同?在这里使用 Jenkins 管道有意义吗?

多分支管道是一种替代方法,可能更适合这些情况。多分支管道允许您将任务拆分为多个分支,然后将它们合并在一起。这与 Git 分支的工作方式非常相似。

多分支管道是具有多个分支的管道。使用多分支管道的主要优点是从单个存储库构建和部署多个分支。拥有多分支管道还允许您为不同的分支拥有不同的环境。但是,如果您没有标准分支和 CI/CD 策略,则不建议使用多分支管道。

现在,既然您已经了解了 Jenkins 管道与多分支管道的比较,那么让我们逐步完成创建 Jenkins 多分支管道的步骤。

需要Safari 在线浏览器的出色解决方案吗?忘记模拟器或模拟器——使用真正的在线浏览器

创建 Jenkins 多分支管道的步骤

第 1 步:打开 Jenkins 主页(本地localhost:8080)并单击左侧菜单中的“新建项目”。

步骤 2:输入 Jenkins 作业名称并选择样式为多分支管道,然后单击“确定”。

第3步:在配置页面中,我们只需要配置一件事——Git Repo源。

向下滚动到“分支源”部分并单击“添加源”下拉列表。

选择 GitHub 作为源,因为我们的示例 GitHub 存储库托管在此处。

步骤 3:输入存储库 HTTPS URL 作为github.com/iamvickyav/spring-boot-h2-war-to..并单击 Validate 。

由于我们的 GitHub 存储库作为公共存储库托管,因此我们无需配置凭据即可访问它。对于企业/私人存储库,我们可能需要凭据才能访问它们。

“Credentials ok”消息表示 Jenkins 服务器与 Git 存储库之间的连接成功。

步骤 4:暂时保留其余配置部分,然后单击底部的“保存”按钮。

保存时,Jenkins 将自动执行以下步骤。

扫描存储库步骤

  • 扫描我们配置的Git repo
  • 查找 Git 存储库中可用的分支列表
  • 选择有 Jenkinsfile 的分支

运行构建步骤

  • 使用 Jenkinsfile 中提到的步骤为上一步中找到的每个分支运行构建

从扫描存储库日志部分,我们可以了解扫描存储库步骤中发生的情况

由于我们的 git 存储库中只有一个主分支,因此扫描存储库日志显示已处理 1 个分支

扫描完成后,Jenkins 将为每个已处理的分支单独创建并运行构建作业。

在我们的例子中,我们只有一个名为 master 的分支。因此,构建将仅针对主分支运行。我们可以通过单击左侧菜单中的“状态”来检查相同的情况。

我们可以在状态部分看到为主分支创建的构建作业。

单击分支名称可查看构建作业日志和状态。

阶段视图直观地展示了每个阶段执行所需的时间以及构建作业的状态。

访问构建作业运行日志

第 1 步:单击构建历史记录部分下的构建号。

步骤 2:然后从左侧菜单中选择“控制台输出”以查看日志。

如果我们的 Git 存储库中有多个分支,会发生什么情况?现在让我们检查一下。

在 Git 存储库中,创建了一个名为“develop”的新分支。

为了区分开发分支构建,我们对 Jenkinsfile 中的 echo 命令进行了一些小更改。

master 分支中的 Jenkinsfile:

pipeline {
   agent any
   stages {
       stage('Build Code') {
           steps {
               sh """
               echo "Building Artifact"
               """
           }
       }
      stage('Deploy Code') {
          steps {
               sh """
               echo "Deploying Code"
               """
          }
      }
   }
}

开发分支中的 Jenkinsfile:

pipeline {
   agent any
   stages {
       stage('Build Code') {
           steps {
               sh """
               echo "Building Artifact from Develop Branch"
               """
           }
       }
      stage('Deploy Code') {
          steps {
               sh """
               echo "Deploying Code from Develop Branch"
               """
          }
      }
   }
}

现在我们在两个不同的分支中有两个 Jenkinsfile。让我们在 Jenkins 中重新运行存储库扫描以查看行为。

我们可以看到 Jenkins 检测到了新分支(开发分支)。因此,为开发分支单独创建了一个新工作。

单击“开发”后,我们可以看到开发分支的构建作业的日志。

在前面的例子中,我们在master和develop分支中为Jenkinsfile保留了不同的内容。但这不是我们在现实世界应用中的做法。我们利用 stage 块中的when 块来检查分支。

这是一个包含主分支和开发分支的组合步骤的示例。相同的内容将放置在主分支和开发分支 Jenkinsfile 中。

agent any
    stages {
        stage('Master Branch Deploy Code') {
            when {
                branch 'master'
            }
            steps {
                sh """
                echo "Building Artifact from Master branch"
                """
sh """
                echo "Deploying Code from Master branch"
                """
            }
        }
        stage('Develop Branch Deploy Code') {
            when {
                branch 'develop'
            }
            steps {
                sh """
                echo "Building Artifact from Develop branch"
                """
                sh """
                echo "Deploying Code from Develop branch"
                """
           }
        }
    }
}

Jenkins 多分支管道的实时用例

以下是 Jenkins 多分支管道可以派上用场的几个场景。

  • 主分支中的任何新提交都必须自动部署在服务器中。
  • 如果开发人员尝试提出 Pull Request (PR) 来开发分支,那么,
  • 代码应该成功构建,没有编译错误。
  • 代码应具有至少 80% 的测试覆盖率。
  • 代码应通过 SONAR 代码质量测试。
  • 如果开发人员尝试将代码推送到 master 或develop 之外的分支,代码应该可以成功编译。如果没有,请发送警报电子邮件。

这是一个涵盖上述一些用例的 Jenkinsfile 示例。

line {
    agent any
    tools {
        maven 'MAVEN_PATH'
        jdk 'jdk8'
    }
    stages {
        stage("Tools initialization") {
            steps {
                sh "mvn --version"
                sh "java -version"
            }
        }
        stage("Checkout Code") {
            steps {
                checkout scm
            }
        }
        stage("Check Code Health") {
            when {
                not {
                    anyOf {
                        branch 'master';
                        branch 'develop'
                    }
                }
           }
           steps {
               sh "mvn clean compile"
            }
        }
        stage("Run Test cases") {
            when {
                branch 'develop';
            }
           steps {
               sh "mvn clean test"
            }
        }
        stage("Check Code coverage") {
            when {
                branch 'develop'
            }
            steps {
               jacoco(
                    execPattern: '**/target/**.exec',
                    classPattern: '**/target/classes',
                    sourcePattern: '**/src',
                    inclusionPattern: 'com/iamvickyav/**',
                    changeBuildStatus: true,
                    minimumInstructionCoverage: '30',
                    maximumInstructionCoverage: '80')
           }
        }
        stage("Build & Deploy Code") {
            when {
                branch 'master'
            }
            steps {
                sh "mvn tomcat7:deploy"
            }
        }
    }
 }

我们将这个新的 Jenkinsfile 提交到 master 和开发分支中,以便 Jenkins 多分支在下一次存储库扫描中可以检测到它。

使用 Jenkins 多分支管道进行 Selenium 自动化测试

让我们考虑一下我们正在为一个网站编写自动化测试用例。每当在分支中提交新的测试用例时,我们都希望运行它们并确保它们按预期执行。

对于任何开发人员来说,在每个浏览器和操作系统组合上运行自动化测试用例都是一场噩梦。这就是 LambdaTest 强大的自动化测试基础设施可以派上用场的地方。

使用 LambdaTest Selenium 网格,您可以最大限度地扩大浏览器覆盖范围,因为它提供了 3000 多种浏览器,并支持跨多种设备的多个平台。借助 LambdaTest 在线 Selenium Grid,您可以比在本地网格上更快、更轻松地执行自动化浏览器测试。

在本节中,我们将了解如何利用 LambdaTest 强大的测试基础设施和 Jenkins 多分支管道。为了进行演示,我们在这里托管了一个示例 Todo 应用程序 - LambdaTest ToDo App。用 Cucumber 编写的自动化测试用例在示例存储库中提交。

从 Jenkins 中,我们希望在 LambdaTest 平台上运行这些测试用例。在 LambdaTest 中运行测试用例需要用户名和 accessToken。免费注册 LambdaTest 平台以获得您的凭据。

设置环境变量

当测试用例运行时,他们将在环境变量中查找 LambdaTest 的用户名 (LT_USERNAME) 和密码 (LT_ACCESS_KEY)。所以我们需要预先配置它们。

为了避免将它们与源代码一起存储,我们将它们配置为 Jenkins 中的秘密并从中加载环境变量。

environment {
               LAMBDATEST_CRED = credentials('Lambda-Test-Credentials-For-multibranch')
               LT_USERNAME = "$LAMBDATEST_CRED_USR"
               LT_ACCESS_KEY = "$LAMBDATEST_CRED_PSW"
}

这是我们最终的 Jenkinsfile:

pipeline {
   agent any
   tools {
       maven 'MAVEN_PATH'
       jdk 'jdk8'
   }
   stages {
       stage("Tools initialization") {
           steps {
               sh "mvn --version"
               sh "java -version"
           }
       }
       stage("Checkout Code") {
           steps {
               checkout scm
           }
       }
       stage("Check Code Health") {
           when {
               not {
                   anyOf {
                       branch 'master';
                       branch 'develop'
                   }
               }
          }
          steps {
              sh "mvn clean compile"
           }
       }
       stage("Run Test cases in LambdaTest") {
           when {
               branch 'develop';
           }
           environment {
               LAMBDATEST_CRED = credentials('Lambda-Test-Credentials-For-multibranch')
               LT_USERNAME = "$LAMBDATEST_CRED_USR"
               LT_ACCESS_KEY = "$LAMBDATEST_CRED_PSW"
           }
          steps {
              sh "mvn test"
           }
       }
   }
}

现在,我们将按照上述部分中提到的步骤在 Jenkins 中创建一个新作业作为多分支管道。

从 StageView 验证构建运行的状态。

构建成功运行后,请访问LambdaTest 自动化仪表板以获取测试日志。

结论

通过此,我们学习了如何创建 Jenkins 多分支管道、如何在其中配置 git 存储库、不同分支的不同构建步骤、使用 Jenkins 定期自动扫描存储库以及利用 LambdaTest 强大的自动化测试基础设施来自动化我们的 CI/CD 构建。

相关文章
|
12月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
281 0
|
12月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
527 0
|
jenkins 测试技术 持续交付
Jenkins 在多分支项目中的应用
【8月更文第31天】在现代软件开发实践中,分支管理是一项至关重要的策略,它允许开发团队在不同的功能开发、修复bug或进行实验时不会干扰主干代码。随着项目的复杂度增加,维护多个分支并确保它们的质量变得越来越具有挑战性。Jenkins 作为一款流行的持续集成(CI)和持续部署(CD)工具,提供了强大的功能来支持多分支项目的自动化测试和部署。本文将探讨 Jenkins 如何帮助管理多分支项目,并提供具体的代码示例。
333 0
|
jenkins Java 测试技术
Jenkins 在持续集成/持续交付(CI/CD)管道中的应用
【8月更文第31天】 在现代软件开发过程中,持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)已经成为提升开发效率和软件质量的重要实践。Jenkins 是一个广泛使用的开源工具,它能够帮助团队实现自动化构建、测试和部署,是 CI/CD 流水线的核心组件之一。本文将详细介绍 Jenkins 在 CI/CD 管道中的应用,并提供具体的代码示例。
474 0
|
jenkins Java 持续交付
jenkins学习笔记之十六:SonarSQube支持多分支
jenkins学习笔记之十六:SonarSQube支持多分支
|
jenkins 持续交付 Windows
Jenkins Pipeline 多分支流水线 Input length = 1
Jenkins Pipeline 多分支流水线 Input length = 1
128 0
|
运维 jenkins Devops
Jenkins 多分支流水线(SVN)
Jenkins 多分支流水线(SVN)
219 0
|
Java jenkins 持续交付
Jenkins——在流水线管道中使用指定的JDK
Jenkins——在流水线管道中使用指定的JDK
272 0
|
JSON jenkins 持续交付
jenkins-Generic Webhook Trigger指定分支构建
jenkins-Generic Webhook Trigger指定分支构建
531 0
|
11月前
|
jenkins Devops Java
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第27天】在快速发展的软件开发领域,DevOps实践日益重要。Jenkins作为一款流行的开源自动化服务器,在持续集成(CI)和持续部署(CD)中扮演关键角色。本文通过案例分析,探讨Jenkins在Java项目中的应用,展示其自动化构建、测试和部署的能力,提高开发效率和软件质量。
297 2

推荐镜像

更多