部署 Github Page Site 的那些事情
目标
- 提交代码时自动部署
github page站点。 - 站点域名为自定义域名(非
{username}.github.io域名,username为自身 github 账号名称)。 - 采用
cdn加速资源,提高用户访问速度。
实现
自动部署 github page
对于 github page 部署,github 提供了两种方案:
通过自定义构建工作流(
workflow)来进行构建Github ActionsVitepress官方提供了Github Actions的方式来部署github page,点击 查看详情 获取更多资讯。在项目根目录下添加yaml模块(.github/workflows/deploy.yml):yamlname: Deploy on: workflow_dispatch: {} push: branches: - main jobs: deploy: runs-on: ubuntu-latest permissions: contents: read pages: write id-token: write environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - uses: actions/setup-node@v3 with: node-version: 16 cache: npm - run: npm ci - name: Build run: npm run docs:build - uses: actions/configure-pages@v2 - uses: actions/upload-pages-artifact@v1 with: path: docs/.vitepress/dist - name: Deploy id: deployment uses: actions/deploy-pages@v1需要注意以上
yaml模块中第6行(当本地代码push代码到main分支时执行 github 工作流)、第27行(github 工作流会执行npm run docs:build脚本来构建仓库)、第31行(将构建好的产物(路径:docs/.vitepress/dist)作为发布)。以上可以根据自身项目情况来做适当修改。当前项目修改配置模块如下:yamlname: Deploy on: workflow_dispatch: {} push: branches: - main // [!code --] - master // [!code ++] jobs: deploy: runs-on: ubuntu-latest permissions: pages: write id-token: write environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - name: Checkout uses: actions/checkout@v3 - name: Install pnpm uses: pnpm/action-setup@v2 // [!code ++] with: version: 7 // [!code ++] - name: Setup node uses: actions/setup-node@v3 with: node-version: 16 cache: 'pnpm' - name: Install dependencies run: pnpm install --frozen-lockfile // [!code ++] - name: Build run: npm run docs:build // [!code --] run: pnpm build // [!code ++] - uses: actions/configure-pages@v2 - uses: actions/upload-pages-artifact@v1 with: path: docs/.vitepress/dist // [!code --] path: .vitepress/dist // [!code ++] - name: Deploy id: deployment uses: actions/deploy-pages@v1由于
pnpm安装依赖速度快且拥有高效的利用磁盘空间的能力,因此在workflows中采用pnpm来做包管理器。 需要注意的是GitHub Actions运行器镜像中没有预先安装包管理器pnpm(不同于 npm 和 yarn)。因此工作区中需要包含pnpm/action-setup来安装pnpm。安装依赖使用了--frozen-lockfile的模式,因此workflows中所使用的pnpm版本需要和生成pnpm-lock.yaml时使用的pnpm版本一致(在此项目中使用的为v7.0)。还需要注意的是yaml- name: Install pnpm uses: pnpm/action-setup@v2 with: version: latest最新版本的
pnpm对应的是pnpm 8.0.0。那么该项目的
workflows就比较清晰了。每次代码push到master分支后会自动执行github工作流,工作流会自动安装7.0版本的pnpm,确定node版本(v16),安装项目依赖后执行pnpm build指令来构建当前仓库,将路径为.vitepress/dist的构建成功的产物进行上传并自动部署到github page站点上,那么就可以通过{username}.github.io静态页面。通过分支来自动部署
自定义域名配置
通过腾讯云购买所需要的自定义域名(以下以
vite.cn域名为例)。进入 DNS 解析 DNSPod 为
vrite.cn域名添加解析记录。在域名解析里添加一条
CNAME 记录(推荐),或者添加 4 条A 记录。CNAME 记录信息:
主机记录 记录类型 记录值 www CNAME xisenao.github.io A 记录信息:
主机记录 记录类型 记录值 www A 185.199.108.153 www A 185.199.109.153 www A 185.199.110.153 www A 185.199.111.153 Github 绑定域名
当前部署仓库
Settings->Pages->Custom domain填写已配置好的自定义域名(www.vrite.cn)。勾选下方Enforce HTTPS选项(在 2018 年 5 月 1 日之后,GitHub Pages 已经开始提供免费为自定义域名开启 HTTPS 的功能,并且大大简化了操作的流程,现在用户已经不再需要自己提供证书,只需要将自己的域名使用 CNAME 的方式指向自己的 GitHub Pages 域名即可。)。
到此为止就可以通过 https://www.vrite.cn 来访问 github page 站点了。
cdn加速
配置原理
原先的访问路径为 域名 -> DNS 服务器 -> Github 服务器,现阶段在其中添加一层 CDN 服务器 将整个流程串起来即可,那么访问路径就变为了 域名 -> DNS 服务器 -> CDN 服务器 -> Github 服务器。实现这样一条链路则需要做好 DNS 服务器 -> CDN 服务器 和 CDN 服务器 -> Github 服务器 的映射关系。同时还需要启用 CDN 服务器。
以腾讯云为例:
启用
CDN 服务器在
域名管理中添加加速域名
值得一提
- 所添加的域名需要做验证处理,腾讯提供了
TXT记录DNS解析验证和文件验证两种方式来确认域名归属。 - 加速区域为中国境外(访问用户为境外用户,包括中国香港、中国澳门、中国台湾等地区;)的域名无需做备案,而对于加速区域为
中国境内(访问用户为境内用户) 或全球(访问用户为境内和境外用户) 的域名需要做备案。 - 接入单域名时需要为
www.vrite.cn和vrite.cn两个域名做加速,也就是说需要配置两次。因为当访问vrite.cn时,github会自动跳转到www.vrite.cn,而在vrite.cn上配置的证书是无法使用到www.vrite.cn子域名上,因此若只配置了vrite.cn的证书后访问www.vrite.cn会提示站点证书失效。
- 所添加的域名需要做验证处理,腾讯提供了
CDN 服务器->Github 服务器配置
填写原站信息(需要加速的服务器地址)如下

cdn 配置好之后会获取到 cdn 提供的 cname 地址
3. DNS 服务器 -> CDN 服务器 配置
在域名的 DNSPod 中添加 CNAME 记录,其他的记录可以删掉。

为 vrite.cn 和 www.vrite.cn 配置证书
腾讯云可申请 50 个免费证书,提交证书申请中的域名验证方式默认为 自动DNS验证,但本次申请过程中发现自动在 DNSPod 中添加 CNAME 记录但一直校验失败,后通过人工客服审批过(未告知原因)。后续申请时可以考虑其他两种校验方式 手动DNS验证、文件校验。 证书在 24 小时内可以审批下来,之后可以为两个域名添加证书。

配置完成后过一会儿就可以正常访问站点。
WARNING
发现一个问题在cdn欠费的情况下,证书也会失效,因此在缴费完成后可以点击右侧 更新 按钮来重置证书。