发布于 

浅尝辄止DevOps 001. Jenkins使用入门

Jenkins是用Java编写的一款CI & CD(Continious Integration 持续集成,Continious Delivery 持续交付)工具。简单来说,它提供的功能可以归纳为:软件流程“自动化”。

从“自动化”说起

郑晔老师在《10x 程序员工作法》中,总结了关于高效程序员的四个要素:

  • 以终为始
  • 任务分解
  • 沟通反馈
  • 自动化

“自动化” 的最大作用是:帮助程序员从繁杂重复的工作中解脱出来,也就是”偷懒“。我自己平时就有攒shell脚本的习惯,把平时使用的一些工作脚本收集起来,随时修改复用或者直接使用。这些脚本,算是对人工操作的一个记录,在需要时重放,降低人的负担,同时也能利用上计算机执行过程可重复的优点。

Jenkins是什么?

Jenkins解决的,是软件开发过程流程自动化问题,其中最突出的环节也就是 CI & CD。

CI(持续集成) 和 CD(持续交付) 是 敏捷开发 所提倡的开发方法。我个人把它的观点总结为:

软件开发是一项复杂工程,为了降低项目失败的风险,需要尽早发现软件的问题,并快速解决。

推向极限,就是在代码提交上库过程中随时验证、尽可能缩短从代码“开发态”到“可交付态”的Gap,最终做到代码随时可交付。

CI的应用,举个例子,代码提交到仓库时,需要构建、测试,看看有没有引入Bug,导致程序异常。其实这个流程的各个步骤基本是固定的,可以很方便的用Jenkins来自动化。实际上,很多项目用的就是Jenkins:当程序员向主仓提交一个PR后,会触发预先配置好的git hook脚本(可以笼统理解为触发一个PR提交事件),它会通知Jenkins去拉取此PR,尝试合入到主仓最新代码上,然后编译、测试,这样来验证合入PR是否存在明显问题,这便是最典型的应用场景。

Jenkins是一个框架,规定了问题解决的范式,但具体的细节,需要根据项目自身情况去配置,比如:项目用什么语言开发;用什么命令构建项目;如何执行测试;如何打包交付等等。

开始体验Jenkins

安装Jenkins

这里采用Docker的形式来部署Jenkins,好处是方便迁移,并且通过容器隔离避免污染服务器环境。

演示系统:MacOS 13.2 / Intel CPU

前置条件:请确保已安装Docker(以MacOS为例,可去Docker官网下载dmg安装镜像)

(1)获取jenkins Docker镜像

这里使用Blue Ocean版本,在国内安装插件也更容易成功。

$ docker pull jenkinsci/blueocean

效果:
jenkins image

(2)运行Docker镜像

$ docker run \
--name jenkinsci-blueocean -u root \
--rm -d -p 7005:8080 -p 50000:50000 \
-v /Users/Xyz/SourceCode/docker/data:/var/jenkins_home \ # 请替换成你自己环境中的路径!!!
-v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean

参数解读:

  • -d:Detached,指定容器在后台运行;
  • —rm:如果已经存在运行的容器,就删除它;
  • -v 宿主机路径:容器内路径:挂载卷,这里将宿主端的/Users/Xyz/SourceCode/docker/data挂载到容器内的/var/jenkins_home,另外,将宿主端的 /var/run/docker.sock 文件挂载到容器的 /var/run/docker.sock 保证容器内的docker与服务器上docker的通讯;
  • -p 宿主机端口:容器内端口:,将容器内的端口映射到host侧;Jenkins代理默认通过TCP端口50000与Jenkins主机通信。
  • -u root:指定用户为root,防止出现执行权限问题;

启动完毕后,在浏览器输入:127.0.0.1:7005 访问Jenkins网页(首次启动需要等待jenkins初始化环境),可用Docker查看容器日志:

jenkins container

下一步,网页会提示:解锁须输入管理员密码,在上方截图的容器日志中找到。输入密码重启Jenkins容器,就可以开始使用了。

配置Jenkins

首先是插件安装,Jenkins提供了大量扩展插件,方便用户使用,这里选择 “安装推荐插件”。(如果有少数插件安装报错,可以跳过)

输入 http://localhost:7005/,访问主页。

下面以我自己的一个开源C++项目:vincentzhu007/flatbuffers_demo为例,介绍基本配置流程。

安装C++编译工具链

Jenkins Docker镜像采用的OS是Alpine Linux,从Docker控制台登入Jenkins容器环境,安装C++工具链:

$ apk update
$ apk add cmake make gcc g++

apk install

配置Jenkins项目

(1)输入名称:flatbuffers_demo_ci,选择“Multi-configuration project”类型,点击OK。

(2)在“Build Environment”栏勾选“Delete workspace before build starts”,这样可以让每次构建都是基于干净的空目录。

(3)在“Build”栏,点击“Add build step”,选择“Execute shell”,输入以下脚本:

echo "Start to download repo..."
git clone https://github.com/vincentzhu007/flatbuffers_demo.git

echo "Start to build..."
cd flatbuffers_demo
mkdir build && cd build
cmake .. && make -j

echo "Finished build."

点击“Save”保存,会跳转到“Project flatbuffer_demo_ci”页面。

(4)在左边栏点击“Build Now”,手动触发任务。在左下角便有编号为“#1”的流水线任务生成,点击跳转,可以查看流水线详情,在左边栏,点击“Console Output”可以查看构建日志。

jenkins pipeline

以上是最简单的“手动触发流水线 + 内置构建节点”使用方式,后续会进一步介绍:流水线触发事件、配置分布式构建节点等内容。

参考

[1] Jenkins官方教程:使用Blue Ocean生成Pipeline
[2] 知乎:手把手教你使用 Jenkins+Docker 实现持续集成