参考 rails 的 capistrano ?
。。。
$ yarn global add capistrano
部署分为两个步骤:
$ deploy init
在本地工程目录,生成如下配置文件(建议将下面的deploy
文件夹,特别是其中的pem
文件夹及其文件,放在.gitignore
里)
project
|___ config 没有就建立;
|___deploy 没有就建立
|____ config.js 配置文件
|____ pem 服务器登录私钥
$ deploy prod
该命令将初始化服务端环境:
project
|___current 当前工作目录,通过软连接指向 versions最新版本目录;
|___versions 各个旧的版本工作目录,方便回滚
|___shared 数据持久化目录,方便备份和数据安全
|____ config.* 各种配置文件,可能包含敏感信息
|____ tmp 缓存文件
|____ logs 日志文件
|____ database 数据库文件
执行结果如下:
$ deploy prod
✈ Running prod:prod
✈ Connecting to '47.*.*.21'
[ 'prod' ]
✈ Executing remote task on 47.*.*.21
47.*.*.21 Remote start...
47.*.*.21 $ mkdir -p /var/www/datm-server
47.*.*.21 ● ok
47.*.*.21 $ cd /var/www/datm-server && mkdir -p shareded
47.*.*.21 ● ok
47.*.*.21 $ cd /var/www/datm-server && mkdir -p releases
47.*.*.21 ● ok
47.*.*.21 $ cd /var/www/datm-server && mkdir -p tmp
47.*.*.21 ● ok
47.*.*.21 $ cd /var/www/datm-server && mkdir -p repo
47.*.*.21 ● ok
✈ Remote task on 47.*.*.21 finished after 3.31 s
✈ Executing local task
localhost 上传配置文件
localhost $ rsync --files-from /var/folders/2b/8f4h42vj46g0qnm89v08p9kw0000gn/T/2217801c90c0121dc0cc25d96c6ff6cb -az --rsh="ssh -p22 -i /Users/imfly/Documents/projects/DDN/datm-server/config/deploy/pem/datm.ddn.link.pem" ./ root@47.*.*.21:/var/www/datm-server/shareded
localhost ● ok
✈ Local task finished after 1.5 s
✈ Executing remote task on 47.*.*.21
47.*.*.21 git clone or pull the code...
47.*.*.21 $ cd /var/www/datm-server/repo && if [ ! -f /var/www/datm-server/repo/package.json ]; then git clone git@git.ebookchain.net:datm/datm-server.git . ; else git pull; fi
47.*.*.21 > Already up-to-date.
47.*.*.21 >
47.*.*.21 ● ok
47.*.*.21 git clone or pull success!
47.*.*.21 $ cd /var/www/datm-server && cp -r repo releases/202002010158
47.*.*.21 ● ok
47.*.*.21 $ cd /var/www/datm-server && echo 202002010158 >> /var/www/datm-server/revisions.log;
47.*.*.21 ● ok
47.*.*.21 $ cd /var/www/datm-server && count=$(wc -l < /var/www/datm-server/revisions.log); if [ $count -gt 5 ]; then sed -i '1d' /var/www/datm-server/revisions.log; fi
47.*.*.21 ● ok
47.*.*.21 $ cd /var/www/datm-server && rm -f current && ln -s releases/202002010158 current
47.*.*.21 ● ok
47.*.*.21 yarn stopping...
47.*.*.21 link shared folders and files...
47.*.*.21 $ cd /var/www/datm-server/current && rm -f config/config.prod.js
47.*.*.21 ● ok
47.*.*.21 $ cd /var/www/datm-server/current && ln -s shareded/config.prod.js config/config.prod.js
47.*.*.21 ● ok
47.*.*.21 yarn install...
47.*.*.21 $ cd /var/www/datm-server/current && yarn
47.*.*.21 > yarn install v1.19.1
47.*.*.21 > [1/5] Validating package.json...
47.*.*.21 > [2/5] Resolving packages...
47.*.*.21 > [3/5] Fetching packages...
47.*.*.21 > info fsevents@1.2.9: The platform "linux" is incompatible with this module.
47.*.*.21 > info "fsevents@1.2.9" is an optional dependency and failed compatibility check. Excluding it from installation.
47.*.*.21 > [4/5] Linking dependencies...
47.*.*.21 > warning "egg-oss > ali-oss > co-defer@1.0.0" has unmet peer dependency "co@4".
47.*.*.21 > warning "egg-bin > co-mocha@1.2.2" has incorrect peer dependency "mocha@>=1.18 <6".
47.*.*.21 > warning "egg-bin > espower-typescript@9.0.1" has unmet peer dependency "typescript@>= 2.4.2".
47.*.*.21 > warning "eslint-config-egg > @typescript-eslint/eslint-plugin > tsutils@3.17.1" has unmet peer dependency "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta".
47.*.*.21 > [5/5] Building fresh packages...
47.*.*.21 > Done in 26.52s.
47.*.*.21 >
47.*.*.21 ● ok
47.*.*.21 yarn migrate...
47.*.*.21 yarn stating...
47.*.*.21 Done, Success!
✈ Remote task on 47.*.*.21 finished after 33 s
✈ Flightplan finished after 38 s
- 首先保证本地可以登录远程服务器;
$ ssh -i path-to-pem root@your-id
- 确保远程可以正常 fork 代码
$ git clone repo_url
如果无法克隆,根据提升解决
MIT
Author: imfly kubying@qq.com