Jenkins用户指南

Jenkins是一款基于Java开发、以MIT License开源的持续集成(CI)、持续部署(CD)工具,用于自动化地完成编译、打包、测试、部署等任务,从而把开发者从这些繁琐的工作中解放出来,将更多的时间和精力花在理解、实现业务上。

Jenkins发布于2011年2月2日,前身是Hudson,在由谁主导Hudson的问题上与Oracle发生争执后,从Hudson项目中脱胎而出。

Jenkins CI/CD流程

本文以一个完整例子的形式,向读者演示Jenkins的安装、使用方法,主要的内容会涉及到如下几个方面:

  • 拉取Github代码;
  • 编译Maven项目;
  • 本地打包、推送Docker镜像到Docker registry;
  • 远程部署Docker容器

Jenkins安装方法

新建Jenkins数据卷

执行如下命令新建Jenkins数据卷,或者查看Jenkins数据卷在宿主机中对应的存储位置。

docker volume create jenkins
docker volume inspect jenkins

Jenkins数据卷

启动Jenkins容器

docker container run \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/usr/bin/docker \
-v jenkins:/var/jenkins_home \
--name Jenkins \
jenkins/jenkins:lts

虽然需要Jenkins把编译后的代码打包成Docker镜像并推送到Docker registry,但是本文没有采用Docker in Docker的方式在Jenkins容器中安装一个子Docker,而是把宿主机中的Docker的套接字、命令行的访问路径映射到Jenkins容器中,这样Jenkins就能将打包、推送Docker镜像的任务委托给宿主机中的Docker执行。

注:-v jenkins:/var/jenkins_home是把前面新建的Jenkins数据卷映射到容器中的/var/jenkins_home目录(即Jenkins的工作目录)。

尽量避免把宿主机中的某个目录直接映射到/var/jenkins_home,否则,当容器中的用户使用这些文件时,可能会出现读写权限不够的错误。

配置Jenkins

在浏览器地址栏中输入http://192.168.99.100:8080/,进入Jenkins工作台。

注:本文中,Docker是用Docker Toolbox安装的,以其他方式安装的,请输入http://localhost:8080/

输入默认的密码;

Jenkins默认密码

执行docker container logs [Jenkins containerID]命令查看默认的密码:

Jenkins默认密码

注:也可以在/var/jenkins_home/secrets/initialAdminPassword文件中找到Jenkins默认密码。

安装社区推荐的插件

安装社区推荐的插件 安装社区推荐的插件

修改系统管理员密码

修改系统管理员密码

安装额外的Locale、Maven、SSH插件

Locale插件 Maven插件 SSH插件

设置Jenkins界面显示语言

Jenkins界面显示语言的中文翻译不全,如果中、英文混在一起看着不习惯,可以点击Manage Jenkins > Configure System选项,参考下图把显示语言切换为英文:

设置Jenkins界面显示语言

添加远程主机

点击Manage Jenkins > Configure System选项,参考如下所示添加一台远程主机:

添加远程主机

配置JDK、Maven等Jenkins全局工具

首先,请自行下载、拷贝jdk-8u202-linux-x64.tar.gzapache-maven-3.3.9-bin.tar.gzsettings.xml/var/jenkins_home/tools(对应宿主机中的/mnt/sda1/var/lib/docker/volumes/jenkins/_data/tools)目录中并解压。然后,请参考如下所示填写相应的栏目:

配置Maven settings.xml 配置JDK 8 配置Apache Maven 3

注:settings.xml中包含了Maven私服的配置参数。

Jenkins使用方法

点击New Item来新增一个作业,填写完名称、选中Maven Project等栏目后保存。

新增Jenkins作业

配置Source Code Management

点击Source Code Management来配置源码仓库地址,常见的版本控制系统有Git、SVN等,本文的测试代码使用Git并托管在Github。

配置Source Code Management

配置Build Triggers

点击Build Triggers来配置Jenkins CI作业自动触发条件。Jenkins支持类似Cron的定时轮询机制,下图中配置每5分钟检查一次Git仓库的代码变化。

配置Build Triggers

配置Build

配置Build

配置Post Steps

Post Steps紧跟着Build执行。本地打包、推送Docker镜像,以及远程部署Docker容器的动作都是发生在这个阶段。

本地执行Shell命令打包、推送Docker镜像

本地打包、推送Docker镜像

点击Add post-build step,选中Execute shell。在新增的窗口中,把下面的代码拷贝、粘贴到Command栏目中。

IMAGE_NAME=[Docker registry address]/[repository]:[tag]

docker image rm -f $(docker image ls -q $IMAGE_NAME) | true
docker image build -t $IMAGE_NAME .
docker image push $IMAGE_NAME

上述代码的意思是:首先,删除本地旧的、同名的Docker镜像;然后,编译、打包新的Docker镜像;最后,把Docker镜像推送给Docker registry。

注:

/var/run/docker.sock文件权限不足

如果出现如上图所示的错误,是因为jenkins用户没有权限读写docker.sock,请执行如下命令分配权限给jenkins

docker container exec -it -u root  [containerID] /bin/bash
usermod -a -G [root所属用户组] jenkins

使用SSH远程执行Shell命令部署Docker容器

远程部署Docker容器

点击Add post-build step,选中Execute shell script on remote host using ssh。在新增的窗口中,选择上面添加好的远程主机,并把下面的代码拷贝、粘贴到Command栏目中。

IMAGE_NAME=[Docker registry address]/[repository]:[tag]

docker container rm -f $(docker container ls -q -f ancestor=$IMAGE_NAME) | true
docker image rm -f $(docker image ls -q $IMAGE_NAME) | true
docker image pull $IMAGE_NAME
docker container run -d -p 8080:8080 --name test $IMAGE_NAME

这段代码的意思是:首先,删除旧的、同名的Docker镜像以及以它为蓝本创建的容器;然后,从Docker registry中拉取新的Docker镜像;最后,部署新的Docker容器,暴露8080端口以供访问。

最后,打开浏览器访问http://[host]:8080/test/md5?text=123456,应该可以看到如下图所示的结果:

测试结果

参考资料

  1. Jenkins Wiki
  2. Official Jenkins Docker image usage
  3. Using Docker-in-Docker for your CI or testing environment? Think twice.
  4. Use volumes
  5. Use bind mounts
写于 2019年09月18日