Jenkins 中的管道是一组按特定顺序相互关联的作业(或事件)。Jenkins Pipeline 是一组或一套插件,为将持续交付管道实施和集成到 Jenkins 中提供支持。
Pipeline 还提供了一组工具,可用于通过“Pipeline Domain-Specific Language (DSL)”语法将简单和复杂的交付管道建模为“代码”。
Jenkins 管道中的每项工作都对一个或多个事件有一定的依赖性。Jenkins 中的持续交付管道由四个状态组成——构建、部署、测试和发布。这些状态中的每一个都包含按顺序执行的事件。
现在您了解了什么是 Jenkins 管道,我们可以更深入地研究这个概念。Jenkins Pipeline 的完整定义被写入一个名为 Jenkinsfile 的文本文件中。它包含运行 Jenkins 管道所需的步骤。“管道即代码”可以使用 Jenkinsfile 实现,领域特定语言 (DSL) 用于定义它。
Jenkinsfile 也可以提交到项目的源代码控制存储库。使用 Jenkinsfile,CD 管道也被视为应用程序的一部分,与任何其他代码一样进行版本控制、提交和审查。
Jenkinsfile 的一些主要优点是:
尽管可以在 Web UI 中或使用 Jenkinsfile 定义流水线,但建议在 Jenkinsfile 中定义什么是 Jenkins 流水线,并在源代码控制存储库中进行维护。
要定义什么是 Jenkins 管道,可以使用以下类型的语法编写 Jenkinsfile:
Declarative Pipeline 是 Jenkins Pipeline 的最新功能,它使阅读和编写 Pipeline 代码变得更加容易。与管道的脚本语法不同,声明语法有助于以简单的方式控制管道的不同方面。
脚本化流水线是一种更传统的将 Jenkins 流水线编写为代码的方式。它使用传统的基于 Groovy 的语法。Jenkins 的 Web UI 通常用于在 Jenkinsfile 中编写脚本化管道。
继续介绍什么是 Jenkins 管道,如果您打算使用 Jenkins 管道,这里有一些需要很好理解的基本概念:
管道由一组编写为代码的指令组成。它定义了整个构建过程,理想情况下包括构建、测试和交付应用程序的不同阶段。
Node 是一台机器,它是 Jenkins 环境的一部分。Jenkins 管道在节点块上执行,该节点块通常是脚本化管道语法的一部分。
Jenkins 管道中的阶段由一个独特的任务子集组成,例如构建、测试、部署等。许多插件使用阶段块来提供 Jenkins 状态(和进度)的可视化。
Step 是一个单一的任务,它告诉 Jenkins 到底需要做什么。例如设置环境变量可以一步完成,执行构建命令也可以一步完成。总的来说,一个 Jenkins Pipeline 由一系列步骤组成。
Jenkins Pipeline 有助于在 Jenkins 上添加一套丰富的自动化工具。因此,Jenkins 可用于简单的持续集成以及全面的 CD 管道。
这些是使用 Jenkins 管道的一些主要原因:
这是声明式管道的一个简单示例-
pipeline {
agent any
stages {
stage('Build') {
steps {
}
}
stage('Test') {
steps {
}
}
stage('Deploy') {
steps {
}
}
}
}
流水线块定义了通过定义的流水线完成的工作。下面列出了该管道的一些基本细节:
我们没有介绍脚本化管道,因为它超出了本博客的范围。在什么是 Jenkins 博客的后面部分,我们将演示 Declarative Pipeline 在 Maven 项目中的用法。
执行
TestNG 测试框架用于执行[Selenium 测试自动化]
package org.selenium4;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import java.util.Map;
import java.util.*;
import io.github.bonigarcia.wdm.WebDriverManager;
public class CrossBrowserTest {
protected static ChromeDriver driver;
String URL = "https://lambdatest.github.io/sample-todo-app/";
@BeforeClass
public void testSetUp() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
@Test
public void test_Selenium4_ToDoApp() throws InterruptedException {
driver.navigate().to(URL);
driver.manage().window().maximize();
try {
/* Let's mark done first two items in the list. */
driver.findElement(By.name("li1")).click();
driver.findElement(By.name("li2")).click();
/* Let's add an item in the list. */
driver.findElement(By.id("sampletodotext")).sendKeys("Happy Testing at LambdaTest");
driver.findElement(By.id("addbutton")).click();
/* Let's check that the item we added is added in the list. */
String enteredText = driver.findElement(By.xpath("/html/body/div/div/div/ul/li[6]/span")).getText();
if (enteredText.equals("Happy Testing at LambdaTest")) {
System.out.println("Demonstration of Jenkins is complete");
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
@AfterClass
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
}
4.0.0
org.example
org.selenium4.SeleniumGrid4
1.0-SNAPSHOT
UTF-8
org.testng
testng
6.9.10
test
org.seleniumhq.selenium
selenium-java
4.0.0-alpha-6
org.testng
testng
6.8.8
org.seleniumhq.selenium
selenium-chrome-driver
4.0.0-alpha-6
io.github.bonigarcia
webdrivermanager
RELEASE
test
org.slf4j
slf4j-nop
1.7.28
test
maven-compiler-plugin
3.0
1.8
org.apache.maven.plugins
maven-surefire-plugin
2.12.4
我们已经使用 IntelliJ 进行开发。您可以使用 Eclipse 或任何首选的 IDE 进行开发。
代码检查
@BeforeClass 注释下的实现设置了 Chrome 浏览器的浏览器功能。
@BeforeClass
public void testSetUp() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
测试用例test_Selenium4_ToDoApp()是在[@test] 注解下实现的。find_element_by_name()、driver.find_element_by_id() 等 Selenium 方法用于定位需要执行操作的 Web 元素。click()、sendKeys() 等 Selenium 命令应用于必要的 Web 元素。
@Test
public void test_Selenium4_ToDoApp() throws InterruptedException {
driver.navigate().to(URL);
driver.manage().window().maximize();
try {
...............
...............
}
执行以下步骤来设置项目:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7aENjage-1685347396117)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/38db6149da714d06a9add480825cb9b2~tplv-k3u1fbpfcp-zoom-1.image)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-puS4n15Y-1685347396118)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/841b83f7c610448cb0a06a4e17c94afa~tplv-k3u1fbpfcp-zoom-1.image)]
导航到标题为“全局属性”的配置项并添加以下环境变量:
在我们的例子中,条目如下:
单击应用并保存。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZEwxrGcq-1685347396118)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ac5d05edde0f4b7a9d3a27031d6fab05~tplv-k3u1fbpfcp-zoom-1.image)]
在系统配置部分添加这些环境变量使设置公开(即它可以在 Jenkins 的不同作业中使用)。
有了这个,我们就可以开始编写我们的第一个声明式管道了!
在名为“Jenkins Declarative Pipeline Demonstration”的项目中,单击 Configure。在项目配置窗口中,单击管道选项卡。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bc7Pi0VQ-1685347396119)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4897cb44fb674ce7ba000d03f3038c05~tplv-k3u1fbpfcp-zoom-1.image)]
在管道“定义”下,选择管道脚本。将以下 Jenkinsfile 的内容粘贴到脚本框中。单击应用并保存。
pipeline {
agent any
tools {
maven 'MAVEN_3.6.3'
jdk 'JDK_1.8.0_251'
}
stages {
stage('Build') {
environment {
PROJECT_DIR = "C:\Users\Lenovo\IdeaProjects\CrossBrowserTest"
}
steps {
echo 'maven clean'
bat ' mvn -f %PROJECT_DIR%\pom.xml clean install'
}
}
}
post {
success {
echo 'Now Archiving'
junit allowEmptyResults: true, testResults: '**/surefire-reports/*.xml'
}
}
}
pipeline {
agent any
tools {
maven 'MAVEN_3.6.3'
jdk 'JDK_1.8.0_251'
}
在我的机器上,安装了 JDK 版本 1.8.0_251 和 Maven 版本 3.6.3。因此,在 tools 指令下添加了分别指向 Maven 和 JDK 版本的别名 maven 和 jdk。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7HGZ3wbU-1685347396119)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e2188859a3c14590a6d0c5e4c6d62572~tplv-k3u1fbpfcp-zoom-1.image)]
stage('Build') {
environment {
PROJECT_DIR = "C:\Users\Lenovo\IdeaProjects\CrossBrowserTest"
}
steps {
echo 'maven clean'
//ABC indicates the folder name where the pom.xml file resides
bat ' mvn -f %PROJECT_DIR%\pom.xml clean install'
}
post {
success {
echo 'Now Archiving'
junit allowEmptyResults: true, testResults: '**/surefire-reports/*.xml'
}
}
}
将流水线添加到 Jenkinsfile 后,单击“打开蓝海”链接运行作业。或者,您也可以通过单击“立即构建”选项来发布构建,在这种情况下您无需安装 Blue Ocean 插件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rmeTBLAr-1685347396120)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c417ea46d74744ceb1bfbf2a9a60b48c~tplv-k3u1fbpfcp-zoom-1.image)]
单击“运行”以运行该作业。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lhV5xZy-1685347396120)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e1cf131ddb79473cbe93a8eda5da7845~tplv-k3u1fbpfcp-zoom-1.image)]
如下图,工具(即JDK和Maven)配置成功。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUyynLDZ-1685347396121)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7b6ad67cfebe44d9bbb9095a8ad09879~tplv-k3u1fbpfcp-zoom-1.image)]
步骤“构建”和构建后操作运行没有任何问题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ULESYEtZ-1685347396121)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6c71ff39bdba45129cbee4d9c330dcaf~tplv-k3u1fbpfcp-zoom-1.image)]
这是当前 Jenkins 流水线的 Stage View。声明性工具安装阶段在 2 秒内完成,构建阶段用时 3 分 25 秒。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9zcDEbmZ-1685347396121)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b8b09fe62b9e43e088cde68613421800~tplv-k3u1fbpfcp-zoom-1.image)]
您可以将鼠标悬停在任何阶段并查看该特定阶段的日志。如控制台输出所示,测试场景已成功执行,其中实例化了 Chrome WebDriver 并在被测网页上执行了所需的操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k2V3HvpX-1685347396122)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9266b466b04b4417bcee6d1db1a905bb~tplv-k3u1fbpfcp-zoom-1.image)]
控制台日志如下:
[INFO] --- maven-compiler-plugin:3.0:testCompile (default-testCompile) @ org.selenium4.CrossBrowserTest ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\Users\Lenovo\IdeaProjects\CrossBrowserTest\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ org.selenium4.CrossBrowserTest ---
[INFO] Surefire report directory: C:\Users\Lenovo\IdeaProjects\CrossBrowserTest\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.selenium4.CrossBrowserTest
Configuring TestNG with: org.apache.maven.surefire.testng.conf.TestNG652Configurator@299a06ac
Starting ChromeDriver 84.0.4147.30 (48b3e868b4cc0aa7e8149519690b6f6949e110a8-refs/branch-heads/4147@{#310}) on port 45010
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
[1595945821.200][WARNING]: Timed out connecting to Chrome, retrying...
Jul 28, 2020 7:47:03 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
Demonstration of Jenkins is complete
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 93.655 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
执行以下步骤来设置 Maven 项目:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NXdWCHp3-1685347396122)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e0c45b9de0e7454db1872a420f3b3169~tplv-k3u1fbpfcp-zoom-1.image)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nJcAo1wM-1685347396122)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1fa9076c25f74cfb9b3c8aaf987c19cf~tplv-k3u1fbpfcp-zoom-1.image)]
Post build,如果需要测试报告,可以在Post Steps选项卡中添加相关的‘Add post-build step’。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05uKaqWp-1685347396123)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7847d6cc60254421abe399aa4b286b93~tplv-k3u1fbpfcp-zoom-1.image)]
如控制台日志中所示,测试已成功执行。
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ org.selenium4.CrossBrowserTest ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Users\Lenovo\IdeaProjects\CrossBrowserTest\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.0:testCompile (default-testCompile) @ org.selenium4.CrossBrowserTest ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\Users\Lenovo\IdeaProjects\CrossBrowserTest\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ org.selenium4.CrossBrowserTest ---
[INFO] Surefire report directory: C:\Users\Lenovo\IdeaProjects\CrossBrowserTest\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.selenium4.CrossBrowserTest
Configuring TestNG with: org.apache.maven.surefire.testng.conf.TestNG652Configurator@299a06ac
Starting ChromeDriver 84.0.4147.30 (48b3e868b4cc0aa7e8149519690b6f6949e110a8-refs/branch-heads/4147@{#310}) on port 39047
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
[1595948996.334][WARNING]: Timed out connecting to Chrome, retrying...
[1595949004.487][WARNING]: Timed out connecting to Chrome, retrying...
Jul 28, 2020 8:40:15 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
Demonstration of Jenkins is complete
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 94.51 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0