每一年,每当我想发一些文章的时候,我都会和这个文章发布流程搏斗一番。 要么主题出了个 Breaking Change 导致构建错误,要么哪里莫名其妙配置变了。 今年也不例外,今年的主题是,如何用 Github Action 来自动地构建与发布文章。

这本来是一个已经解决的问题,至少在一年之前,这个流程是完全能够跑通的。但是不知道从什么时候, 在 repo URL 中通过 username@ 的方式携带 Personal Access Token (PAT)的方式已经行不通了, 会报错。

1
2
3
4
5
6
7
8
9
fatal: could not read Password for 'https://***@github.com': No such device or address
FATAL {
err: Error: Spawn failed
at ChildProcess.<anonymous> (/home/runner/work/blog-backup/blog-backup/node_modules/hexo-deployer-git/node_modules/hexo-util/lib/spawn.js:51:21)
at ChildProcess.emit (node:events:513:28)
at Process.ChildProcess._handle.onexit (node:internal/child_process:293:12) {
code: 128
}
} Something's wrong. Maybe you can find the solution here: %s https://hexo.io/docs/troubleshooting.html

这是可能是因为 Github 不认携带在 URL 上的 PAT。转而向用户请求密码, 但是在 CI 环境里没有键盘这样的输入设备,然后就报错了。

hexo 官方的 hexo-deploy-git 在支持 token 方面也采用了上述方法。 即使正确配置 token,也会部署失败。hexo-deploy-git 在 token 配置上还有一些坑, 例如当 repo 字段是字符串时,token 字段是不生效的。只有在 repo 字段里面配置 token 字段才有效。

1
2
3
4
5
6
7
8
9
10
11
deploy:
type: git
repo: https://github.com/aaaa/bbb.git
token: '' # ❌

deploy:
type: git
repo:
github:
url: https://github.com/aaaa/bbb.git
token: '' # ✅

由于 PAT 现在只能够人工输入,在 CI 环境下做不到。所以,我们似乎只能转向使用 SSH 的方式来操作 git。

为 Github Action 创建一个 SSH

在本机创建一个 SSH Key,用 -C 参数注明要操作的 repo 的 git 链接。

1
ssh-keygen -C [email protected]:xxxx/yyy.git

执行生成一个新的 key,将公钥上传到 GitHub 账号的 SSH and GPG keys 中。务必注意, SSH key 的权限比 PAT 要高, 能够读写账户里所有的 repo。所以请务必像密码一样的保管私钥。

把私钥通过 repo 的 Secrets and variables 设置,在 action 下配置一个 Repository secrets, 假设 secrets 的名字是 SSH_PRIVATE_KEY。我们可以在 action 的 yaml 配置中用 ${{ secrets.SSH_PRIVATE_KEY }} 获得这个私钥。

在部署前增加一个配置 SSH 的 action

在部署前增加一个可以配置 ssh 的 action。 例如 webfactory/ssh-agent,yaml 配置如下:

1
2
3
4
5
6
7
8
9
jobs:
build:
runs-on: ubuntu-latest
steps:
# ...
- uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
# ... other build

修改 _config.yaml 中的 deploy 配置

deploy 中的 url 配置为 repo 的 SSH 链接, 例如 [email protected]:a/a.github.io.git

做完之后,hexo deploy 会切换为通过 SSH 的方式去发布文章。 绕过了 PAT 输入困难的问题。但是,前面提到过 SSH Key 的权限很高, 会丧失 PAT 可以限制权限的好处。谨慎使用。

转眼间又到了年末年初的时候了,又到了每年一度的年终总结的时候。回顾即将过去的 2021 年, 2021年可能是会载入史册的一年。但是对于我来说,而是「低潮」与「思考」的一年。

阅读全文 »

有时自己明明想写一篇文章来分享某个主题, 但是下笔之后总觉得哪里哪里都有点不完美,相较大牛的文章简直相形见绌, 于是失去了发布的勇气。久而久之,每当自己有些文章的念想时, 在潜意识里就会有拖延的倾向——「为什么要写文章?反正你又不发布」。 最后就是喜闻乐见的「下次一定」了。 不知道大家有没有相同经历,我自己是饱受这种想法的影响的。

阅读全文 »

今天,我打算开一个新的栏目——Thinking 来记录在生活中的一些思考。栏目中的文章主题不限于技术, 包含生活中的方方面面。(其实是因为长文太难写了,草稿箱里可能已经坑了20来篇了 (笑)。

那么栏目的第一篇,我打算聊一聊「自动化测试」。

阅读全文 »

去年的年终总结中, 我给自己立下了一个 flag——「参与开源项目,向知名开源项目提交至少一个功能性或者修复性 PR」。 我选择的是大名鼎鼎的Node.js。应该符合 知名开源项目。事不宜迟,赶快行动。

tl;dr; 本文介绍的是调试 Node.js 核心中 JS 侧的代码方法。 请注意,并是 Node.js 应用的调试哦。

阅读全文 »

在一些时候,我们希望 git 有不同的配置。 比如自己的开源或者私人项目用一套 git 配置,其中 user.namexyzuser.email[email protected] 公司项目用另外一套 git 配置,user.nameReal Nameuser.email[email protected]

git config 支持系统层级 --system、 用户层级 --global 与仓库层级(无选项)的配置。但是, 对于大量项目,手动地通过 git config 指定未免过于繁琐。 本文介绍了一种通过修改 git 的配置文件 .gitconfig,使用 [includeIf]某个文件夹下的所有 git 项目指定 git 配置的方法。

阅读全文 »

李华结束了一天的工作,过于劳累不想坐几个小时的地铁回家。李华打开了滴滴, 输入家的位置开始打车。

——「预估 40.5 元」

「哎」,李华轻叹了一声,放下手机,拖着疲惫的身体,缓缓向附近的地铁站走去。

经济关乎着我们每一个的生活。前几天,我在 v2ex 上看到一些关于房产税的讨论, 「如果国家决定征收房产税,对于房屋租金会如何改变?」, 不论立场而言,是一个很有趣的经济学问题。 答案也很简单,

tl;dr; 租金会稍微上涨,但是房产税的负担不会完全落到租客头上。

阅读全文 »

在编程入门的时候常会听说一句话:程序的本质是数据结构+算法。 在这句话中,我们可以看到程序中的两个至关重要的元素。逻辑数据。 这个两个元素联系非常紧密,但是特性却截然想法,如同阴阳中的两极一般,既对立又统一。

阅读全文 »

React Hooks在 2020 年已经不是前沿的概念了。 Hooks 已经可以很自然地融入日常工作中。在绝大部分情况下, Hooks + Function Component 完全可以满足需求。 Hooks 的设计是非常有想象力的,说实话,在 Hooks 出现之前, 我完全想不出来有那么优雅的方式来将逻辑和 UI 组件融合在一起。 赞美之词先到这里,很多介绍 Hooks 的材料,包括官方文档都会以 Hooks 与其相对应的 Class-based Component 的功能的比较来入门 Hooks 的核心概念。 这令人看起来,Hooks 像是 Class-based Component 的setState与生命周期的延伸。 其实不然,Hooks 创造出了一种更加声明式的编程范式。

阅读全文 »
0%