封面:一緒に爆発しろ❤(Pixiv ID:46262787)
我目前使用 GitHub repo 作为 OSS,配合 jsDelivr 实现访问速度优化,这在之前已经说过:
但是我目前的方案要求我在更改文件后重新发一个 release,由于是不同的 release,jsDelivr 会认为数据是不互通的,相当于我整体刷新了缓存,初次访问会变慢。
而且每次推上去之后还要发版……虽说也就是鼠标点两下,但果然还是好麻烦。干脆整个 GitHub Actions,让它在我 push 之后自动发版,顺便把整个 repo 全请求一遍来 force cache。
关于 GitHub Actions 的教程,官方有详细的文档(也有部分中文版本,没仔细看),这里 link 一个 Workflow 的写法:Workflow syntax for GitHub Actions - GitHub Help
这个 Workflow 是 GitHub Actions 的概念,直译是“工作流”,.github/workflows/
下的每个 .yml
文件都描述一个 Workflow。
Workflow 有一个 on
属性,规定了这个 Workflow 的触发事件。可以是对特定分支或 tag 的 push、pull request,也可以设置为定时任务。Workflow 下还有 Job 的概念,一个 Workflow 下一般有多个 Job。再之后就不具体展开了,官方文档中比我讲的清楚。
下面开始着手整这个 Workflow。
# Auto release and force cache
name: Auto release and force cache
# Controls when the action will run. Triggers the workflow only on push
# events but only for the master branch
on:
push:
branches: [ master ]
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
# Auto release
- name: Auto release
uses: marvinpinto/action-automatic-releases@latest
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
automatic_release_tag: ${{ github.run_id }}
prerelease: false
title: ${{ github.run_id }}
# Force cache
- name: Force cache
run: |
function scan() {
for e in `ls $1`
do
object=$1"/"$e
if [ -d $object ]
then
scan $object
else
curl -s -o /dev/null --retry 5 "https://cdn.jsdelivr.net/gh/wuxianucw/ucw-desu@master"${object:1}
url="https://cdn.jsdelivr.net/gh/wuxianucw/ucw-desu@${{ github.run_id }}"${object:1}
code=`curl -s -o /dev/null --retry 5 -w %{http_code} $url`
echo "Force cache "$url" [ "$code" ]"
if [ $code != "200" ]
then
url="https://cdn.jsdelivr.net/gh/wuxianucw/ucw-desu@master"${object:1}
echo " - Try master "$url" [ `curl -s -o /dev/null --retry 5 -w %{http_code} $url` ]"
url="https://cdn.jsdelivr.net/gh/wuxianucw/ucw-desu@${{ github.run_id }}"${object:1}
echo " - Retry "$url" [ `curl -s -o /dev/null --retry 5 -w %{http_code} $url` ]"
fi
url="https://cdn.jsdelivr.net/gh/wuxianucw/ucw-desu"${object:1}
echo " -> "$url" [ `curl -s -o /dev/null --retry 5 -w %{http_code} $url` ]"
fi
done
}
scan .
整好了。下面我们来细品一下。
name
是 Workflow 的名字,我整了个“自动发版并强制缓存”,这个可以自定义,按需即可。
on
设置了触发的条件,push 到 master 分支时触发。
只有一个名为 build
的 Job,在 Ubuntu 最新版环境下运行。首先必须 checkout,以便后续操作;然后使用现成的轮子 marvinpinto/action-automatic-releases,它支持自动发版或替换已存在的同名版,发了一个 tag 为当前 Workflow run_id
的版(此时会有邮件提示);之后就是 Force cache,因为我比较懒,所以直接往里面塞 shell 脚本了。
此时 commit,立刻就会触发。成功的效果大概是像这样的:
没有做中文路径支持,如果是中文路径则并不能有效刷新(但这并不影响 build passing)。同时由于以 .
开头的文件或目录默认是隐藏的,也不会进行刷新。
由于 jsDelivr 的神秘特性,有时可能出现暂时无法更新的情况,这时使用 repo@master
方式访问以及一点点耐心可能会有所帮助。
版权声明:本文是原创文章,版权归 无限UCW 所有。
本文链接:https://ucw.moe/archives/using-github-actions.html
本站所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由地转载和修改,但请务必注明文章来源并且不可用于商业目的。