Devops实践中的CICD工具

2021-11-15 16:40:14 浏览数 (1)

如何实践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镜像去完成,减小镜像的复杂度

0 人点赞