|
| 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 | + |
| 34 | + |
| 35 | +> 提示:其它 Git 托管平台操作类似,可搜索类似 `GitLab deploy keys` 等关键词查找对应文档。 |
| 36 | +
|
| 37 | +在 Title 内给公钥起个名字;在 Key 中粘贴刚刚复制的公钥文本,例如: |
| 38 | + |
| 39 | + |
| 40 | + |
| 41 | +> 注意:除非必要,页面下方 Allow write access 复选框请勿选中,否则该密钥将具备推送权限。另外,密钥保存后无法修改,如需变更只能重新创建,因此务必确保命名规范、公钥无误。 |
| 42 | +
|
| 43 | +随后,点击 **Add key** 按钮即可添加成功,如图: |
| 44 | + |
| 45 | + |
| 46 | + |
| 47 | +再次回到仓库主页,复制 SSH 协议的 Git 仓库地址备用: |
| 48 | + |
| 49 | + |
| 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 完善,但至少... 速度飞快。 |
0 commit comments