部署流水线搭建小记:Docker、Jenkins、Java和Couchbase

本文讲的是部署流水线搭建小记:Docker、Jenkins、Java和Couchbase【编者的话】这篇文章讲述了如何用Jenkins和Docker来为一个需要和数据库交互的Java应用创建部署流水线(deployment pipeline)。

Jenkins支持创建流水线。它使用一种基于Groovy的流水线领域特定语言(Pipeline DSL)的简单脚。

而这些脚本,通常名字叫Jenkinsfile。它定义了一些根据指定参数执行简单或复杂的任务的步骤。流水线创建好后,可以用来构建代码,或者编排从代码提交到交付过程中所需的工作。

流水线包括步骤(Step),节点(Node)和阶段(Stage)。流水线执行在节点上。节点是Jenkins安装的一部分。流水线通常包含多个阶段。一个阶段包含多个步骤。流水线上手指南可以查看到更多的内容。

对于我们本文中的应用,其基本的部署流程是这样的:

  1. 开发者更新工作区
  2. Jenkins收到通知
  3. Jenkins克隆工作区
  4. Jenkins创建一个Docker镜像
  5. Jenkins运行测试
  6. Jenkins将镜像推到Docker Hub

应用的完整代码放在了GitHub仓库上。

应用位于仓库中的webapp目录。应用会借助Couchbase的Java SDK,使用一个到Couchbase数据库的连接,保存一个简单的JSON文档。应用同时包含一个测试,以验证数据库是否包含持久化的文档。

特别感谢@alexsotob在Jenkins配置上对我的帮助。

让我们开始吧!

下载并安装Jenkins

jenkins.io下载Jenkins。这里使用的是Jenkins 2.21。

先把Jenkins启动起来:

JENKINS_HOME=~/.jenkins java -jar ~/Downloads/jenkins-2.21.war --httpPort=9090

这条命令指定了Jenkin家目录的路径。家目录下面存放了所有的配置信息。同时指定了Jenkins的监听端口。这里指定的是9090端口。

启动Jenkins会在中终端中看到如下消息:

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

(译文:Jenkins需要初始化的设置。我们已经为你创建好了一个管理员用户生成好了密码。请使用下面密码继续安装。)

3521fbc3d40448efa8942f8e464b2dd9

This may also be found at: /Users/arungupta/.jenkins/secrets/initialAdminPassword

(译文:这个密码的内容同时也可以在`/Users/arungupta/.jenkins/secrets/initialAdminPassword`中找到。) 

复制一下终端中显示的密码,这个密码会用来解锁Jenkins。

在浏览器中输入localhost:9090访问Jenkins,然后粘贴密码:

点击Next进入下一步:

创建第一个如图所示的管理员用户:

点击Save and Finish继续。

点击Install suggested plugins

然后就会安装好一批默认的插件:

(很奇怪Ant和Subversion是默认的插件。)

然后会弹出登陆框:

输入之前创建好的用户名和密码。

最后Jenkins就可以使用了。

不得不说,要安装好一个简单的Jenkins所需要的步骤不少。真的有必要需要这么多步骤才能开始使用Jenkins吗?能不能有一个更简单,更傻瓜,更偷懒的方式来开始使用Jenkins呢?希望能遵守管理优先原则(Convention-over-Configuration)然后提供一个预先配置好的一键安装包。

创建Jenkins作业

让我们在Jenkins中创建一个用来运行流水线的作业。

  1. 在Jenkins重启之后,他会显示一个登陆界面。输入之前创建的用户名和密码。这会把你带回到Installing Plugins/Upgrade页面。点击页面左上角的Jenkins图标,可看到主控制面板:

  2. 点击create new job,作业的名字取做docker-jenkins-pipeline,类型选Pipeline

    点击OK按钮。

  3. 按照如图所示对流水线进行配置:

    这里我们使用了本地的仓库。你当然也可以选择托管在Github上的仓库。另外,这个仓库可以配置一个git钩子或者定时的轮询器来触发流水线的运行。点击Save按钮来保存配置。

让Jenkins进行构建

在启动这个作业之前,Couchbase数据库需要显式地进行启动:

docker run -d --name db -p 8091-8093:8091-8093 -p 11210:11210 arungupta/oreilly-couchbase:latest

