==============
为了演示Jenkins的使用,下面创建一个自动部署实例。
在这个实例中使用的是一个功能非常简单的项目,项目中只有一个主程序,代码如下所示
@SpringBootApplication@RestController
public class DemoApplication {
public static void main (String[] args){
SpringApplication.run(DemoApplication.class,args) ;
}
@RequestMapping (value = “/”)public String index(){
return "Hello world! ";
}
}
应用启动后,打开首页将输出“Hello World!”。
下面介绍这个自动部署项目的实现过程。
创建任务
在Jenkins首页中单击“新建”选项,打开创建任务页,如图15-9所示。
输入任务名称“demo”,并选择“构建一个*风格的软件项目”选项,单击“确定”按钮,即可创建一个空任务,如图15-10所示。
配置任务
在图15-10中,单击“源码管理”选项,显示如图15-11所示对话框。在图15-11中勾选“Git选项,在代码库的地址栏中输入“demo”项目的存放地址。
因为这是一个公开项目,所以不用设置访问项目的权限。如果是一个私有项目,则必须在图15-11的“Credentials”中配置对项目有存取权限的用户名和密码。
单击图15-11中的“构建触发器”选项,在“构建触发器”对话框中勾选“Poll SCM”选项,配置一个定时任务的日程表,如图15-12所示。
图15-12中的日程表“00 20***”,表示在每天的20:00点整执行任务构建。在本实例中不使用定时任务。
接下来,使用 Maven 配置项目的打包。单击“构建”选项,在“增加构建步骤”下拉列表中选择“Invoke top-level Maven targets”选项,如图15-13所示。
其中,在“Maven Version”中选择前面安装的Maven,在“Goals”中输人如下所示的打包命令:
clean package
配置创建镜像和部署的操作命令,这里会用到Dockerfile和 docker-compose.yml,这两个文件已经包含在项目工程的docker目录中。
Dockerfile 中的内容如下所示:
FROM java:8
VOLUME/tmp
ADDdemo-0.0.1-SNAPSHOT.jar app.jar
RUN bash 一c’touch /app.jar’EXPOSE8080
ENTRYPOINT
,
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
“/app.jar”]
[“java”, “-Djava.security.egd=file:/dev/./urandom”, "-jar
docker-compose.yml中的部署脚本如下所示:
demo:
build:ports:
“8888:8080”
单击“构建”选项,在“增加构建步骤”下拉列表中选择“Execute shell”选项,在“Command"中输入如下所示命令:
cd /Users/Shared/Jenkins/Home/workspace/demo /docker
cp -f …/target/demo-0.0.1-SNAPSHOT .jar
sudo /usr/local/bin/docker-compose down --rmi all
sudo /usr/local/bin/docker-compose up -d
这些命令与我们在主机上直接使用Docker等工具部署应用的命令相同,即先停止正在运行的容器,再删除容器和镜像,最后重新进行部署,如图15-14所示。
执行任务
当手动执行任务时,首先单击任务的名称,返回任务首页。然后在任务首页中单击左侧菜单中的“立即构建”选项即可,如图15-15所示。
在任务执行过程中,会在控制台中输出信息,一个完整的执行过程的输出日志如下所示
Started by user mr.csj
Building in workspace /Users/Shared/Jenkins/Home/workspace/demo>git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
git config remote.origin.url https://gitee.com/chenshaojian/demo.git #timeout=10
Fetching upstream changes from https://gitee.com/chenshaojian/demo.git>git --version # timeout=10
git fetch --tags --progress https://gitee.com/chenshaojian/demo.git+refs/heads/* :refs/remotes/origin/*
git rev-parse refs/remotes/origin/master^ { commit] # timeout=10
git rev-parse refs/remotes/origin/origin/master"{ commit}# timeout=10Checking out Revision 1b0348a999cee3a1920b1b20576b54e58a50ab2
(refs/remotes/origin/master)
git config core.sparsecheckout # timeout=10
git checkout-f 1b0348a999cee3a1920b1b2c576b54e58a50ab2Commit message: “add docker-compose”
git rev-list 8791f0a371ab67a83d1005197744475de5f177df # timeout=10[demo]$/Users/apple/apache-maven-3.5.0/bin/mvn clean package
[INFO]Scanning for projects. . .
[INFO]
[INFO]-------------
[INFO] Building demo 0.0.1-SNAPSHOT[INFO]
[INFO]
[INFO]— maven-clean-plugin:2.6.1:clean (default-clean)& demo —[INFO] Deleting /Users/Shared/Jenkins/Home/workspace/demo/target
[INFO]
[INFO] —maven-resources-plugin:2.6:resources (default-resources)& demo -[INFO] Using ‘UTF-8’ encoding to copy filtered resources.
[INFO]Copying 1 resource
[INEO]Copying 0 resource[INFO]
[INFO] — maven-compiler-plugin:3.1:compile (default-compile) demo —[ INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to
/Users/Shared/Jenkins/Home/workspace/demo/target/classes[INEO]
[INFO] — maven-resources-plugin:2.6:testResources (default-testResources) edemo —
[INFO] Using 'UTF-8’encoding to copy filtered resources.[INFO] skip non existing resourceDirectory
/Users/Shared/Jenkins/Home/workspace/demo/src/test/resources[INFO]
[INFO] — maven-compiler-plugin:3.1:testCompile (default-testCompile)Cdemo
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to
/Users/Shared/Jenkins/Home/workspace/demo/target/test-classes[INEO]
[ INFO] —maven-surefire-plugin:2.20:test (default-test) C demo —[INFO] Tests are skipped.
[INFO]
[INFO] — maven-jar-plugin:2.6:jar (default-jar) demo --[INFO] Building jar:
/Users/Shared/Jenkins/Home/workspace/demo/target/demo-0.0.1-SNAPSHOT.jar[INFO]
[INFO] — spring-boot-maven-plugin:1.5.8.RELEA.SE:repackage (default) demo
[INFO]
[INEO] BUILD SUCCESS[INFO]
[INFO]Total time: 5.095 s
[INFO] Finished at: 2017-10-30T16:18:18+08:00[INFO] Final Memory:29M/182M
[INFO]
[demo]$ /bin/sh -xe/Users/Shared/Jenkins/tmp/jenkins4696633078670494346.sh
+cd /Users/Shared/ Jenkins/Home/workspace/demo/docker+ cp -f …/target/demo-0.0.1-SNAPSHOT.jar .
- sudo /usr/local/bin/docker-compose down --rmi allRemoving image docker_demo
Failed to remove image for service demo:404 Client Error: Not Found (“No suchimage: docker_demo: latest”)
- sudo /usr/local/bin/docker-compose up -dBuilding demo
Step 1/6 : FROM java: 8
—>d23bdf 5b1b1b
Step 2/6:VOLUME /tmp—> Using cache
—>64c36a425bbf
Step 3/6: ADD demo-0.0.1-SNAPSHOT.jar app.jar—>1788813d23d2
step 4/6:RUN bash-c ‘touch /app.jar’—> Running in e4cfd4447b78
—>2c44a754963b
Removing intermediate container e4cfd4447b78Step 5/6 :EXPOSE 8080
—> Running in 95b96954618e—> 8bc53f642637
Removing intermediate container 95b96954618e
Step 6/6:ENTRYPOINT java-Djava.security.egd=file:/dev/./urandom-jar/app.:一–>Running in al92a418f4f1
—>3a27629ceba9
Removing intermediate container a192a4184f1Successfully built 3a27629ceba9
Successfully tagged docker demo: latest
Image for service demo was built because it did not already exist. To rebuithis image you must use `docker-compose build’ or 'docker-compose up --buildCreating docker demo_1…
Creating docker_demo_1-[1A-[2K
Creating docker demo 1 …一[ 32mdone-[Om–[1BFinished:sUCCESS
从控制台的输出日志中可以看到构建已经成功完成。这时,我们可以通过下面的网址打开应用运行的首页:
http://localhost:8888
从中可以看到我们预期的结果,即输出“Hello World!”,如图15-16所示。
在本节的输出日志中,有一个如下所示的错误提示:
- sudo /usr/local /bin/docker-compose down --rmi allRemoving image docker demo
Failed to remove image for service demo:404 Client Error:Not Found (“No suchimage: docker demo: latest”)
出现这个错误提示的原因是在第一次构建时,并不存在可以移除的镜像,但这并不影响整个构建过程的执行。
现在验证一下项目更新的自动化部署效果。首先将项目主程序的输出结果“Hello World ! ”改为“Hello Jerkins! ”,然后提交代码。完成之后,再在Jenkins 中单击“立即构建”选项,构建完成后,刷新访问应用的浏览器,即可看到如图15-17所示的效果。
再次查看控制台的输出日志,现在,移除镜像的命令已经不再显示错误,而是输出了如下所示的结果,表示已经停止了运行的容器,并移除了原来的容器和镜像:
- sudo /usr/local/bin/docker-compose down–rmi all
Stopping docker demo 1 …
-[1A-[2K
Stopping docker demo 1 … -[32mdone-[ Om-[1BRemoving docker demo 1 …
一-[1A[2K
Removing docker demo 1 ….-[32mdone-[ Om一[1BRemoving image docker demo
这里只是一个简单的自动部署的演示,在实际使用中,可以通过定时任务,或结合使用WebHook 的代码提交通知,实现自动部署。另外,还可以通过Selenium、JMeter等工具生成测试脚本,增加自动测试的功能。
小结
==
本章介绍了如何使用自动化构建工具Jenkins 设计持续交付的工作流程,并以一个简单的实例演示了自动部署的实现过程。在该实例中,我们使用Git进行代码拉取、使用 Maven进行程序打包、使用Docker进行镜像的创建和应用的更新与部署。从这个实例中可以看出Jenkins的强大的可扩展性。