本篇博客介绍如何使用Jenkins编排并构建一个使用Maven管理的简单Java应用程序。该应用包含若干单元测试,用于检查main方法。 测试结果保存在JUnit XML报告中。了解Jenkins详细介绍,点击查看Jenkins官方文档
Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
Jenkins通常作为一个独立的应用程序在其自己的流程中运行, 内置Java servlet 容器/应用程序服务器(Jetty)。
配置要求:
软件配置:Java 8—无论是Java运行时环境(JRE)还是Java开发工具包(JDK)都可以。
安装软件:使用Linux下安装的Docker容器(因为这可以在任何支持的操作系统macOS,Linux和Windows或云服务上运行Docker镜像)
1.打开终端窗口
2.下载 jenkinsci/blueocean
镜像并使用以下docker run 命令将其作为Docker中的容器运行 :
注意:jenkinsci/blueocean image 镜像 捆绑了所有Blue Ocean插件和功能,每次发布Blue Ocean新版本时,都会发布新镜像。
docker run \
--rm \
-u root \
-p 8080:8080 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$HOME":/home \
jenkinsci/blueocean
命令说明:
--rm
(可选) jenkinsci/blueocean 关闭时自动删除Docker容器。如果您需要退出Jenkins,这可以保持整洁。
-d
(可选)jenkinsci/blueocean 在后台运行容器(即“分离”模式)并输出容器ID。如果您不指定此选项, 则在终端窗口中输出正在运行的此容器的Docker日志。
-p 49000:8080
映射,第一个数字代表主机上的端口,第二个代表容器的端口。您将通过端口49000访问主机上的Jenkins。
-p 50000:50000
(可选)将 jenkinsci/blueocean 容器的端口50000 映射到主机上的端口50000
-v jenkins-data:/var/jenkins_home
(可选,但强烈建议)映射在容器中的/var/jenkins_home
目录到具有名字 jenkins-data 的volume。 如果这个卷不存在,那么这个 docker run 命令会自动为你创建卷。 如果您希望每次重新启动Jenkins(通过此 docker run … 命令)时保持Jenkins状态,则此选项是必需的 。 如果你没有指定这个选项,那么在每次重新启动后,Jenkins将有效地重置为新的实例。
-v /var/run/docker.sock:/var/run/docker.sock
(可选/var/run/docker.sock
表示Docker守护程序通过其监听的基于Unix的套接字。 该映射允许 jenkinsci/blueocean 容器与Docker守护进程通信, 如果 jenkinsci/blueocean 容器需要实例化其他Docker容器,则该守护进程是必需的。 如果运行声明式管道,其语法包含agent部分用 docker
-v "$HOME":/home
将主机上的$HOME
目录 (即你的本地)映射到 (通常是 /Users/ 目录) 到容器的 /home 目录。
如果你希望或需要使用 docker exec 命令通过一个终端/命令提示符来访问 Jenkins/Blue Ocean Docker 容器,
你可以添加如 --name jenkins-tutorials
选项(与上面的 docker run ), 这将会给Jenkins/Blue Ocean Docker容器一个名字 “jenkins-tutorials”。
这意味着你可以通过 docker exec
命令访问Jenkins/Blue Ocean 容器(通过一个单独的终端 /命令提示窗口) ,
例如: docker exec -it jenkins-tutorials bash
停止:在终端/命令提示窗口输入 Ctrl-C
停止 Jenkins/Blue Ocean Docker 容器,
重启:运行相同的 docker run ...
命令
配置要求:
安装软件:Git和GitHub Desktop.
通过将应用程序源代码所在的示例仓库fork到你自己的Github账号中, 并clone到本地
例如 simple-java-maven-app
)。例如 一个演示如何使用Jenkins构建Maven管理的简单Java应用程序的入门级流水线。
)/home/GitHub/simple-java-maven-app
首先,创建一个初始流水线来下载Maven Docker镜像,并将其作为Docker容器运行(这将构建你的简单Java应用)。 同时添加一个“构建”阶段到流水线中,用于协调整个过程。
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
stages {
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
}
}
image:下载maven容器,在Docker中与jenkins相互独立运行
args:在暂时部署的Maven Docker容器的 /root/.m2 (即Maven仓库)目录 和Docker主机文件系统的对应目录之间创建了一个相互映射,防止每次重启Docker,丢失jenkins仓库
stage(‘Build’):定义一个‘test’stage显示在Jenkins UI上
sh ‘mvn step’:运行Maven命令干净地构建你的Java应用(不运行任何tests)
jenkins流水线做了如下几个动作
a.将项目排入队列等待在agent上运行。
b.下载Maven Docker镜像,并且将其运行在Docker中的一个容器中
c. 在Maven容器中运行 Build 阶段 (Jenkinsfile 中所定义的)。在这期间,Maven会下载构建你的Java应用所需的工件, 这些工件最终会被保存在Jenkins的本地Maven仓库中(Docker的主机文件系统)。
d.构建成功页面变成绿色
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
stages {
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
}
}
stage(‘Test’):定义一个‘test’stage显示在Jenkins UI上
sh ‘mvn test’:执行Maven命令运行Java应用的单元测试。 生成一个JUnit XML报告
junit :用于归档JUnit XML报告,可以在流水线运行的 Tests 页面获取结果