本来视频和教程中已经说的很清楚了,但是自己动手的时候还是遇到了很多问题,记录一下。也希望可以帮到后续采坑的人。🧐

(先上结果)在历经了22次失败之后,第23次终于成功了

github action 简介

Github Action 是 GitHub 于 2018 年 10 月推出的一个 CI\CD 服务。(持续集成、持续交付、持续部署)
我的理解就是:通过监听仓库一系列如推送的动作,进而在github环境中创造出类似虚拟机的环境(如开发环境一样),安装依赖(nodejs、hexo-cli),执行命令如 npm run build 、hexo三件套等。

Github Action 使用教程

首先我们要明确目的,自动部署,就是要 在github收到我们的动作 (我用的是提交 )时,实现云端执行如本地一样的动作

准备工作

方便管理,我推荐项目源码和生产环境使用两个仓库,因为<name>.github.io是开放仓库,所以不想展示源码,最好使用私有仓库管理,然后通过生成dist & public 的方式推到开放仓库,进行项目展示。
使用私有仓库最主要的原因就是安全,因为在action配置中会用到 Token ,如果 Token 被盗用,别人可以操作你的 github 仓库内容,造成不必要的麻烦。
一般使用hexo的话,hexo g -d 配置好会自动上传 public 到开放仓库,无需自己push。
今天演示的是 github action 推送到开放仓库,所以要准备好两个 仓库。

创建私有仓库

点击图片查看大图

  • 进行源码推送到仓库。

准备action环境

  • 切换到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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    name: 自动部署
    # 当有改动推送到master分支时,启动Action
    on:
    push:
    branches:
    - main
    #2020年10月后github新建仓库默认分支改为main,注意更改
    release:
    types:
    - published

    jobs:
    deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout Repository main branch
    uses: actions/checkout@v3
    with:
    ref: main

    - name: install nodejs
    uses: actions/setup-node@v3.4.1
    with:
    node-version: "16.x"

    - name: 安装 Hexo
    run: |
    export TZ='Asia/Shanghai'
    npm install hexo-cli -g

    - name: 安装依赖
    run: |
    npm install

    - name: 生成静态文件
    run: |
    hexo clean
    hexo generate

    - name: 部署到Github
    uses: JamesIves/github-pages-deploy-action@v4
    with:
    token: ${{secrets.IO_SSH}} # 接受推送的 public 公开仓库 - 这里别和源码私有仓库搞混
    repository-name: jia0213/jia0213.github.io
    branch: main
    folder: public
    commit-message: '${{ github.event.head_commit.message }} Updated By Github Actions'
  • 需要注意的是,yml中有几处需要调整为你项目中的实际数据:
    如分支 main -> master
    如其他依赖 在 install 里 增加命令 如 npm install gulp
    如repository-name 需要你实际的路径 如 <name>/.github.io
    token: $ github -> setting - accessToken

  • 最后一步部署的时候 with 里面有个 token ,这里需要注意,
    敏感字段一般使用环境变量来代替,方法如下:

  • 找到添加位置
  • 输入需要保密的 键和值 ,后面使用 ${{secrets.键}} 即可引用到 value
  • 而这里我们要在源码仓库推送到公开仓库进行部署,用到的 token用的是整个github仓库的操作权限的 token ,不然会报错 git 没有操作权限等相关问题
  • 新开窗口,我们接下来注册token
    访问 Github->头像(右上角)->Settings->Developer Settings->Personal access tokens->generate new token,创建的 Token 名称随意,但必须勾选 repo 项 和 workflows 项。
  • 回到 main.yml中,将token 替换为 刚才准备好的 变量引用,在工作流编辑界面右侧点击 start 即可

    至此,action 部署完成,如果成功执行,那就大功告成!

特别鸣谢:

坑1

上传源码之后,自动执行action时,报错无法解析hexo语法,查看仓库主题文件夹为空,图标上出现白色箭头。

坑2

执行action时报错,lockfileVersion@1版本问题,解决办法是通过node的版本与之匹配,node版本推荐 node-version: "16.x"

坑3

执行action时报错,(git)Warning: Permanently added the ECDSA host key for IP address ‘xxx.xxx.xxx’ to the list of known hosts. Permission denied (publickey) 执行git命时受到公钥SSH影响导致权限不够

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists

解决办法:

坑4

hexo 部署报错 spawn failed

    1. 出现
      failed
      1
      2
      3
      - fatal: in unpopulated submodule '.deploy_git' 
      - FATAL {
      err: Error: Spawn failed
      解决: 把根目录下的 .deploy_git 目录删除 再重新生成 、 提交
    1. 更多可能的因素和解决方案可以参考@洪总HEO写的方案:Hexo 错误:spawn failed 的解决方法

坑5

当添加公钥的时候出现了Key is invalid. You must supply a key in OpenSSH public key format github

  • 首先在本地生成key
    bash
    1
    ssh-keygen -t rsa -C "邮箱"
  • 执行之后会告诉你 生成的文件 位置和名称 我的是 C:\Users\Administrator/.ssh/id_rsa
  • 直接赋值粘贴 .ssh的文件会破坏格式,需要打开 所在.put文件所在文件夹中的git bash然后
  • 输入 clip < id_rsa.pub 文件名字打一半tab键可以自动补全
  • 回车之后成功执行,内容就复制在剪切板了
  • 添加ssh key 与 git进行绑定
  • 点击头像
  • 增加到配置中

坑6

  • 一样的配置,这次提交就错了 报错信息:
    Error: The deploy step encountered an error: The process ‘/usr/bin/git’ failed with exit code
    解决方法如下