对本教程来说,您需要:
在本教程中,您将使用来自“jenkinsci/blueocean”Docker镜像的Docker容器来运行Jenkins。
要在Docker中运行Jenkins,请遵循下文对应的对macOS和Linux或Windows系统的讲解。
您可以在安装Jenkins上的Docekr和在Docker中下载及运行Jenkins小节获取更多信息。
jenkinsci/blueocean
镜像(该命令会在您本机没有下载该镜像时自动下载镜像):docker run \
--rm \
-u root \
-p 8080:8080 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \ <1>
-v "$HOME":/home \ <2>
jenkinsci/blueocean
<1> 映射容器中的/var/jenkins_home
目录到名为jenkins-data
的Docker数据卷。如果该数据卷不存在,docker run
命令会自动帮您创建。
<2> 映射宿主(例如您的本地)机器的$HOME
目录(通常为/Users/<用户名>
目录)至容器的/home
目录。
注意: 如果上述命令片段复制粘贴过去无法工作,尝试复制粘贴下文不包含标注的版本:
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
jenkinsci/blueocean
镜像(该命令会在您本机没有下载该镜像时自动下载镜像):docker run ^
--rm ^
-u root ^
-p 8080:8080 ^
-v jenkins-data:/var/jenkins_home ^
-v /var/run/docker.sock:/var/run/docker.sock ^
-v "%HOMEPATH%":/home ^
jenkinsci/blueocean
有关这些参数的解释,请参照上文《macOS和Linux》的内容。
如果您有Docker的使用经验,并且想要通过终端/命令提示符使用docker exec命令访问Jenkins/Blue Ocean容器,那么您可以添加--name jenkins-tutorials
(在上文docker run命令那里)选项,它会将您的容器命名为“jenkins-tutorials”。
这意味着您可以通过docker exec
命令(通过另一个终端/命令提示符窗口)访问Jenkins/Blue Ocean容器,就像这样:
docker exec -it jenkins-tutorials bash
在访问Jenkins之前,您需要做一些很快的“一次性”步骤。
当您首次访问一个新的Jenkins实例时,您需要使用一段自动生成的密码来将其解锁。
http://localhost:8080
并等待解锁Jenkins页面出现。在解锁了Jenkins之后,就会出现自定义Jenkins页面。
在该页面,点击安装推荐的插件。
安装向导会显示Jenkins的配置进度,以及正在安装的插件。该环节将持续数分钟。
最后,Jenkins会让您创建您的首个管理员用户。
在本教程的剩余部分,您可以通过在之前执行docker run …
命令的终端或命令提示符窗口键入Ctrl-C
来停止Jenkins/Blue Ocean Docker容器。
要重启Jenkins/Blue Ocean Docker容器:
docker run …
命令。jenkinsci/blueocean
Docker镜像。http://localhost:8080
。从GitHub上获取示例“Hello World!”Java应用,将源码派生至您个人的GitHub账户并在本地克隆该派生。
simple-java-maven-app
派生至您个人GitHub账户。如果这一步您需要帮助,请参考GitHub网站上的派生一个仓库来获取更多信息。
代表您在操作系统中的用户名):/Users//Documents/GitHub/simple-java-maven-app
/home//GitHub/simple-java-maven-app
C:\Users\\Documents\GitHub\simple-java-maven-app
cd
至如下目录:
/Users//Documents/GitHub/
home//GitHub/
C:\Users\\Documents\GitHub\
(不过使用Git bash命令行窗口时是强力反对使用传统微软命令提示符的)git clone https://github.com/YOUR-GITHUB-ACCOUNT-NAME/simple-java-maven-app
YOUR-GITHUB-ACCOUNT-NAME
即您在GitHub上的账户名。simple-java-maven-app
)。Jenkinsfile
,并签入本地克隆的Git仓库内。现在您就可以创建管线以在Jenkins里基于Maven自动化构建Java应用了。 管线应该以Jenkinsfile
文件的形式创建,它可以被提交到您本地克隆的Git仓库(simple-java-maven-app
)里。
将持续交付管线代码和视为应用其他受版控和复查的代码一样的一部分是“代码式管线”的基础。更多关于管线和Jenkinsfile是什么的内容位于用户手册的管线和使用Jenkinsfile小节。
首先,创建一个初始化管线下载Maven Docker镜像并将其以容器的形式运行(将会在里边构建您的Java应用)。同时给添加一个“Build(构建)”阶段以启动整个流程的编排。
simple-java-maven-app
Git仓库根目录新建一个名为Jenkinsfile
的文件。Jenkinsfile
文件(注意删除尖括号数字标记):pipeline {
agent {
docker {
image 'maven:3-alpine' <1>
args '-v /root/.m2:/root/.m2' <2>
}
}
stages {
stage('Build') { <3>
steps {
sh 'mvn -B -DskipTests clean package' <4>
}
}
}
}
<1> image
参数(在agent部分的docker
参数里)会下载maven:3-apline Docker镜像(如果您本地没有下载过)并将该镜像作为独立容器。这意味着:
· 您的Jenkins和Maven容器会分别运行在本地Docker里。
· Jenkins会使用Maven容器作为agent执行管线项目。然而,该容器是短存活的,它的生命周期仅限您的管线的执行期间。
<2> args
参数在段村扩Maven Docker容器和Docker宿主机文件系统的/root/.m2
(Maven仓库)文件夹间建立了对等映射。解释该作用域的细节超出了本教程的范围。不过,这样做的主要原因是确保编译您的Java应用所需要的包依赖(Maven会在管线执行时下载)在Maven容器的生命周期结束后仍然存留。在反复执行Jenkins管线时,Maven就不需要冲虚下载相同的包了。注意和上文创建的jenkins-data
Docker数据卷不同,Docker宿主机文件系统会在Docker每次重启时清空。这意味着您将会在Docker每次重启时丢失已下载的Maven仓库包。
<3> 定义一个名为Build
的stage(阶段)(指令),会显示在Jenkins UI上。
<4> 该sh
步骤(位于steps作用域)先清理后构建您的Java应用(不执行测试)。
Jenkinsfile
并将其提交到本地Git仓库。例如,在simple-java-maven-app
目录下,执行如下命令:git add .
之后
git commit -m "Add initial Jenkinsfile"
simple-java-maven-app
进行拷贝后:Build
阶段(定义在Jenkinsfile
里)。此时,Maven会下载构建所需依赖包,并最终存放于Jenkins的本地Maven仓库里(在Docker宿主机文件系统中)。Jenkinsfile
。Jenkinsfile
的Build
阶段下: stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
故现在文件结果应是:
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') { <1>
steps {
sh 'mvn test' <2>
}
post {
always {
junit 'target/surefire-reports/*.xml' <3>
}
}
}
}
}
<1> 定义一个名为Test
的阶段(指令)。
<2> sh
步骤通过执行Maven命令运行单元测试。该命令同时会生成JUnit XML报告,保存于target/surefire-reports
目录(在Jenkins容器的/var/jenkins_home/workspace/simple-java-maven-app
目录下)。
<3> junit步骤(由JUnit插件提供)保存JUnit XML报告(由mvn test
命令产生)并将结果暴露给Jenkins接口。在Blue Ocean里,该结果可以通过管线运行的**Tests(测试)**页访问到。post作用域的always
会确保Test
阶段执行完毕后不理会阶段的结果,总是执行其包含的junit
步骤。
Jenkinsfile
并将其提交到本地仓库。git stage.
git commit -m "添加 'Test' 步骤"
Jenkinsfile
。Jenkinsfile
的Test
步骤下: stage('Deliver') {
steps {
sh './jenkins/scripts/deliver.sh'
}
}
此时文件最终结果应是:
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('Deliver') { <1>
steps {
sh './jenkins/scripts/deliver.sh' <2>
}
}
}
}
<1> 定义一个名为Delivar
的新阶段。
<2> sh
步骤执行位于仓库根目录下,jenkins/scripts
目录下的deliver.sh
shell脚本。该脚本的行为说明请参考脚本内容自身。通常原则上,保持管线代码(如Jenkinsfile
)尽可能地简单并将复杂的构建步骤(特别是包含两步或更多步骤的)放入独立的shell脚本文件如deliver.sh
文件里是一个好主意。最终这会使您的管线代码易于维护,特别是在管线变得越来越复杂的时候。
Jenkinsfile
并提交至本地Git仓库。git stage .
git commit -m "添加 Deliver' 阶段"
很好!您刚刚已经使用Jenkins基于Maven构建了一个简单的Java应用!
您在上面创建的“Build”、“Test”和“Deliver”步骤都是在Jenkins中基于Maven构建使用了更多技术栈的更加复杂的Java应用的基础。
由于Jenkins是极度可扩展的,它可以通过修改和配置以支持几乎任意的自动化相关部分。
要了解更多关于Jenkins可以做什么,参考: