Jenkins用户指南
Jenkins是一款基于Java开发、以MIT License开源的持续集成(CI)、持续部署(CD)工具,用于自动化地完成编译、打包、测试、部署等任务,从而把开发者从这些繁琐的工作中解放出来,将更多的时间和精力花在理解、实现业务上。
Jenkins发布于2011年2月2日,前身是Hudson,在由谁主导Hudson的问题上与Oracle发生争执后,从Hudson项目中脱胎而出。
本文以一个完整例子的形式,向读者演示Jenkins的安装、使用方法,主要的内容会涉及到如下几个方面:
- 拉取Github代码;
- 编译Maven项目;
- 本地打包、推送Docker镜像到Docker registry;
- 远程部署Docker容器
Jenkins安装方法
新建Jenkins数据卷
执行如下命令新建Jenkins数据卷,或者查看Jenkins数据卷在宿主机中对应的存储位置。
docker volume create jenkins
docker volume inspect 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/
。
输入默认的密码;
执行docker container logs [Jenkins containerID]
命令查看默认的密码:
注:也可以在
/var/jenkins_home/secrets/initialAdminPassword
文件中找到Jenkins默认密码。
安装社区推荐的插件
修改系统管理员密码
安装额外的Locale、Maven、SSH插件
设置Jenkins界面显示语言
Jenkins界面显示语言的中文翻译不全,如果中、英文混在一起看着不习惯,可以点击Manage Jenkins > Configure System选项,参考下图把显示语言切换为英文:
添加远程主机
点击Manage Jenkins > Configure System选项,参考如下所示添加一台远程主机:
配置JDK、Maven等Jenkins全局工具
首先,请自行下载、拷贝jdk-8u202-linux-x64.tar.gz
、apache-maven-3.3.9-bin.tar.gz
、settings.xml
到/var/jenkins_home/tools
(对应宿主机中的/mnt/sda1/var/lib/docker/volumes/jenkins/_data/tools
)目录中并解压。然后,请参考如下所示填写相应的栏目:
注:
settings.xml
中包含了Maven私服的配置参数。
Jenkins使用方法
点击New Item来新增一个作业,填写完名称、选中Maven Project等栏目后保存。
配置Source Code Management
点击Source Code Management来配置源码仓库地址,常见的版本控制系统有Git、SVN等,本文的测试代码使用Git并托管在Github。
配置Build Triggers
点击Build Triggers来配置Jenkins CI作业自动触发条件。Jenkins支持类似Cron的定时轮询机制,下图中配置每5分钟检查一次Git仓库的代码变化。
配置Build
配置Post Steps
Post Steps紧跟着Build执行。本地打包、推送Docker镜像,以及远程部署Docker容器的动作都是发生在这个阶段。
本地执行Shell命令打包、推送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。
注:
如果出现如上图所示的错误,是因为
jenkins
用户没有权限读写docker.sock
,请执行如下命令分配权限给jenkins
。docker container exec -it -u root [containerID] /bin/bash usermod -a -G [root所属用户组] jenkins
使用SSH远程执行Shell命令部署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
,应该可以看到如下图所示的结果: