使用 GitHub Actions 解放双手,自动化工作流程

封面:一緒に爆発しろ❤(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

没有做中文路径支持,如果是中文路径则并不能有效刷新(但这并不影响 build passing)。同时由于以 . 开头的文件或目录默认是隐藏的,也不会进行刷新。

Auto release and force cache

由于 jsDelivr 的神秘特性,有时可能出现暂时无法更新的情况,这时使用 repo@master 方式访问以及一点点耐心可能会有所帮助。

最后修改:2020 年 05 月 22 日 11 : 06 AM
欢迎投食喵 ~

发表评论