搭建本地运行环境 完成之后,就可以将源码推送到远程仓库进行托管了,托管了之后就可以直接访问网站了,我选择的托管平台是 Github

整个流程是这样的,先创建3个代码仓库:

  1. hugo-blog-code 私有仓库,存放网站的源代码
  2. ludard.github.io 公有仓库,源码仓库编译生成好的博客网站
  3. comments-for-blog 博客的评论系统

这样将网站的源码和内容进行了公私分离,既保护了源码的私密性,又保证了博客内容的简洁性。

仓库调用顺序和关系:

  1. 本地代码调试好了之后提交到 hugo-blog-code 私有仓库,保证源码不外泄。
  2. hugo-blog-code 仓库配置 Github Action Workflow 生成并编译成网站,然后发布到 ludard.github.io 公有仓库
  3. ludard.github.io 仅存放博客内容,负责对外展示和访问
  4. comments-for-blog 仓库存储用户评论,和 ludard.github.io 仓库相绑定。

创建源码私有仓库

  1. Github 新建 New Repository

new_repo

  1. 创建完成之后复制仓库的地址:git@github.com:ludard/hugo-blog-code.git

    new_repo

  2. 打开 Git bash ,切换到博客所有目录,按下列命令将博客源码提交到私有仓库:

    1
    2
    3
    4
    5
    6
    7
    
    cd /d/github/myBlog
    git init  # 初始化源码
    git add .  #将当前目录添加到git
    git commit -m "Init Blog"  # 提交到本地git仓库
    git remote add origin git@github.com:ludard/hugo-blog-code.git  # 添加远程仓库地址
    git push -u origin main  # 将源码推送到github仓库
    git status  # 查看源码状态
    

    注意:在本地目录使用命令 git init 初始化时,默认分支名称是 master,而 github 仓库默认分支是 main。如果推送报错:

    error: src refspec main does not match any. error: failed to push some refs to ‘git@github.com:ludard/hugo-blog-code.git’

    blog_push_err

    说明本地仓库和远程仓库分支名称不一致造成的。有两种解决办法:

    1. 强制推送 git push --force 不推荐

    2. 将本地仓库分支重全名,和远程仓库分支一样:git branch -m oldBranchName newBranchName

    3. 按以下步骤解决:

      • 执行git clone git@github.com:ludard/hugo-blog-code.git 将远程仓库下载到本地

      • 将本地源码内容复制合并到 hugo-blog-code 目录

      • 切换到 hugo-blog-code 目录,此时分支名称就是 main

      • 依次执行以下命令:

        1
        2
        3
        4
        
        cd hugo-blog-code/
        git add .
        git commit -m "Init Blog"
        git push  #因为clone下来的,可以直接push,不需要添加远程仓库
        

      blog_commit

查看 hugo-blog-code 仓库,源码已经提交了

blog_push

创建博客公有仓库

打开 Github 个人主页,新建 New Repository,仓库名称是 ludard.github.io

注意,这个公开仓库有2点需要注意:

  1. 仓库名称有固定的格式,用户名 ludard + .github.io。一个用户名仅能创建一个这样的仓库,创建好之后就可以直接作为博客使用了。博客域名就是 https://ludard.github.io
  2. 一定要是公开仓库,因为这个博客是供对外访问的,如果私有就无法访问了

git_public

创建好之后,就可以将仓库名称作为网址访问了

git_public

新建博客内容分支

创建好仓库后再创建一个分支专门用来接收从私有仓库推送过来的博客内容, 这样主分支看起来简洁一些。

打开 ludard.github.io 仓库,点击 main 主分支,搜索 gh-pages 分支,如果没有就点击 Create branch 创建分支

github_setting

github_setting

再打开仓库的 Settings 设置 -> Pages,Source 选择 Deploy from a branch,Branch 选择 gh-pages,然后点击 Save 保存

github_setting

创建 PAT 配置私库连接公库

Personal Access Token(PAT) 创建PAT的主要目的是授权给私有仓库访问写入目标仓库的权限,可以让私有库的actions推送构建好的代码到目标仓库。

PAT 有两种级别:

  • 全局 可以访问所有仓库。在个人账户页面配置,Profile Photo -> Settings -> Developer settings -> Personal access tokens -> Generate new token
  • 仓库级 只能访问一个仓库,在被访问仓库的 Deploy key 创建

因为推送是从 私有仓库 hugo-blog-code 推送到 公有仓库 ludard.github.io,所以需要在 ludard.github.io 仓库上配置 Deploy keyhugo-blog-code 访问,在 hugo-blog-code 仓库上配置 Action 负责编译推送代码。

创建Deploy key

