Devops实践中的CICD工具

强颜欢笑 提交于 2020-12-31 05:12:06

如何实践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,自动化构建镜像以及版本升级

准备一下资源目录结构

  
    
  
  
  1. $ mkdir jenkins.kubemaster.top && cd $_ && git init . # 创建一个git repo

  2. $ mkdir {build,deploy} && touch build/Dockerfile docker-compose.yml Jenkinsfile plugins.txt entrypoint.sh sources.list

  3. $ ls

  4. Jenkinsfile build deploy docker-compose.yml entrypoint.sh plugins.txt sources.list

  5. $ tree

  6. .

  7. ├── Jenkinsfile # 使用jenkins自动化编译构建的pipeline文件

  8. ├── build

  9. └── Dockerfile # Docker镜像的构建文件

  10. ├── docker-compose.yml # 通过docker-compose管理docker容器

  11. ├── entrypoint.sh # 容器启动前的初始化脚本

  12. └── plugins.txt # 需要安装的插件列表

  13. └── sources.list # 镜像的依赖软件包源

首先准备一下Dockerfile

  
    
  
  
  1. # 我们可以在Dockerfile中完全自定义自己需要的环境

  2. cat << EOF > build/Dockerfile

  3. FROM jenkinsci/jenkins:2.138.1

  4. USER root


  5. ADD ./sources.list /etc/apt/sources.list

  6. RUN apt-get update && apt-get -y install apt-transport-https ca-certificates curl software-properties-common && \

  7. curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - && \

  8. add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/debian stretch stable" && \

  9. apt-get -y update && apt-get -y install docker-ce


  10. RUN apt-get install -y python-pip && pip install virtualenv -i https://mirrors.aliyun.com/pypi/simple/ && \

  11. echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers && \

  12. apt-get clean && rm -rf /var/lib/apt/lists/* && \

  13. mkdir -p /logs && chown jenkins:jenkins /logs


  14. USER jenkins

  15. COPY ./plugins.txt /usr/share/jenkins/plugins.txt

  16. COPY ./plugins.txt /usr/share/jenkins/ref/

  17. RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt

  18. EOF


  19. cat << EOF >> plugins.txt

  20. ace-editor:1.1

  21. ansible:0.6.2

  22. ant:1.5

  23. ... # 注意这里安装你需要的Jenkins plugins

  24. EOF


  25. cat << EOF >> sources.list

  26. deb http://mirrors.aliyun.com/debian stretch main

  27. deb http://mirrors.aliyun.com/debian stretch-updates main

  28. EOF


  29. cat << EOF >> docker-compose.yml

  30. version: "3.7"

  31. services:

  32. jenkinsci-master:

  33. build:

  34. context: ./content

  35. dockerfile: Dockerfile

  36. image: bluerdocker/jenkins:2.138.1

  37. restart: always

  38. hostname: jenkins-master

  39. user: jenkins

  40. environment:

  41. - JAVA_OPTS=-Duser.timezone=Asia/Shanghai

  42. extra_hosts:

  43. - 'gitlab.kubemaster.top:172.16.132.92'

  44. - 'nexus.kubemaster.top:172.16.132.90'

  45. ports:

  46. - '8080:8080'

  47. - '50000:50000'

  48. volumes:

  49. - "/data/jenkins-master:/var/jenkins_home"

  50. - "/var/run/docker.sock:/var/run/docker.sock"

  51. - "/usr/share/zoneinfo/Asia/Shanghai:/etc/localtime"

插件下载困难怎么办?

注意不管使用Docker构建还是任何安装jenkins的方式,安装插件都是比较麻烦的,因此我们可以针对指定版本的插件将插件提前下载下来,这样就可以加快编译速度;这里推荐一个插件的下载地址:http://mirror.serverion.com/jenkins/plugins/,如果你不知道需要安装哪些插件,你可以从原来的jenkins上获取一下,一下是使用Go写的一个获取下载链接的部分代码:

  
    
  
  
  1. package api

  2. import "jenkinsapi/defs"


  3. // 拼凑出当前Jenkins的插件的所有下载地址:

  4. // jenkins插件镜像源地址为: http://mirror.serverion.com/jenkins/plugins/

  5. func (client *JenkinsClient)GetPluginDownURL() []string {

  6. var list_plugin []string

  7. var plugins_down_url = "http://mirror.serverion.com/jenkins/plugins/"


  8. plugins, _ := client.GetPlugins(100)

  9. for _, pluginiterm := range plugins.Raw.Plugins {

  10. list_plugin = append(list_plugin, plugins_down_url+pluginiterm.ShortName+"/"+pluginiterm.Version+"/"+pluginiterm.ShortName+".hpi")

  11. for _, dep_plugin := range pluginiterm.Dependencies {

  12. dep_url := plugins_down_url + dep_plugin.ShortName + "/" + dep_plugin.Version + "/" + dep_plugin.ShortName + ".hpi"

  13. list_plugin = append(list_plugin, dep_url)

  14. }

  15. }

  16. return defs.RemoveRepeatedElement(list_plugin)

  17. }

  18. // 对列表进行去重 args: list

  19. func RemoveRepeatedElement(arr []string) (newArr []string) {

  20. newArr = make([]string, 0)

  21. for i := 0; i < len(arr); i++ {

  22. repeat := false

  23. for j := i + 1; j < len(arr); j++ {

  24. if arr[i] == arr[j] {

  25. repeat = true

  26. break

  27. }

  28. }

  29. if !repeat {

  30. newArr = append(newArr, arr[i])

  31. }

  32. }

  33. return newArr

  34. }

在准备好一切工作之后,我们就可以开始构建自己的Jenkins镜像了

  
    
  
  
  1. docker-compose -f ./docker-compose.yml up -d

这样就基本上完成了使用Docker自定义Jenkins服务镜像,对于我们以后要升级个维护,我们只需要修改Dockerfile中的 FROM的镜像版本即可即可,这里不建议你把 maven, go, node.js等环境包装在jenkins镜像内,建议你构建服务的时候通过依赖环境的docker镜像去完成,减小镜像的复杂度


本文分享自微信公众号 - 云原生生态圈(CloudNativeEcoSystem)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!