- https://github.com/shipitjs/shipit
- https://github.com/shipitjs/shipit-deploy
- https://github.com/timkelty/shipit-shared
上面提到如何在代码部署到 Remote Server 后,将 Sercert file link 到相应位置,然后通过 PM2 启动服务。
但我们真实的项目,是构建 Docker 镜像然后启动镜像来实现最终的发布,毕竟 Docker 有着更好的隔离性。
使用 Docker 的流程又是什么样子呢?
- 将代码放到 remote server 指定位置(已完成)。
- 在 remote server 上将 shared dirs/files 放到指定位置。
- 在代码目录下 build docker image。
- 启动。
Symbolic link Issue
但实践中,发现一件很麻烦的事:docker dislike symbolic link 😓 。Dokcer build 时会忽略 soft link 的文件,如果项目根目录是 soft link,也会出现问题,接下来主要就是解决这两个问题。
shiptit-shared-copy
首先的是,app 目录中不能含有 soft link 文件,不然不会被 copy 到 docker 镜像中。
像 config/application.yml 这种通过 link 方式存在的,就不行了。
所以,解决方案是直接 fork shipit-shared 项目,把 symbolic link 改成 copy。
每次都会把文件复制到 current 对应的 release 版本中。
配置文件和 shipit-shared 保持不变:
module.exports = function (shipit) {
require('shipit-deploy')(shipit);
require('shipit-shared')(shipit);
shipit.initConfig({
default: {
shared: {
overwrite: true,
files: [
'config/application.yml',
'config/database.yml'
],
}
}
});
};
deploy-duplicate
解决完 app 内部 soft link 的问题后,然后在 current
下用 docker-compose 构建镜像,然后启动。发现不能重复,原因是,每次构建的目录并不是 current 这个 soft link 的目录。而是 releases/[version]
这个目录。
目录名变化后,构建出的镜像就不一致了,这就导致无法重复的在一个目录下进行多次构建。
compose 构建后的镜像是用 目录名+service 名。就会有
20170302110102-app-koa2
这样的名字。而不是current-app-koa2
。
除了会构建出多个不同名的镜像,容器也无法被销毁,导致端口被占用。就是说,这个构建不能被重复。
解决办法也有,就是把releases/[version]
物理复制到另一个 current 一样的固定的位置。起名叫 deploy
。就是下面这样的目录结构了:
.
|-- current -> releases/20170228072117
|-- deploy
| |-- app
| |-- bin
| |-- config
| |-- docker-compose.yml
| |-- Dockerfile
| |-- lib
| |-- package.json
| |-- process.yml
| |-- REVISION
| `-- yarn.lock
|-- releases
| |-- 20170228062744
| `-- 20170228072117
`-- shared
`-- config
这样,每次在 published
后,都将最新的 releases 版本复制到 deploy。然后在 deploy 下执行 docker-compose up -d --build
。
因为比较简单,没有做成单独的 npm,直接放在 shipitfile 中,复制即可使用:
module.exports = function (shipit) {
// Docker dislike soft link
// So make a physical copy (deploy) instead of softlink (current)
shipit.blTask('deploy-clean', function () {
console.log('cp -R ' + shipit.releasePath + ' ' + shipit.config.deployTo + '/deploy');
return shipit.remote('rm -rf ' + shipit.config.deployTo + '/deploy');
});
shipit.blTask('deploy-duplicate', function () {
return shipit.remote('cp -R ' + shipit.releasePath + ' ' + shipit.config.deployTo + '/deploy');
});
shipit.on('published', function () {
shipit.start(['deploy-clean', 'deploy-duplicate']);
});
}
Docker up
解决完 Symbolic link 的问题后,终于可以将 Docker 跑起来了。通过 docker-compose.yml 文件,可以将配置都放在其中,然后,只要在相应的目录下启动 docker 的命令就好了。
// Docker build & run on Remote
shipit.blTask('docker-up', function () {
shipit.log('docker-compose up with build...');
return shipit.remote('cd ' + shipit.config.deployTo + '/deploy; docker-compose up -d --build');
});
REF::
- 本项目用到的完整 shipitfile.js https://github.com/lanvige/koa2-boilerplate/blob/master/shipitfile.js
网友评论