配置 Deploy key 需要 SSH Key,所以先生成密钥对。

  1. 打开 Git bash ,创建密钥对:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$ ssh-keygen -t rsa -C "ludard@outlook.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Ludard/.ssh/id_rsa):  .ssh/blogkey
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in .ssh/blogkey.
Your public key has been saved in .ssh/blogkey.pub.
The key fingerprint is:
SHA256:On4M4msd2DnkDlIflCNqQQ8gwpDqYrRs9O7j2VtBHYI ludard@outlook.com
The key's randomart image is:
+---[RSA 2048]----+
|B+o   .o .       |
|+..o.E+ o .      |
|.  o.o o .       |
|.oo . +          |
|=.o. * +S        |
|.*..+ O..        |
|+ .o =o*         |
|   o=.+.o        |
|  o=o+o.         |
+----[SHA256]-----+

备注:

ssh-keygen -t rsa -C "ludard@outlook.com" 创建密钥,邮箱必须与Github账户邮箱一致 Enter file in which to save the key 密钥文件名称和位置 Enter passphrase 密钥的密码,每次连接仓库时都需要输入验证

密钥的密码一定要为空,我因为这个问题查了一天资料,最后才想通在自动化时不能输入也没法配置代理,所以一直无法推送到公有仓库。

更多密钥类型可以参考官方文档 generating-a-new-ssh-key

git_ssh_key

执行成功后会在 Enter file in which to save the key 目录下创建2个文件:blogkeyblogkey.pub,其中 blogkey 是私钥,blogkey.pub 是公钥。如果只输入了文件名称没有目录,又在用户目录执行,所以这2个文件就在用户目录下,也就是 C:\Users\Ludard 目录。

  1. 打开 ludard.github.io 公有仓库 -> Settings -> Deploy keys -> Add deploy key

    密钥管理可以参考官方文档 managing-deploy-keys

    github_deploy_key

    Title 密钥名称填写 ACTIONS_DEPLOY_KEY (这个名称有私库配置公钥时还要用到),Key 填写 blogkey.pub 公钥文件内容。注意要勾选下面的 Allow write access 给予访问权限。

    注意:

    1. 如果担心手动复制有空行或其它问题,可以使用命令 $ clip < .ssh/blogkey.pub$ clip < .ssh/blogkey 复制到系统粘贴板再粘贴到网页文本框
    2. Key 可以使用公钥内容,也可以使用 key fingerprint,也就是 SHA256:On4M4m... + 邮箱
    3. 配置 Deploy key 完成时需要 Github 账户密码验证

    github_deploy_key

    github_deploy_key

  2. 打开 hugo-blog-code 源码私有仓库 -> Settings -> Secrets -> Actions ,再点击 New repository secret 按钮新建密钥

    github_deploy_key

    密钥名称和 PAT 一样填写 ACTIONS_DEPLOY_KEY (这个名称就是 SECRETNAME ,在配置 Workflow yml 时还要用到),Secret填写 blogkey 私钥文件的内容

    github_deploy_key

    github_deploy_key

配置 Github Action Workflow

从私有仓库编译推送到公有仓库

Github Action Workflow yaml包括如下几个部分:

  • Checkout 拉取源码
  • Setup Hugo 编译Hugo博客
  • Run Hugo 构建网站,生成内容
  • DeployGitHub Pages Deploy Action 将网站内容发布到目标仓库

hugo-blog-code 私有仓库打开 Actions 页面,然后再打开 Simple workflowConfigure 进入配置面。

更多 Github Actions 语法可以参考 GitHub Pages action

git_actions

git_actions

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 编译生成博客,推送到博客仓库

name: Hugo Build & Deploy

# Controls when the workflow will run
on:
  # 接收到推送自动推送到公开仓库
  push:
    branches: [ "main" ]
  pull_request:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          submodules: true  # Fetch Hugo themes (true OR recursive)
          fetch-depth: 0    # Fetch all history for .GitInfo and .Lastmod

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: 'latest'
          # extended: true

      - name: Build
        run: hugo --minify

      - name: Deploy to Github Pages
        uses: peaceiris/actions-gh-pages@v3
        with:
          deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
          external_repository: ludard/ludard.github.io
          publish_branch: gh-pages  # default: gh-pages
          publish_dir: ./public     # The folder the action should deploy.

编辑好配置后点击页面右边按钮 Start commit 输入文件名称的描述,再点击 Commit new file 保存工作流配置文件。

git_actions

保存后,在项目目录下会多了一个 .github/workflows/blog-builder.yml 的文件

git_actions

然后 hugo-blog-code 仓库接收到代码后 Action Workflow 就会自动运行部署

github_deploy

等待运行完成再打开 ludard.github.io 仓库就可以看到博客内容已经推送过来了

github_deploy

再等待仓库的状态变成绿色就可以打开网址 https://ludard.github.io ,看到最新博客内容了

github_deploy

如果没有自已的域名,使用 https://ludard.github.io 域名就可以创作使用了。

参考资源

GitHub Pages action

GitHub Actions for Hugo

https://finisky.github.io/deployhugofromprivaterepo/

https://itlab1024.com/archives/165.html