这个问题会在编号9的问题修复之后得以解决。确保你可以使用用户名Administrator和密码password,通过 http://localhost:8091 来访问Couchbase。点击Data Bucket标签页可以看到创建的名为books的Bucket。

点击Build Now你应该看见下图类似的输出:

看起来一切正常。

让我们来试着理解下背后发生了什么。

Jenkinsfile描述了流水线是如何构建的。从整体看它有四个阶段 - 打包、创建Docker镜像、运行应用和运行测试。每一个阶段在Jenkins的控制面板都是以一个方框显示的。每一个阶段花费的总体时间显示在每一个方框中间。

然后我们试着理解每一个阶段都做了什么事情。

打包:应用的的源码位于webapp目录下。而这一条Maven命令:

mvn clean package -DskipTests

用来创建应用的JAR包。注意Maven项目也包含测试,但是这里被故意通过-DskipTests忽略了。

通常,测试会分开放在一个下游的项目中。Maven项目创建一个应用的Fat JAR(译者注:Fat JAR是把项目所有类文件、资源文件和依赖打包在一起的JAR)文件并且包含所有的依赖。

创建Docker镜像:应用的Docker镜像是使用webapp目录下的Dockerfile来构建的。这个镜像仅仅包含一个Fat JAR,可以通过java -jar来运行。

每一个镜像都使用构建编号打上了标签:

${env.BUILD_NUMBER} 

运行应用:运行应用需要运行应用的Docker容器。数据库容器的IP地址可以通过下面这条命令来查到:

docker inspect

数据库容器和应用容器同时运行在默认的bridge网络中。这可以让两个容器来互相沟通。也可以在swarm模式的集群中运行流水线,这需要创建并且使用覆盖网络。

运行测试:测试可以使用如下命令来进行:

mvn test

如果测试通过,镜像会被推送到Docker Hub。不管测试是否成功,运行结构都能捕获到。同时我们显示了try/catch/finally块在Jenkinsfile中的使用。如果测试通过了,那镜像就会推送到Docker Hub中。在我们这个例子中,它被推送到了这里

