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

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

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

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

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

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

  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,然后粘贴密码:
2.png

点击 Next 进入下一步:

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

点击 Save and Finish 继续。

点击 Install suggested plugins
4.png

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

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

然后会弹出登陆框:
6.png

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

最后Jenkins就可以使用了。
7.png

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

创建Jenkins作业

让我们在Jenkins中创建一个用来运行流水线的作业。
  1. 在Jenkins重启之后,他会显示一个登陆界面。输入之前创建的用户名和密码。这会把你带回到Installing Plugins/Upgrade页面。点击页面左上角的Jenkins图标,可看到主控制面板:
    8.png
  2. 点击create new job,作业的名字取做docker-jenkins-pipeline,类型选Pipeline
    9.png

    点击OK按钮。
  3. 按照如图所示对流水线进行配置:
    10.png

    这里我们使用了本地的仓库。你当然也可以选择托管在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。
11.png

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

看起来一切正常。

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

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

相关文章
|
16天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
20天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
32 1
|
25天前
|
jenkins 测试技术 持续交付
Docker最佳实践:构建高效的CI/CD流水线
【10月更文挑战第17天】在现代软件开发实践中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为提高开发效率和软件质量的重要手段。Docker作为一种容器技术,为构建一致且隔离的开发环境提供了强有力的支撑。本文将探讨如何利用Docker来优化CI/CD流程,包括构建环境的标准化、镜像管理以及与CI/CD工具(如Jenkins、GitLab CI)的集成。
47 5
|
24天前
|
监控 jenkins 持续交付
Docker和Jenkins有什么不同
【10月更文挑战第18天】Docker和Jenkins有什么不同
|
1月前
|
Java jenkins 持续交付
Centos7下docker的jenkins下载并配置jdk与maven
通过上述步骤,您将成功在CentOS 7上的Docker容器中部署了Jenkins,并配置好了JDK与Maven,为持续集成和自动化构建打下了坚实基础。
97 1
|
1月前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。
|
1月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
38 4
|
1月前
|
jenkins Java 持续交付
Docker搭建jenkins环境
这篇文章详细介绍了如何利用Docker搭建Jenkins环境,包括拉取Jenkins镜像、配置端口映射及初始化设置的步骤。
130 0
Docker搭建jenkins环境
|
1月前
|
jenkins Java 持续交付
Jenkins打包,发布,部署
Jenkins打包,发布,部署
200 0
|
1月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
73 0