Jenkins-docker-ansible自动化上线

从11月开始到现在,项目开始从 php 转换到 nodejs + 后端服务,相应的部署环境转换到docker。

在使用纯php环境,上线比较简单,主要是代码拉取,拷贝和软链切换。 运行环境使用docker后相应的需要引入一个打包的过程,所以前面所依靠的上线部署系统无法满足当前的需求。

目前来说,Jenkins 作为自动化的流水线工具,几乎是不二的选择。

将 Jenkins 作为流水线工具,在打包阶段依赖 docker-compose。 上线阶段依赖 ansible 。

jenkins 流程

  • Git 拉取代码
  • Jenkins 根据不同的上线配置不同的脚本
  • docker-compose 打包代码指定-f 参数来决定不同的镜像项目下:​ docker-compose.yml 对应正式环境 ,Jenkins 绑定到 master 分支​ docker-compose.dev.yml 对应测试环境, Jenkins 绑定到 develop 分支​ 由于打包过程使用的 dockerfile 都一样。 在自行的测试环境上可以自行编辑个人的docker-compose文件来作为开发环境。在 .gitignore 里面讲个人配置文件过滤掉。
  • docker-compose 上传代码同打包代码一样,使用 -f 参数来指定 docker-compose 文件来上传。
  • 执行ansible 的 playbook 来完成上线

整个过程相对来说比较简单,总结下来:1)jenkins负责docker打包和发布,2)ansible 负责线上部署脚本。

整个部署过程全部都是脚本化

  1. jenkins 脚本由 Jenkinsfile 负责
  2. docker 编译发布 由 docker-compose.yml 负责
  3. 线上发布有 ansible playbook.yml 负责。

所有的脚本全部都放下项目目录的deploy里面。涉及到私密信息,保存在 Jenkins 或者 ansible 的配置中,脚本中使用变量来替换。

ansible 流程

ansible 在整个流程中负责与线上的机器交互,交互过程脚本话,全部都在一个名为 playbook.yml 的脚本中

在 Jenkins 中调用只需要一行

1
2
3
4
5
6
ansiblePlaybook credentialsId: '2495416d-79bb-4c43-9759-76102a166b3d',
playbook: 'playbook.yml',
extraVars: [
workspace: "${WORKSPACE}"
]

playbook 负责

  1. copy 配置文件
  2. 根据配置文件,拉取docker image
  3. 更新现有配置文件
  4. 重新启动docker
  5. 重新加载 nginx 配置

docker 打包

部署上线,涉及到nodejs项目需要使用 npm install 或者 php 项目需要使用 compose install 的,按照正常的项目配置,每次在 docker build 的过程,由于源码变化,导致了每次执行初始化的过程都需要重新安装。

我希望在自动化部署上线中,docker build 的过程时间越短越好。所以就需要利用到 docker images 的缓存。如果当前层没有发生变化,那么 docker 在打包过程中会自动使用缓存。

所以,将 nodejs 项目中的 package.json 或者 php 项目中的 composer.json 实现负责到指定文件夹做初始化。这样就可以让这段耗时 install 过程在第一次编译完成后充分的利用 docker cache。

比如:

常规流程

1
2
3
4
5
6
ADD . /var/www/source
WORKDIR /var/www/source
RUN npm install \
&& npm run build


修改后流程

1
2
3
4
5
6
7
8
9
10
ADD  ./package*.json /var/www/node/
WORKDIR /var/www/node
RUN npm install

ADD . /var/www/source
WORKDIR /var/www/source
RUN ln -sf ../node/node_modules ./node_modules \
&& npm run build


作者

张巍

发布于

2018-12-05

更新于

2018-12-05

许可协议

评论