Jenkins快速尝鲜指南
Jenkins作为CI/CD方面的流行技术,同时还相对(k8s之流)易于安装,不自己整一整实在是可惜。
本文介绍jenkins从零到部署一个简单java web应用的过程,力求简单优雅。如果想要跟随本文操作学习,准备如下:
- 一个linux环境(虚拟机或者云服务器,windows当然也可以,不过windows有什么好玩的啊)
- 安装好docker、git、java、maven、nginx(可选)
本文最终希望实现的效果如下:
- jenkinsfile(pipeline定义文件)和dockerfile(docker构建镜像的文件)都在git代码仓库中
- jenkins构建帮助完成如下步骤:
- 服务器(docker的宿主机)拉取git代码
- 在服务器(docker的宿主机)上完成编译打包
- 基于仓库中拉取的dockerfile构建docker镜像
- 使用上一步的镜像启动一个docker容器
这样从推送代码到服务更新,中间只有在jenkins中点击构建这一个操作(这个操作甚至也可以不用,可以配置jenkins监控仓库的代码变更,自动完成构建)
安装Jenkins
Jenkins官网主要介绍了三种方式来安装Jenkins
- 包管理工具安装
- war包安装
- docker安装
包管理器的安装方式虽然方便,但是活都让别人干了,不同系统的安装也可能不太一样,有点隔靴挠痒的感觉,故没有采用。
笔者一开始尝试docker安装,但是后来发现docker方式有诸多麻烦,首先docker中安装的Jenkins需要操作docker。第一种方式docker out of docker,Jenkins在一个docker容器中,需要操作宿主机的docker,设置起来颇为麻烦,也没有找到完整的教程,撇下不谈。
另一种方式是使用docker in docker(Dind),Jenkins官网介绍了这种方式,就是在宿主机的docker中再以(Dind镜像)启动一个docker,这样宿主的docker容器列表里有一个提供Jenkins的容器,还有一个提供docker的容器,再通过socket挂载的方式,让Jenkins容器中的Jenkins可以使用兄弟容器中的docker。
此时宿主机上执行docker ps 效果如下,一个docker:dind镜像启动的容器,直译就是docker中的docker,一个jenkinsci/blueocean镜像启动的容器,里面是jenkins服务。
笔者最终没有使用这种方式,一是因为这样就有了内外两个docker,他们的镜像缓存是不共享的,内部docker启动后,由于jenkins操作的是内部docker,最终的应用是在docker中的docker中的容器中运行的,性能损耗很大,需要的基础镜像和打包所需的jar包都需要重新下载,相当麻烦,最终没有使用这种方式。
最终选择的是war包的方式安装,首先下载Jenkins的war包,然后很简单,按照官方:
java -jar jenkins.war
或者使用自己写的更复杂一点的,笔者的供参考,部分参数请自行去掉或替换:
nohup java -Xms${opt_xms} -Xmx${opt_xmx} -Xmx${opt_xmx} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/jenkins.hprof -jar ${jar_dir}/${jar_name} --httpPort=${opt_port} --prefix=/jenkins >> ${log_path}/${project_name}.log &
然后访问 http://localhost:8080就可以解锁Jenkins了。
这里因为jenkins使用了hudson,所以这个war包既可以java -jar的方式启动,也可以放到web容器中启动
解锁jenkins需要一个密码,密码打印在启动jenkins的控制台输出里了,或者参照官网文档找找。我的文件是在这里的:
cat /home/username/.jenkins/secrets/initialAdminPassword
username换成你的linux用户名。
配置Jenkins
配置访问路径和端口号
如果希望通过 http://localhost:9090访问Jenkins:
java -jar jenkins.war --prefix=/jenkins --httpPort=9090
如果修改了jenkins的路径,需要在系统管理->系统配置中修改如下配置:
这个配置项里需要加上路径配置,端口也是需要的,图中因为我使用了nginx转发至80端口,所以省略了端口号,nginx转发相关,稍后再聊
配置Jenkins用户
通过初始化密码登录后第一件事就是(系统管理->管理用户)创建一个用户,然后(系统管理->全局安全配置)设置授权策略,登录以后才可以操作jenkins,这里我还选择了匿名用户可读。