--- title: "使用Github Action自动发布Hugo博客" date: 2024-02-19T10:13:18+08:00 categories: - 技术 - AI Workflow genres: - 人工智能探索 - Tutorial tags: - GPT-4 - Hugo - Github Action cover: image: "https://images.unsplash.com/photo-1699885960867-56d5f5262d38?q=80&w=2070&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt: "A picture of a computer" caption: "Node.js" relative: false draft: false ---

哲学与动机说明

新技术是一个巨大的壁垒,我自己是常常因为庞大的学习成本而自动劝退。

重新说回chatGPT的感想,也许会不断补充:

目前的大语言模型没有真实世界接口,或者说,并没有感觉器官和行动器官。因此,大语言模型暂时还代替不了行动。也许最好的应用就是辅助编程、写作、翻译、创作、解释之类。

chatGPT收集了40年以来人类上网的绝大部分知识,构成了一个庞大的知识库,我以为是目前我自己最佳的应用场景。

早晨和Emma聊天说,最近我已经不知道是否应该将自己使用chatGPT的经验记录在案。因为这些经验似乎都已经在chatGPT的训练数据中了。但后来一想,我所做的这些工作,按照单个任务而言也许不是太难,但将其整合在一起,实现我的目的,大概还是值得记录的。毕竟,prompt的精髓在于提示,否则大语言模型对于处境的无知,使其无法定义和完成任何任务。

我们又想,记录和上网本身就是在将经验反馈给全人类,无论如何,个体的经验都是独特的。

但对我个人而言,大语言模型目前趁手之处,在于快速构建一些用过就丢弃的脚本和工具。比如,我叫ChatGPT生成一个检索所有题目为"低端护教学"的文章,为我生成一个category,然后将这些文章归类在一个菜单之下,它可以很快就提供一个python脚本给我,甚至不需要我懂得python。而我只是通过调用和观看这些脚本,来学习一门新的计算机语言,观察ChatGPT如何借助frontmatter, 正则表达式,文件遍历等模块,简单地完成我提出的任务。

另一方面,如果没有ChatGPT的辅助能力,我大概再也无法回到编程世界。毕竟在我教导学生的时候,我就不断对他们说,任何计算机技术的生命周期都在6个月左右,如果无法跟进,大概一年以后一个程序员就面临被淘汰的危险。对于这样的认知而言,离开12年一线编程,几乎无法想象如何能够回去。计算机语言要求太多的细节,而工具集合的使用、配置也太过于复杂,在完成任何一个有价值的小任务之前,一个人大概必须储备大量的知识,花费大量的试错时间,产出大量无用而充满bugs的代码。

用一个庸俗的套话,chatGPT似乎赋能了我。我不再需要学习语言的细节,不再需要调试和跟踪代码运行状况(事实上,这几天的工作中我一次也没有debug过,甚至只有一次检查了linux的nginx日志文件)。从这个意义上讲,我的工作流已经和从前大为不同了。(其实,我在copilot搅扰之下,语言风格都有点变了吧,但写作速度得到极大提高,每一篇文章都会更长。)

也是在迁移网站的过程之中,我多多少少获得了一点信心,开始愿意尝试一些最近12-3年才出现的新技术(也就是说,在我离开这个行业之前,我大概是一无所知的工具和手段)。将hugo网站的开发环境部署到windows上,大概就算一个。自从1999年之后,我就没有用过windows来开发html网站了。大部分时候都是使用Linux + VIM,在服务器上玩。对于windows如何部署go语言,ruby包,hugo内存服务器,如果使用git和vs-code做主要的生产力工具,都是从前没有见过的新问题。

如果有一位熟练的伙伴结对编程,大概这些问题也能解决。但从时间和经济上看,我几乎一定会放弃这样的设想。但一旦踏入一个新的冒险领域,就像祭司们抬着约柜进入了汹涌的约旦河,后续的尝试就完全开放了。前面那些任务的成功,不仅是推进了项目的进展,而且也帮助我更信任chatGPT的知识提供,也知道它的局限性,或者说在使用过程中提升了我自己的"提示"能力。大体而言,在一个特定任务上,我不认为所谓"提示工程"的学习对我有什么好处。我把ChatGPT当作伙伴,所以什么都可以问它,而且是"自然地"使用语言,而不是刻意地提示。

举例而言,除了一些简单的问题,比如`“guide me through step 4, I want to know how to do it.”`,或者

Hugo website converted from wordpress. I had a menu in wordpress called ministry, under it had several submenus, like sermons, philosophy, young earth creation, home-schooling, and each has several dozen articles. And all the articles are normal posts under /content/posts. How to present this degisn in my new hugo website?</programlisting>

我就是大段地完全没有编辑地将错误信息dump给ChatGPT。在这个意义上,我是否在自己的任务上成为一个合格的提示工程师,我也不知道。或许专家们会嘲笑我吧,但目前为止我打算完成的任务大体上还是都完成了。

下面简单说一下我使用github action自动发布hugo博客的过程。

技术实现

昨晚回家之后,我随口问了chatGPT一句:

how to set a worker in github, when I commit and push something new to a hugo project, github will push it down to my ubuntu server then call a local hugo deploy script to automaticly update my website?

而在此之前,没有任何先念知识。它告诉我3个步骤:

  1. 设置服务器的ssh和自动更新脚本。

  2. 配置github action。

  3. 发布自动化过程。

但它告诉我的方案,是在github上运行hugo编译,然后将编译好的静态文件传到服务器上。这个方案是不对的,因为我的大量静态资源都是在wordpress时代生成的,因为数量过于庞大,无法存入github,所以都在服务器的硬盘上。

所以我告诉它说:

I don’t want to do this, because all my static resources are not in github. It’s in a ubuntu server. I want to push all projet to ubuntu and call a autodeploy.sh there.

于是它告诉我三个步骤:

  1. 在ubuntu上设置一个git仓库,然后在github上设置一个webhook,当有新的commit时,github会自动调用ubuntu上的脚本。

  2. 在ubuntu上设置一个webhook监听器,当有新的commit时,自动调用一个脚本。

  3. 配置本地的git仓库,将新的commit推送到ubuntu上。

自然,这也不是我要的: I prefer to use github as the bare git repo.

然后它告诉我:

使用github CI/CD,并指示我用github actions workflow来实现。它给的代码大体上是对的,不过细节上有许多坑。如果不知道这些坑的位置,就无法进一步要求chatGPT 为我解决问题。

比如,node.js的版本问题:actions/checkout@v2,这里最新的版本应该是v4。 gg 此外,ssh脚本涉及linux和git的权限、公钥和私钥配置,以及github action的secrets配置,我都是毫无所知的。长话短说,大概调试了10多轮,我才最终解决了`dial tcp :: i/o timeout`的问题。

当然,这也算是一种新的学习过程了,大概算是ChatGPT对我的反向有指导学习。比起看文档自己尝试或者通过stackoverflow,这个过程自然也与从前大为不同了。

简单记录一下,留作备份吧。