Skip to content

Commit f2e80f2

Browse files
committed
✍️13. 更新与回滚.md
1 parent 54a2cbc commit f2e80f2

File tree

5 files changed

+135
-0
lines changed

5 files changed

+135
-0
lines changed

src/13. 更新与回滚.md

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
# 更新与回滚
2+
3+
在之前的小节中,我们使用 Git + HTTPS 协议将代码部署服务器上;但每次都输入密码既不方便,也不利于后续开展部署自动化。更加普遍的做法是使用 SSH 协议,并将服务器的公钥配置到 GitHub(或其它托管平台)仓库的部署公钥内。相比普通个人公钥,部署公钥通常不具备推送权限(只读),因此更加安全可靠。
4+
5+
> 提示:关于更多部署密钥的介绍,可查阅 [GitHub 文档](https://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys)
6+
7+
## Git 部署公钥
8+
9+
首先登录到服务器,执行以下命令:
10+
11+
```bash
12+
$ ssh-keygen -t rsa -C "wi1dcard.cn@gmail.com"
13+
```
14+
15+
没错,这正是上一小节中所提到的生成密钥对命令,请将 `wi1dcard.cn@gmail.com` 替换为自己的邮箱地址。整体流程基本一致,此处不再赘述。
16+
17+
接着,使用以下命令输出公钥:
18+
19+
```bash
20+
$ cat ~/.ssh/id_rsa.pub
21+
```
22+
23+
输出类似:
24+
25+
```
26+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDpTg16xxOTKZ5XruajPtMhwLE+GFk+Kei1xFPJ65rRItXWgDxUEYE4WM81BnVhryjyJ2YtnvaYhqnxnBIqTuRxjg33dLLShizcx9UNhpZyiA6cHchqEyzWPvkpQzTOh7h4cP730XB2hKUkxkYwt0kjhHbsqRu+FAq81k/YTqDF2V+wuxQaIijO7sf4kPrazH7VJQuOvvMkcUKHzGGse/0V65nNzGi5R7BkIH5FANz9aYrL4tU0wtdHUDLnQ9Q9/nWYYFFl7NdC2oUrtNGKTb0gWe/rv1spSx8072kehKJtD2DJghP23yuBDUgxQL2F9aTDlac45MzJ3aueImPOxGYF wi1dcard.cn@gmail.com
27+
```
28+
29+
复制这段公钥文本备用。
30+
31+
以 GitHub 为例,在浏览器内打开仓库主页,选择右侧的 **Settings** 标签页;点击左侧的侧边栏中的 **Deploy keys**,接着点击右上角的 **Add deploy key** 按钮:
32+
33+
![](https://github.com/wi1dcard/laravel-deployment/raw/master/src/images/3ee09a6dfd0a40a119168af4934ec617.png)
34+
35+
> 提示:其它 Git 托管平台操作类似,可搜索类似 `GitLab deploy keys` 等关键词查找对应文档。
36+
37+
在 Title 内给公钥起个名字;在 Key 中粘贴刚刚复制的公钥文本,例如:
38+
39+
![](https://github.com/wi1dcard/laravel-deployment/raw/master/src/images/31328118dd59ad39fb13c3046a306b6e.png)
40+
41+
> 注意:除非必要,页面下方 Allow write access 复选框请勿选中,否则该密钥将具备推送权限。另外,密钥保存后无法修改,如需变更只能重新创建,因此务必确保命名规范、公钥无误。
42+
43+
随后,点击 **Add key** 按钮即可添加成功,如图:
44+
45+
![](https://github.com/wi1dcard/laravel-deployment/raw/master/src/images/bd9fa34c240e93c8f37991185f27cc76.png)
46+
47+
再次回到仓库主页,复制 SSH 协议的 Git 仓库地址备用:
48+
49+
![](https://github.com/wi1dcard/laravel-deployment/raw/master/src/images/42de43481c7d9b113c3780360d69ea0d.png)
50+
51+
## 更新与回滚
52+
53+
由于完全基于 Git 部署,因此我们可以「站在巨人的肩膀上」—— 借用 Git 的 `reset` 功能实现更新、回滚到任意提交。
54+
55+
首先,在服务器中执行以下命令,将文件所有者设置为我们手动创建的新用户:
56+
57+
```bash
58+
$ su root -c 'chown -R deployer /var/www/deployment'
59+
```
60+
61+
将远端的 HTTPS 协议地址修改为 SSH 协议地址:
62+
63+
```bash
64+
$ cd /var/www/deployment
65+
$ git remote set-url origin 'git@github.com:wi1dcard/hello-deployment.git'
66+
```
67+
68+
其中,`git@github.com:wi1dcard/hello-deployment.git` 请替换为刚刚复制的仓库地址。
69+
70+
接下来,使用 `git fetch` 命令获取远端状态(但不拉取到本地):
71+
72+
```bash
73+
$ git fetch -t -v
74+
```
75+
76+
其中,`-t` 代表除提交历史外,同时获取标签(Tags);`-v` 代表开启 Verbose Mode,直译为「啰嗦模式」,通常表示输出更多详细信息。
77+
78+
> 提示:`-v` 选项不仅可用于 `git fetch`;在其它 Git 操作、甚至许多 Unix 命令中,都用于表示开启啰嗦模式。
79+
80+
稍等片刻,你可能会看到这样的输出:
81+
82+
```
83+
The authenticity of host 'github.com (13.250.177.223)' can't be established.
84+
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
85+
Are you sure you want to continue connecting (yes/no)?
86+
```
87+
88+
还记得第一次登录服务器时的提示吗?与此处的询问相同,输入 `yes` 即可。
89+
90+
如果服务器上的 Git 仓库与 GitHub 上的仓库不存在差异,那么输出将会类似:
91+
92+
```
93+
From github.com:wi1dcard/hello-deployment
94+
= [up to date] master -> origin/master
95+
```
96+
97+
如果 GitHub 上存在更新的提交,那么输出将会类似:
98+
99+
```
100+
remote: Enumerating objects: 4, done.
101+
remote: Counting objects: 100% (4/4), done.
102+
remote: Compressing objects: 100% (1/1), done.
103+
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
104+
Unpacking objects: 100% (3/3), done.
105+
From github.com:wi1dcard/hello-deployment
106+
602fa83..9a69730 master -> origin/master
107+
```
108+
109+
此时,本地已经得到了远端的提交历史信息;尽情使用 `git reset` 命令随意更新或回滚吧。
110+
111+
例如:
112+
113+
- 穿越到远端 master 分支的倒数第一次提交(即最新提交),通常用于更新至最新代码。
114+
115+
```bash
116+
$ git reset --hard origin/master
117+
```
118+
119+
- 穿越到远端 master 分支倒数第三次提交,通常用于回滚一部分错误提交。
120+
121+
```bash
122+
$ git reset --hard origin/master~2
123+
```
124+
125+
- 穿越到 ID 为 602fa83 的提交,通常用于回滚到特定版本。
126+
127+
```bash
128+
$ git reset --hard 602fa83
129+
```
130+
131+
- 同理,亦可回滚至任意本地分支、标签、HEAD 等...
132+
133+
> 注意:`origin/master~2` 实际上是表示 `origin/master` 的首个父提交的首个父提交,多数情况下可理解为倒数第三次提交,但这两个概念并不相等。有兴趣请阅读 Git 相关书籍,此处不再展开。
134+
135+
最后,由于国内网络环境的特殊性,执行以上 Git 命令可能稍有卡顿,若项目较大则更加明显,可尝试 Gitee 等国内平台,虽然功能不如 GitLab 强大,生态不如 GitHub 完善,但至少... 速度飞快。
682 KB
Loading
518 KB
Loading
646 KB
Loading
549 KB
Loading

0 commit comments

Comments
 (0)