如何实践Devops? 我觉得肯定是先玩起来,在实践中探索学习和总结Devops文化,不同体制的团队或者公司在Devops文化的理解上都有自己道理,有的人说devops是跨职能团队,也有的说是敏捷团队,理论上面的东西真是掰扯不清,但是总结摸索出适用于自己团队的devops工具栈才是最能提高团队工作效率的, 所以在不断的实践和总结中完善自己的ToolChain.
Jenkins维护有哪些困难
想要用Jenkins,安装部署以及后期的维护总是少不了,但是有什么简单的方式能快速的安装和维护后期的Jenkins呢?暂时想到使用Docker可能是最简单和易于维护的方式,有几点原因:
- 有些人可能在裸机部署使用期间需要各种语言的支持(go,python,maven,node.js等),因此安装一堆的依赖,造成很多不确定性因素,维护起来麻烦;
- 不标准维护的上来就操作,其他的维护者都不知道做了什么,完全一个黑箱子;
- Jenkins服务异常挂掉的话需要额外的脚本监控干预,重启;
- 服务器宕机的话,如果服务器因为异常起不来,服务恢复时间加长,还需要重新安装配置一下;
- 安装的插件版本不能版本化管理, 每次都要去Jenkins上或者API查看当前的版本;
- 很多维护人员不喜欢写文章,又不去代码话,后者维护难度加大
使用Docker部署有哪些好处
考虑到以上的一些问题,发现使用Docker部署Jenkins才是最佳的方式:
- 配置即代码(Dockerfile/docker-compose.yml)
- 容器的容器策略
- 镜像的跨平台性
- 插件列表通过文件独立出来,与Dockerfile/docker-compose.yml一样版本化
- 编写Jenkins的pipeline,自动化构建镜像以及版本升级
准备一下资源目录结构
代码语言:javascript复制$ mkdir jenkins.kubemaster.top && cd $_ && git init . # 创建一个git repo
$ mkdir {build,deploy} && touch build/Dockerfile docker-compose.yml Jenkinsfile plugins.txt entrypoint.sh sources.list
$ ls
Jenkinsfile build deploy docker-compose.yml entrypoint.sh plugins.txt sources.list
$ tree
.
├── Jenkinsfile # 使用jenkins自动化编译构建的pipeline文件
├── build
│ └── Dockerfile # Docker镜像的构建文件
├── docker-compose.yml # 通过docker-compose管理docker容器
├── entrypoint.sh # 容器启动前的初始化脚本
└── plugins.txt # 需要安装的插件列表
└── sources.list # 镜像的依赖软件包源
首先准备一下Dockerfile
代码语言:javascript复制# 我们可以在Dockerfile中完全自定义自己需要的环境
cat << EOF > build/Dockerfile
FROM jenkinsci/jenkins:2.138.1
USER root
ADD ./sources.list /etc/apt/sources.list
RUN apt-get update && apt-get -y install apt-transport-https ca-certificates curl software-properties-common &&
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - &&
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/debian stretch stable" &&
apt-get -y update && apt-get -y install docker-ce
RUN apt-get install -y python-pip && pip install virtualenv -i https://mirrors.aliyun.com/pypi/simple/ &&
echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers &&
apt-get clean && rm -rf /var/lib/apt/lists/* &&
mkdir -p /logs && chown jenkins:jenkins /logs
USER jenkins
COPY ./plugins.txt /usr/share/jenkins/plugins.txt
COPY ./plugins.txt /usr/share/jenkins/ref/
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt
EOF
cat << EOF >> plugins.txt
ace-editor:1.1
ansible:0.6.2
ant:1.5
... # 注意这里安装你需要的Jenkins plugins
EOF
cat << EOF >> sources.list
deb http://mirrors.aliyun.com/debian stretch main
deb http://mirrors.aliyun.com/debian stretch-updates main
EOF
cat << EOF >> docker-compose.yml
version: "3.7"
services:
jenkinsci-master:
build:
context: ./content
dockerfile: Dockerfile
image: bluerdocker/jenkins:2.138.1
restart: always
hostname: jenkins-master
user: jenkins
environment:
- JAVA_OPTS=-Duser.timezone=Asia/Shanghai
extra_hosts:
- 'gitlab.kubemaster.top:172.16.132.92'
- 'nexus.kubemaster.top:172.16.132.90'
ports:
- '8080:8080'
- '50000:50000'
volumes:
- "/data/jenkins-master:/var/jenkins_home"
- "/var/run/docker.sock:/var/run/docker.sock"
- "/usr/share/zoneinfo/Asia/Shanghai:/etc/localtime"
插件下载困难怎么办?
注意不管使用Docker构建还是任何安装jenkins的方式,安装插件都是比较麻烦的,因此我们可以针对指定版本的插件将插件提前下载下来,这样就可以加快编译速度;这里推荐一个插件的下载地址:http://mirror.serverion.com/jenkins/plugins/,如果你不知道需要安装哪些插件,你可以从原来的jenkins上获取一下,一下是使用Go写的一个获取下载链接的部分代码:
代码语言:javascript复制package api
import "jenkinsapi/defs"
// 拼凑出当前Jenkins的插件的所有下载地址:
// jenkins插件镜像源地址为: http://mirror.serverion.com/jenkins/plugins/
func (client *JenkinsClient)GetPluginDownURL() []string {
var list_plugin []string
var plugins_down_url = "http://mirror.serverion.com/jenkins/plugins/"
plugins, _ := client.GetPlugins(100)
for _, pluginiterm := range plugins.Raw.Plugins {
list_plugin = append(list_plugin, plugins_down_url pluginiterm.ShortName "/" pluginiterm.Version "/" pluginiterm.ShortName ".hpi")
for _, dep_plugin := range pluginiterm.Dependencies {
dep_url := plugins_down_url dep_plugin.ShortName "/" dep_plugin.Version "/" dep_plugin.ShortName ".hpi"
list_plugin = append(list_plugin, dep_url)
}
}
return defs.RemoveRepeatedElement(list_plugin)
}
// 对列表进行去重 args: list
func RemoveRepeatedElement(arr []string) (newArr []string) {
newArr = make([]string, 0)
for i := 0; i < len(arr); i {
repeat := false
for j := i 1; j < len(arr); j {
if arr[i] == arr[j] {
repeat = true
break
}
}
if !repeat {
newArr = append(newArr, arr[i])
}
}
return newArr
}
在准备好一切工作之后,我们就可以开始构建自己的Jenkins镜像了
代码语言:javascript复制docker-compose -f ./docker-compose.yml up -d
这样就基本上完成了使用Docker自定义Jenkins服务镜像,对于我们以后要升级个维护,我们只需要修改Dockerfile中的 FROM
的镜像版本即可即可,这里不建议你把 maven
, go
, node.js
等环境包装在jenkins镜像内,建议你构建服务的时候通过依赖环境的docker镜像去完成,减小镜像的复杂度