轻松部署 Laravel 应用 | 《13. 更新与回滚》
本系列持续更新中,欢迎关注:https://github.com/wi1dcard/laravel-deploy...。
由于课程上下文关联比较紧密,在开始前请先阅读 本文。
你的支持是我写作的动力;关注我的客官们,请在右上角点个赞,将会让文章在首页展示,帮助更多人。
感谢
!
在之前的小节中,我们使用 Git + HTTPS 协议将代码部署服务器上;但每次都输入密码既不方便,也不利于后续开展部署自动化。更加普遍的做法是使用 SSH 协议,并将服务器的公钥配置到 GitHub(或其它托管平台)仓库的部署公钥内。相比普通个人公钥,部署公钥通常不具备推送权限(只读),因此更加安全可靠。
提示:关于更多部署密钥的介绍,可查阅 GitHub 文档。
Git 部署公钥#
首先登录到服务器,执行以下命令:
$ ssh-keygen -t rsa -C "wi1dcard.cn@gmail.com"
没错,这正是上一小节中所提到的生成密钥对命令,请将 wi1dcard.cn@gmail.com
替换为自己的邮箱地址。整体流程基本一致,此处不再赘述。
接着,使用以下命令输出公钥:
$ cat ~/.ssh/id_rsa.pub
输出类似:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDpTg16xxOTKZ5XruajPtMhwLE+GFk+Kei1xFPJ65rRItXWgDxUEYE4WM81BnVhryjyJ2YtnvaYhqnxnBIqTuRxjg33dLLShizcx9UNhpZyiA6cHchqEyzWPvkpQzTOh7h4cP730XB2hKUkxkYwt0kjhHbsqRu+FAq81k/YTqDF2V+wuxQaIijO7sf4kPrazH7VJQuOvvMkcUKHzGGse/0V65nNzGi5R7BkIH5FANz9aYrL4tU0wtdHUDLnQ9Q9/nWYYFFl7NdC2oUrtNGKTb0gWe/rv1spSx8072kehKJtD2DJghP23yuBDUgxQL2F9aTDlac45MzJ3aueImPOxGYF wi1dcard.cn@gmail.com
复制这段公钥文本备用。
以 GitHub 为例,在浏览器内打开仓库主页,选择右侧的 Settings 标签页;点击左侧的侧边栏中的 Deploy keys,接着点击右上角的 Add deploy key 按钮:
提示:其它 Git 托管平台操作类似,可搜索类似
GitLab deploy keys
等关键词查找对应文档。
在 Title 内给公钥起个名字;在 Key 中粘贴刚刚复制的公钥文本,例如:
注意:除非必要,页面下方 Allow write access 复选框请勿选中,否则该密钥将具备推送权限。另外,密钥保存后无法修改,如需变更只能重新创建,因此务必确保命名规范、公钥无误。
随后,点击 Add key 按钮即可添加成功,如图:
再次回到仓库主页,复制 SSH 协议的 Git 仓库地址备用:
更新与回滚#
由于完全基于 Git 部署,因此我们可以「站在巨人的肩膀上」—— 借用 Git 的 reset
功能实现更新、回滚到任意提交。
首先,在服务器中执行以下命令,将文件所有者设置为我们手动创建的新用户:
$ su root -c 'chown -R deployer /var/www/deployment'
将远端的 HTTPS 协议地址修改为 SSH 协议地址:
$ cd /var/www/deployment
$ git remote set-url origin 'git@github.com:wi1dcard/hello-deployment.git'
其中,git@github.com:wi1dcard/hello-deployment.git
请替换为刚刚复制的仓库地址。
接下来,使用 git fetch
命令获取远端状态(但不拉取到本地):
$ git fetch -t -v
其中,-t
代表除提交历史外,同时获取标签(Tags);-v
代表开启 Verbose Mode,直译为「啰嗦模式」,通常表示输出更多详细信息。
提示:
-v
选项不仅可用于git fetch
;在其它 Git 操作、甚至许多 Unix 命令中,都用于表示开启啰嗦模式。
稍等片刻,你可能会看到这样的输出:
The authenticity of host 'github.com (13.250.177.223)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?
还记得第一次登录服务器时的提示吗?与此处的询问相同,输入 yes
即可。
如果服务器上的 Git 仓库与 GitHub 上的仓库不存在差异,那么输出将会类似:
From github.com:wi1dcard/hello-deployment
= [up to date] master -> origin/master
如果 GitHub 上存在更新的提交,那么输出将会类似:
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:wi1dcard/hello-deployment
602fa83..9a69730 master -> origin/master
此时,本地已经得到了远端的提交历史信息;尽情使用 git reset
命令随意更新或回滚吧。
例如:
-
穿越到远端 master 分支的倒数第一次提交(即最新提交),通常用于更新至最新代码。
$ git reset --hard origin/master
-
穿越到远端 master 分支倒数第三次提交,通常用于回滚一部分错误提交。
$ git reset --hard origin/master~2
-
穿越到 ID 为 602fa83 的提交,通常用于回滚到特定版本。
$ git reset --hard 602fa83
-
同理,亦可回滚至任意本地分支、标签、HEAD 等...
注意:
origin/master~2
实际上是表示origin/master
的首个父提交的首个父提交,多数情况下可理解为倒数第三次提交,但这两个概念并不相等。有兴趣请阅读 Git 相关书籍,此处不再展开。
最后,由于国内网络环境的特殊性,执行以上 Git 命令可能稍有卡顿,若项目较大则更加明显,可尝试 Gitee 等国内平台,虽然功能不如 GitLab 强大,生态不如 GitHub 完善,但至少... 速度飞快。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: