>我有以下设置
[dev laptop] -- git push --> [gitlab]
|
git pull
|
V
[prod server]
上述结果为以下工作流
dev-laptop$ git push gitlab
dev-laptop$ ssh prod-server
prod-server$ cd app
prod-server$ git pull gitlab
prod-server$ pm2 restart app
prod-server$ exit
- 在开发和生产之间
dev-laptop$ rsync
图像和其他二进制文件
如何减少上述步骤的数量?以下是我的想法:
在两者之间摆脱GitHub,以便我直接从我的开发笔记本电脑
git push
到生产服务器。但我不知道该怎么做,或者是否可以做到。在GitLab上设置了一些
git hooks
,所以当我git push
它时,在post-receive
上,GitHubgit push(es)
对生产服务器的更改。并且,在重新启动pm2
的生产服务器上添加一个post-receive
git 挂钩。当然,我也不太知道如何做到这一点。
更新:理想情况下,因为我是这个项目中唯一的开发人员,我希望有一个这样的工作流程
[dev laptop] -- git push --> [prod server]
以上,加上上面描述的一些git hooks
,将大大简化我的生活。当然,危险在于我不再有中央存储库,所以万一我的开发笔记本电脑或生产服务器出现故障,我没有备份。但这是我可以选择忍受的危险。
更新2:拥有中央存储库的安全性非常有吸引力。
要做的事情:
1( 首先让您的产品部署一个步骤。 我见过很多生产站点使用git pull
进行更新,但我认为这是一个错误 - 它要求它们以某种方式成为生产存储库中的冲突,从而导致问题。 而是编写一个脚本来执行类似
mkdir deploydir-next
git archive master https://gitlab.com/me/myproject.git | tar -x -C /deploydir-next
pm2 stop app
mv deploydir deploydir-prev ; mv deploydir-next deploydir
pm2 start app
(cd deploydir-prev ; tar czv ../rollback_`date +%Y%m%d%H%M%S`.tar.gz . )
rm -rf deploydir-prev
这会关闭它足够长的时间,以便非常快速地切换到新代码,该代码派生自当前主头的快照。
2( 现在,您的生产服务器上有一个deploy
脚本,您可以选择:
- 准备好部署时手动运行它
- 在计划的升级时间定期运行它(周一凌晨 5 点很好,因为它可以让您整周修复任何中断,而不会占用您的周末(
- 通过(安全!(GitLab Webhook自动运行它