日期:2023年8月27日标签:DeveloperHandbook

初次使用 Github 的 SSH DeployKey #

最近重构了下网站,把网站从腾讯云移到了 Github,在 Github 上,通过 Github Actions 实现网站的自动部署。

我重新写了个网站生成器(site-generator),能将指定文件夹下的 markdown 文件转换为静态的 html 文件。

将 markdown 转化为 html 页面

然后将生成的 html 页面部署到 Github Page 中 即可。

用 Github Actions 实现自动部署 #

使用 Github Actions 可以自动化这一过程。通过 Github Actions 你可以在对 Github 特定 repo 做出某个更新时,自动执行一些特定的任务,例如我想在 site-generator 仓库中的 main 分支提交了代码时,Github 能为我自动执行打包部署命令。

我可以这么做,达到我的目的,首先创建 .github/deploy.yml

name: deploy
on:
  push:
    branches:
      - main
jobs:
  deploy-to-github-page:
    # 指定 Github Action 运行环境
    runs-on: ubuntu-latest
    steps:
    # 执行 step:安装依赖
      - name: Install dependencies
        run: npm i # 要执行的命令
    # 执行 step: 打包和部署
      - name: Build And Deploy
        run: | # 需要执行的多行命令
          npm run build
          npm run deploy

.github/deploy.yml 提交到 github repo 后,github action 会自动执行。Github Action 具体细节这里不做赘述,感兴趣的可以阅读官方文档。

在 Github Action 中将文件 push 到另一个仓库 #

我想在 Github Action 中做以下几件事:

1. 用 site-generator 将 markdown 文件转换成静态 html 页面
2. 将生成的 html 页面 push 到 site 仓库,site 仓库开启了 Github Pages 功能,可以通过浏览器访问

但是我在做第二件事时,遇到了困难,当我执行 git push 命令时,Action 报错了,提示我没有权限,无法访问(unable to access...)。

使用 SSH Depolykey 解决问题 #

查阅了一些资料,终于找到了解决问题的方式。

  1. 生成 SSH Key 文件
$ ssh-keygen -t ed25519 -C "your_email@example.com"

-t ed25519 是 github 官方推荐使用的选项。

ssh-keygen 命令会提示生成密钥文件的路径名称,建议取一个比较容易记得名称,例如 id_github_repo_site

命令结束后会生成两个文件私钥 id_github_repo_site 和公钥 id_github_repo_site.pub

  1. 将私钥和公钥添加到 github repo 中

我需要在 site-generator 仓库中将文件 push 到 site 仓库中,那么我需要把公钥添加到 site 仓库中(即目标仓库),将私钥添加到 site-generator 仓库中。

在 site-generator 仓库的 settings 面板中找到 Secrets and variables/Actions,然后添加一个 KEY,内容为刚刚生成的私钥文件内容。名称也是任意,但是需要记住,等会需要用到。

github secrets and variables

在 site 仓库的 settings 面板中找到 Deploy Keys,然后添加一个 DEPLOY KEY,内容为刚刚生成的公钥文件内容,名称随意,建议取一个比较好记的名称。

github deploy keys

  1. 使用刚刚添加的私钥进行身份验证

在 Github Action 中通过 ${{secrets.REPO_SITE}} 引用刚刚添加的密钥进行身份验证,REPO_SITE 为刚刚添加到 site 仓库的 key 名称。

- name: Push to site
    uses: cpina/github-action-push-to-another-repository@main
    env:
      SSH_DEPLOY_KEY: ${{secrets.REPO_SITE}}
      ...

(完)

目录