近期,我为个人的三个仓库分别添加了 GitHub Action 作为CI,此前我也使用过 Travis CI作为CI服务(见 Rhilip/pt-gen-cfworker),但此次尝试仍有部分地方觉得很有意思,便于此记录。这三个仓库及其使用Action的目的分别如下:
- https://github.com/Rhilip/od_share_frontend : 基于Vue的gh-page自动构建及部署
- https://github.com/Rhilip/ipv6wry.db: 使用crontab定时更新
- https://github.com/Rhilip/Bencode: PHPUnit自动测试并生成coverage报告上报至 codacy
基于Vue的gh-page自动构建及部署
Action文件示例: https://github.com/Rhilip/od_share_frontend/blob/master/.github/workflows/gh-pages.yml
Vue的这个稍显简单,主要的部分参见了 GitHub Pages action · Actions · GitHub Marketplace 中的Vue站点部署章节。稍微有些不同的是,示例里面的依赖安装以及cache使用了npm,但我实际应该使用yarn作为依赖安装的工具。
所幸,上面 React and Next 的示例部分就说明了yarn的依赖安装和cache使用,仅简单修改适配便可以使用。

使用crontab定时更新
Action 文件示例:https://github.com/Rhilip/ipv6wry.db/blob/master/.github/workflows/update.yml
ipv6wry.db这个仓库的自动更新文件算是我写的第一个的action.yml了,所以写的磕磕绊绊的(6次commit)
首先,作为一个定时脚本,在.github/workflows中push成功之后,在Action面板中不能看见。必须等到设定的时间之后才能显示出来,再加上初次书写,查看 GitHub Action 的帮助文档多次后,才写出一个结果目前看起来正常的workflow。

这个workflow的基底是仓库中原有的 update_ipv6wry.sh ,伪代码片单简单示例如下:
1 | # 变量定义 |
在将其转换为GitHub Action之后,变量定义移动至 env 节中,并使用 ${{ env.key }} 方法进行调用;而目录跳转(用于bash中)以及temp目录指定,则直接使用 ${{ github.workspace }} 以及 ${{ runner.temp }}
此外,因为 Github Action使用的Ubuntu 18.04中默认已经安装了 7zip以及jq 库,所以相关依赖也不需要进行安装。那么,如何判断确定是否存在更新,仍然使用了if方法(step级别):
1 | - name: Get last version |
首先,两个 step (last-history 和 current-history) 分别获得两个输出,在进入 step unpack-new的时候,通过 if 进行判断,判断结果成立才运行对应step。值得注意的是,最早step中 if 写成了bash中的写法 ${{ steps.current-history.outputs.now }} -gt ${{ steps.last-history.outputs.last }} 。直接报错:Workflow Error,具体错误栈如下:
1 | ### ERRORED 00:09:50Z |
后面修改成直接判断 steps.current-history.outputs.current > steps.last-history.outputs.last才正常。可见在 if 段对字段的调用,不需要像run 段中一样。
至于这个脚本,后面三段 ( Unpack New version、 Commit files、 Push changes)能否正常运行,我也不清楚,毕竟从目前结果来看,这三段现在都处在不运行的阶段。。。。

PHPUnit自动测试并生成coverage报告上报
Action 文件示例: https://github.com/Rhilip/Bencode/blob/master/.github/workflows/codacy-analysis-cli.yml
Bencode是本人写的Bencode库,原本打算是为了给ridpt、ob、tjupt等项目以composer库的形式统一提供以方便维护。在有人提出添加测试 (#1)之后,便为此添加相关测试以及测试覆盖率报告。
这个workflow一开始不知道在写些什么,从Market中搜到有个action可以使用就直接对着抄了,没想到自己composer install都没做。。。。 (@b4b38ba)
1 | name: codacy-analysis-cli |
另外有个原因就是由于 mrfyda/codacy-analysis-cli-action 这个模板使用了Docker,导致运行时间过长。在重新查阅codacy相关说明之后,决定抛弃这个模板。改成直接运行。

最终生成的workflow.yaml如下:
1 | name: covered-cli |
其中 CODACY_PROJECT_TOKEN 在Codacy面板获取之后填入仓库的secerts中。
目前来看测试的覆盖率还可以:

