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

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

流水线包括步骤(Step),节点(Node)和阶段(Stage)。流水线执行在节点上。节点是Jenkins安装的一部分。流水线通常包含多个阶段。一个阶段包含多个步骤。流水线上手指南(jenkins.io/doc/pipelin…

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

开发者更新工作区

Jenkins收到通知

Jenkins克隆工作区

Jenkins创建一个Docker镜像

Jenkins运行测试

Jenkins将镜像推到Docker Hub

应用位于仓库中的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中创建一个用来运行流水线的作业。

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

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

点击OK按钮。

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

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

让Jenkins进行构建

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

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

复制代码

这个问题会在编号9的问题(github.com/arun-gupta/… http://localhost:8091 来访问Couchbase。点击Data Bucket标签页可以看到创建的名为books的Bucket。

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

看起来一切正常。

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

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

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

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

mvn clean package -DskipTests

复制代码

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

通常,测试会分开放在一个下游的项目中(github.com/arun-gupta/… 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中。在我们这个例子中,它被推送到了这里(hub.docker.com/r/arungupta…

待办事项

把测试移到一个下游的项目中

使用Git钩子或者轮询来触发流水线

自动化数据库的启动与停止

用Swarm模式下的Docker引擎集群来运行流水线

增加额外的配置来将镜像推送到bintray

另外一个痛点找不到关于全局变量语法的文档。只有在:/job/docker-jenkins-pipeline/pipeline-syntax/globals能找到相关内容。这一点点戳。

“不是不可能,只是还没有实现(twitter.com/agentdero/s… #sadpanda

java中搭建流水线,部署流水线搭建小记:Docker、Jenkins、Java 和 Couchbase相关推荐

  1. K8S搭建自动化部署环境(四)Jenkins多分支流水线Blue Ocean的安装和使用

    各位大佬,前文如下: K8S搭建自动化部署环境(一)安装Kubernetes K8S搭建自动化部署环境(二)安装K8S管理工具Kuboard V3 K8S搭建自动化部署环境(三)Jenkins下载.安 ...

  2. K8S搭建自动化部署环境(三)Jenkins下载、安装和启动

    各位大佬,前文如下: K8S搭建自动化部署环境(一)安装Kubernetes K8S搭建自动化部署环境(二)安装K8S管理工具Kuboard V3 一.jenkins 下载 jenkins下载地址:h ...

  3. java中的进制输出转换_Java I/O : Java中的进制详解

    作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...

  4. java中clone方法_Java Object clone()方法– Java中的克隆

    java中clone方法 Cloning is the process of creating a copy of an Object. Java Object class comes with na ...

  5. java中execution的作用_一文初步了解Java虚拟机

    大家都知道,Java中JVM的重要性,学习了JVM你对Java的运行机制.编译过程和如何对Java程序进行调优相信都会有一个很好的认知. 什么是JVM? JVM(Java Virtual Machin ...

  6. Java中需要全部小写的是,下列哪些是Java中常量的命名约定?A、全部为小写字母B、全部为大写字母C、大小写混合D、字与字之间...

    下列哪些是Java中常量的命名约定?A.全部为小写字母B.全部为大写字母C.大小写混合D.字与字之间 更多相关问题 She knew so many men who had been trained ...

  7. java中所有函数都是虚函数_关于Java:虚拟函数与纯虚函数之间的区别是什么?...

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: C++ Virtual/Pure Virtual Explained 虚函数和纯虚函数有什么区别? CPP中的纯虚函数与 ...

  8. java中方法的具体化_我为什么要关心Java没有具体化的泛型?

    问题 这是我最近在一次采访中提出的一个问题,即候选人希望看到添加到Java语言中的问题.它通常被认为是Java没有的痛苦reified generics但是,当被推动时,候选人实际上无法告诉我他在那里 ...

  9. java类似goto_原来java中也有类似goto语句的标签啊--java label标签

    goto语句的危害: goto语句是在源码级上的跳转,这使其招致了不好的声誉.若一个程序总是从一个地方跳到另一个地方,还有什么办法来控制程序的流程. java中的"goto": 虽 ...

最新文章

  1. SAP MM MIGO界面里的'Delivery completed'标记
  2. Java多线程1:进程与线程概述
  3. div背景图 等比缩放
  4. 以太坊钱包1-Android-创建钱包
  5. 【转载】扫盲概念RPA
  6. java类方法不可见_使java方法仅对特定类可见
  7. python调用java方法_python加载和使用java的类的方法
  8. mysql查看锁表与解锁
  9. appium-andriod自动化实现注意项
  10. Stanford CS230深度学习(九)注意力机制和语音识别
  11. UE4蓝图基础04-变量和数组
  12. 安卓原生系统_体验类原生安卓系统PixelExperience流畅得不像话
  13. 什么是可靠性测试,常见的可靠性测试标准有哪些?
  14. 解构华为AI技术布局:构建无所不及的智能
  15. system函数的详细使用
  16. 计算机组成原理——指令系统
  17. 一节计算机课日记,电脑课作文5篇
  18. adm单master节点
  19. 【学习笔记】【C++整理A】【总】单例模式-饿汉式、懒汉式;
  20. 视频采集工具 youtube-dl 接口介绍

热门文章

  1. 关于 Angular 应用 tsconfig.json 中的 lib 属性
  2. 关于 SAP Spartacus 服务器端渲染 SSR 无法使用窗口宽度以进行自适应设计的问题
  3. SAP Spartacus新建org unit之后,排序不正确的问题分析
  4. JavaScript, ABAP和Scala里的尾递归(Tail Recursion)
  5. 使用ABAP操作office Word文档
  6. SAP扫盲系列之二:SAP ABAP应用服务器的组成部分
  7. Fiori elements执行过程解析:When click go in table list, odata service is sent
  8. 纯JavaScript实现的调用设备摄像头并拍照的功能
  9. 使用application log 分析navigation target解析错误
  10. ABAP web service运行时的细节调试