过去我们常通过UI单独创建Jenkins作业。随着构建和部署作业复杂性的增加,提出了“流水线即代码”的概念。在Jenkins 2.0中,Jenkins团队引入了Jenkinsfile以实现流水线即代码。若要创建基于自动化拉取请求或分支的Jenkins持续集成与持续交付流水线,Jenkins多分支流水线是一个理想选择。
作为完全基于Git的代码流水线,Jenkins多分支流水线支持构建CI/CD工作流程。流水线即代码(PaaC)使得将自动化和云可移植性的优势引入Selenium变得简单。利用多分支流水线模型,可以快速可靠地构建、测试、部署、监控、报告并管理Selenium测试等。本教程将探讨如何创建Jenkins多分支流水线,以及配置用于Selenium自动化测试的Jenkins多分支流水线的关键概念。
让我们开始吧。
什么是Jenkins多分支流水线?
根据官方文档,多分支流水线作业类型允许你定义一个作业,从单一Git仓库中,Jenkins将检测多个分支并在发现Jenkinsfile时创建嵌套作业。
根据上述定义,我们可以理解,Jenkins能够扫描Git仓库以寻找Jenkinsfile并自动创建作业。它所需的一切就是Git仓库的详细信息。本文中,我们将使用一个示例GitHub仓库。我们的示例GitHub仓库包含一个可部署到Tomcat的Spring Boot示例项目。
项目根目录下,存放着Jenkinsfile。我们采用Jenkins声明式流水线语法编写了这份Jenkinsfile。若您对Jenkins声明式流水线尚不熟悉,请参阅我们详尽的文章此处。
示例Jenkinsfile
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管道可以包含多个阶段,每个阶段由单个代理执行,所有这些阶段都在单台或多台机器上运行。通常,管道是为源代码的特定分支创建的。当您创建新作业时,您将看到一个选项,用于选择源代码仓库和分支。您还可以为新项目或现有项目的某个新特性创建全新的管道。
Jenkins管道允许您拥有一个灵活的Jenkinsfile,其中包含构建的各个阶段。因此,您可以在初始阶段运行代码静态分析、测试等,然后为构建工件或部署它们设置单独的阶段。当您希望在管道中执行多项操作时,这非常有用。
如果您只有一件事要做怎么办?或者,如果您想做的所有事情都根据某些配置而有所不同,该怎么办?在这种情况下使用Jenkins管道有意义吗?
多分支管道是一种替代方法,在这种情况下可能更合适。多分支管道允许您将任务拆分到分支中,并在稍后合并它们。这与Git分支的工作方式非常相似。
A multibranch pipeline is a pipeline that has multiple branches. The main advantage of using a multibranch pipeline is to build and deploy multiple branches from a single repository. Having a multibranch pipeline also allows you to have different environments for different branches. However, it is not recommended to use a multibranch pipeline if you do not have a standard branching and CI/CD strategy.
现在,既然您已经看到了Jenkins管道与多分支管道的比较,让我们逐步了解如何创建Jenkins多分支管道。
创建Jenkins多分支管道
步骤1
打开Jenkins主页(在本地为http://localhost:8080
),然后从左侧菜单点击“新建项”。
步骤2
输入Jenkins作业名称, 选择样式为“多分支流水线”,然后点击“确定”。
步骤3
在“配置”页面,我们只需配置一项:Git仓库源。
滚动至“分支源”部分,点击“添加源”下拉菜单。
选择“GitHub”作为源,因为我们的示例GitHub仓库托管在那里。
步骤4
输入仓库HTTPS URL为https://github.com/iamvickyav/spring-boot-h2-war-tomcat.git
,并点击“验证”。
由于我们的GitHub仓库是公开的,无需配置凭据即可访问。对于企业/私有仓库,可能需要凭据才能访问。
“凭据正常”消息表示Jenkins服务器与Git仓库之间的连接成功。
步骤5
暂时保持其余配置部分不变,点击页面底部的“保存”按钮。
保存后,Jenkins将自动执行以下步骤:
扫描仓库步骤
- 扫描我们配置的Git仓库。
- 查找Git仓库中可用的分支列表。
- 选择包含Jenkinsfile的分支。
运行构建步骤
- 对上一步中找到的每个分支运行Jenkinsfile中提到的构建步骤。
从“扫描仓库日志”部分,我们可以了解在扫描仓库步骤期间发生了什么。
由于我们的git仓库中只有一个主分支,扫描仓库日志显示“处理了1个分支”。
扫描完成后,Jenkins将为每个处理过的分支单独创建并运行构建作业。
在我们的例子中,只有一个名为master的分支。因此,构建将仅针对我们的主分支运行。我们可以通过点击左侧菜单中的“状态”来验证这一点。
在状态部分,我们可以看到为主分支创建了一个构建作业。
点击分支名称以查看构建作业日志和状态。
“阶段视图”提供了每个阶段执行所需时间的视觉表示以及构建作业的状态。
访问构建作业运行日志
步骤1
点击“构建编号”下的“构建历史”部分。
步骤2
接下来,从左侧菜单中选择“控制台输出”以查看日志。
如果我们有多个分支在Git仓库中会怎样?现在让我们来检查一下。
在Git仓库中,创建了一个名为“开发”的新分支。
为了区分“开发”分支构建,我们对Jenkinsfile中的echo命令进行了微调。
主分支中的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检测到。因此,为开发分支单独创建了一个新作业。
点击“开发”,我们可以查看开发分支构建作业的日志。
在上一个示例中,我们在主分支和开发分支中为Jenkinsfile保留了不同的内容。但这并不是我们在实际应用中处理的方式。我们利用阶段块内的when块来检查分支。
以下是一个示例,其中合并了主分支和开发分支的步骤。这段相同的代码将放置在主分支和开发分支的Jenkinsfiles中。
pipeline {
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"
"""
}
}
}
}
步骤3
点击左侧菜单中的“扫描仓库”,让Jenkins检测来自Git仓库的新更改。
至此,您可能已经注意到,每当希望Jenkins检测仓库中的更改时,我们都会使用扫描仓库功能。
那么,如何自动化这一步骤呢?
Jenkins多分支流水线扫描的定期触发器
步骤1
点击左侧菜单中的“配置”。
步骤2
向下滚动至“扫描仓库触发器”部分,启用“如未另行运行则定期执行”复选框,并选择扫描运行的周期时间间隔(以我们为例,设置为两分钟)。
步骤3
点击“保存”按钮。
从此刻起,Jenkins将每两分钟扫描一次仓库。若在任何分支中发现新提交,Jenkins将针对该特定分支运行新的构建作业,使用Jenkinsfile进行配置。
下方是“扫描仓库日志”,清晰显示每两分钟触发的扫描。
Jenkins多分支流水线的实时应用场景
以下是几个Jenkins多分支流水线适用的场景:
- 主分支上的任何新提交需自动部署至服务器。
- 若开发者尝试向开发分支发起拉取请求(PR),则应满足以下条件:
- 代码需成功构建,无编译错误。
- 代码测试覆盖率至少达到80%。
- 代码需通过SONAR代码质量检测。
- 若开发者尝试向除主分支或开发分支以外的分支推送代码,代码应成功编译。若编译失败,发送警告邮件。
以下是一个示例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") {
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 and Deploy Code") {
when {
branch 'master'
}
steps {
sh "mvn tomcat7:deploy"
}
}
}
}
我们在master和develop分支上提交了这个新的Jenkinsfile,以便在下次仓库扫描时被Jenkins多分支检测到。
利用Jenkins多分支流水线进行Selenium自动化测试
假设我们正在为某个网站编写自动化测试用例。每当分支中提交新的测试用例时,我们希望自动运行它们并确保其按预期执行。
对于开发者而言,在每种浏览器和操作系统组合上运行自动化测试用例简直是一场噩梦。这时,LambdaTest强大的自动化测试基础设施就能派上用场。
通过LambdaTest Selenium网格,您可以最大化浏览器覆盖范围。
本节我们将探讨如何利用LambdaTest的测试基础设施与Jenkins多分支流水线结合。为了演示,我们在此托管了一个示例Todo应用——LambdaTest Todo App。使用Cucumber编写的自动化测试用例已提交至示例仓库。
从Jenkins出发,我们希望在LambdaTest平台上运行这些测试用例。在LambdaTest上运行测试用例需要用户名和访问令牌。免费注册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中创建一个新的“Job”,作为多分支流水线。让我们指向示例仓库。
一旦构建成功运行,访问LambdaTest自动化仪表板以获取测试日志。
结论
通过这个过程,我们学习了如何创建Jenkins多分支流水线,如何在它中配置git仓库,为不同分支设置不同的构建步骤,使用Jenkins定期自动扫描仓库,并利用LambdaTest强大的自动化测试基础设施来实现我们的CI/CD构建自动化。希望您觉得这篇文章有用。请在评论部分分享您的反馈。
Source:
https://dzone.com/articles/how-to-create-jenkins-multibranch-pipeline