待办事项

  • 把测试移到一个下游的项目中(#7
  • 使用Git钩子或者轮询来触发流水线(#8
  • 自动化数据库的启动与停止(#9
  • 用Swarm模式下的Docker引擎集群来运行流水线(#10
  • 增加额外的配置来将镜像推送到bintray(#11
  • 另外一个痛点找不到关于全局变量语法的文档。只有在<JENKINS-HOST>:<JENKINS-PORT>/job/docker-jenkins-pipeline/pipeline-syntax/globals能找到相关内容。这一点点戳。
  • 不是不可能,只是还没有实现” #sadpanda

原文链接:Deployment Pipeline Using Docker, Jenkins, Java, and Couchbase(翻译:钟最龙)

原文发布时间为:2016-10-08

本文作者:钟最龙

本文来自合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:部署流水线搭建小记:Docker、Jenkins、Java和Couchbase

时间: 2024-08-14 14:59:45

部署流水线搭建小记:Docker、Jenkins、Java和Couchbase的相关文章

持续集成案例学习:Docker、Java与Maven

本文讲的是持续集成案例学习:Docker.Java与Maven,[编者的话]对于使用Java技术栈的企业,Maven往往是其持续集成的核心工具,在当前的Docker化的运动中,要如何把Docker镜像的构建也加入到传统的Maven构建为基础的持续集成流程中呢?Alooma公司在本文中分享了他们使用Maven对Docker镜像构建进行持续集成的经验. 在Alooma,我们非常非常非常喜爱Docker.真的, 我们想完全容器化我们的应用. 虽然容器化应用有非常多的好处,但在这里,我并不是要说服你用D

搭建基于Docker的PHP开发环境的详细教程

  这篇文章主要介绍了搭建基于Docker的PHP开发环境的详细教程,Docker是当下虚拟机技术的最佳选择,需要的朋友可以参考下 现在很多开发者都使用Vagrant来管理他们的虚拟机开发环境,Vagrant确实很酷, 不过也有不少缺点(最主要的是它占用太多的资源).在容器技术.Docker和更多类Docker技术出现后,解决这个问题就变得简单了. 免责声明 由于boot2docker的工作方式,本文所述的方法在你的环境中可能无法正常运行.如果需要在非Linux环境下共享文件夹到Docker容器

搭建基于Docker的PHP开发环境的详细教程_php技巧

现在很多开发者都使用Vagrant来管理他们的虚拟机开发环境,Vagrant确实很酷, 不过也有不少缺点(最主要的是它占用太多的资源).在容器技术.Docker和更多类Docker技术出现后,解决这个问题就变得简单了.免责声明 由于boot2docker的工作方式,本文所述的方法在你的环境中可能无法正常运行.如果需要在非Linux环境下共享文件夹到Docker容器,还需要注意更多额外的细节.后续我会写篇文章专门来介绍实际遇到的问题.怎样才算是好的开发环境 首先,我们得知道什么才是好的开发环境,

配置-关于在Azure搭建一个完整的Java web项目的步骤并和azure各种服务集成

问题描述 关于在Azure搭建一个完整的Java web项目的步骤并和azure各种服务集成 如何把java web项目和azure提供的服务进行集成,有哪些配置?能不能提供教程 解决方案 最简单的当然是使用虚拟机服务,使用一个你熟悉的操作系统,比如ubuntu server.cent os或者windows server,然后用ssh.ps或者remote desktop登录进去.你原先怎么部署,现在还是怎么部署,一点都没有变化. 解决方案二: HiAzur官网提供了一些关于java开发的文档

Docker Swarm入门:如何搭建原生态Docker集群

本文讲的是Docker Swarm入门:如何搭建原生态Docker集群[编者的话]我们已花大量时间研究Docker及亚马逊的弹性云计算(EC2)容器服务(ECS)组建Docker容器集群的解决方案.而本文将重点阐述通过Docker Swarm搭建原生态Docker集群的方法. Docker Swarm介绍 Docker Swarm是Docker原生态的集群技术.他可同Docker或者Docker-Machine的命令行行工具配合,提供在主机集群上部署容器引擎的基本功能.Docker Swarm同

基于OSS搭建私有 Docker Registry

基于OSS搭建私有 Docker Registry Docker Registry 作为 Docker 的核心组件之一负责了镜像的存储以及分发.用户只需要使用 Docker 的客户端就可以直接和 Registry 进行交互,下载和上传镜像.最初版本的 Registry 由 Python 实现.由于设计初期在安全性,性能以及 API 的设计上有着诸多的缺陷,该版本在 0.9 之后停止了开发.新的项目由 Go 语言开发,所有的API,底层存储方式,系统架构都进行了全面的重新设计已解决上一代 Regi

docker 的java编译环境构建详细介绍_docker

用Dockerfile 构建一个java的编译环境,这里整理下实现步骤: 1.包括以下软件包 ubuntu jdk maven svn 2.jdk.maven 需要手动下载,下载之后分别为 jdk-8u51-linux-x64.gz apache-maven-3.3.3-bin.tar.gz 3.创建一个Dockerfile文件,包含以下内容 FROM ubuntu RUN apt-get update RUN apt-get -y install subversion ADD jdk-8u51

采用struts2+hiberbate方式搭建的服务器段java文件应该放到tomcat服务器的哪个目录

问题描述 采用struts2+hiberbate方式搭建的服务器段java文件应该放到tomcat服务器的哪个目录 采用struts2+hiberbate方式搭建的服务器段java文件应该放到tomcat服务器的哪个目录 解决方案 基本和你开发时的目录是一样的,你可以在网上查查,一般推荐的目录层次 解决方案二: 是说程序部署的目录吗.webapps

最新源码包通过脚本部署LAMP搭建Discuz论坛

LAMP是一个缩写,它指一组通常一起使用来运行动态网站或者服务器的自由软件:Linux+Apache+MySQL+php,自从Nginx的出现,Apache的一部分市场份额被Nginx获得,原因是由于Apache的高并发性能不及Nginx.前不久Apache团队发布了httpd的2.4版本,性能上做了非常大的提升,为的就是挽回失去的市场份额,当然2.4版本刚刚出来不久,需要1-2年的时间才能够流通.本实验就是通过安装2.4版本,mysql用的是mysql-5.5版本进行安装部署的.接着我们开始进