设计的原因
- 主要是为了减少耦合和依赖,随时可以迁移到新的CICD系统
- Dockerfile多阶段构建把所有的项目构建步骤都完成了,即便脱离了Jenkins系统也可以手动构建出镜像来,而且Dockerfile的环境问题相对简单
- 弱化Jenkins的处理,也不要配置比较复杂的Jenkins运行环境
CICD职责划分
Jenkins负责的事情
- 拉取Git代码
- 自动构建docker image
- 发布
Dockerfile负责的事情
- 项目的构建环境
- 项目的构建步骤
- 最终的运行环境
交付规范
- 以docker image作为交付的标准
- 开发要提供可以运行的docker image,如果image本身不能运行,需要开发排查
- 运维则是将开发提供的image跑在生产环境中,并提供运行保障和监控
git项目名字规范
- 因为jenkins构建部署的时候需要用到项目名字(project_name) 和项目组名字(project_group)
- k8s的name规范是不允许有下划线(_)的
- git name规范就要必须是以(-)作为分隔符,比如(go-web-demo)
- 不按照这个规范,就需要项目单独维护自己的Jenkinsfile
目录结构规范
- Dockerfile这个必须要求位于项目的根目录
- dockerignore类似gitignore,把不需要拉进去docker上下文环境的文件去除掉
| .
├── .dockerignore
├── Dockerfile
└── deploy
├── Jenkinsfile
└── manifests
├── deploy.yaml
├── svc.yaml
└── ingress.yaml | | :—- |
Dockerfile编写规范
容器时间和系统源更换为国内
- 这边服务运行的基础镜像一般是两个(alpine操作系统或者centos操作系统)
- 运行环境配置不复杂的,使用alpine系统,因为这个最小
- 运行环境配置复杂的,使用centos系统,因为这个最熟悉
- registry.k8s.clicki.cn/sunteng 这个项目下的镜像是直接从dockerhub直接拉取过来的,没有修改过系统时间
- registry.k8s.clicki.cn/common 这个项目一般都是运维制作的基础镜像,一般centos系统来的,是修改过系统时间的
alpine系统 更换系统源和修改系统时间 | FROM registry.k8s.clicki.cn/sunteng/node:12.16.3-alpine3.9
# alpine 系统 更换系统源和修改系统时间 # 替换成中科大
RUN sed -i ‘s/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g’ /etc/apk/repositories && \
apk update && \
apk add -U tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime | | :—- |centos系统 更换系统源和修改系统时间 | | | :—- |
语言包源更换为国内
npm | RUN npm config set registry https://registry.npm.taobao.org —global && npm config set disturl https://npm.taobao.org/dist —global | | :—- |
pip | RUN pip install -i http://pypi.douban.com/simple —trusted-host pypi.douban.com | | :—- |
安全问题
- 千万不能把kubernetes的key或者gitlab的key以及各种密码打包进容器里面
- 要统一使用Jenkins的凭据管理来管理这些密码以及key信息
Jenkinsfile规范
- Jenkins共享库的维护,有运维组来维护这个代码库,开发可以查看或者提出一些公共函数或变量的需求
如果完全按照规范来建立项目的话,开发直接调用共享库里面的deploy函数,不需要开发独自维护 | #!groovy
// 共享库引用
@Library(‘jenkins-lib’) _
// all in one
deploy() | | :—- |项目比较复杂的,就不能公用了,需要这个项目独自维护Jenkinsfile
Jenkins共享库(Share Library)
URL: http://git.clicki.cn/jenkins/jenkins-lib.git
参考项目
一开始可以先参考没有使用共享库的Jenkinsfile编写,容易理解很多
URL: http://git.clicki.cn/jenkins/go-web-demo/blob/master/deploy/Jenkinsfile-no-lib
线上会使用带有共享库引用的Jenkinsfile,便于后期的维护
URL: http://git.clicki.cn/jenkins/go-web-demo/blob/master/deploy/Jenkinsfile
Jenkins构建job
URL: http://192.168.11.52:30001/job/demo-go-web