利用 Github Action 自动更新 submodule
每次本博客的上游主题更新的时候,都要手动更新一下 submodule,都 2021 年了,我选择自动化。
一、设置 token
1.1 生成一个新的 token
在配置 Github Action 之前,我们需要新建一个供脚本使用的 token。
- 在任何页面的右上角,单击您的个人资料照片,然后单击 Settings(设置)。
- 在左侧边栏中,单击 Developer settings。
- 在左侧边栏中,单击 Personal access tokens(个人访问令牌)。
- 单击 Generate new token(生成新令牌)。
- 给 token 取一个好记忆的名字。
比如 Auto Update Submodule of blog.hexsix.me
- 设置 token 使用期限。
- 选择 token 使用范围。
把 repo 全部勾上,我们需要 repo 的读写权限。
- 点击 Click Generate token。
记住 token,马上就要用了
1.2 在项目内配置 token 变量
- 在你的仓库页面点击 Settings。
- 在侧边栏点击 Secrets。
- 点击 New repository secret(新建仓库 secret)。
- 给 secret 取一个名字。
这里我们取
CI_TOKEN
,之后会用到。如果你换了这个变量名,那之后也需要替换对应的地方。 - 填上我们上一节生成的 token。
- 最后点击 Add secret。
PS. 本节内容翻译自 https://docs.github.com/en/actions/security-guides/encrypted-secrets
二、配置 Github Action
- 在 Actions 页面新建 workflow。
- 找到
Skip this and set up a workflow yourself
。
name: 'Submodules Sync'
on:
schedule:
- cron: "0 2 * * *"
# Allows you to run this workflow manually from the Actions tab or through HTTP API
workflow_dispatch:
jobs:
sync:
name: 'Submodules Sync'
runs-on: ubuntu-latest
# Use the Bash shell regardless whether the GitHub Actions runner is ubuntu-latest, macos-latest, or windows-latest
defaults:
run:
shell: bash
steps:
# Checkout the repository to the GitHub Actions runner
- name: Checkout
uses: actions/checkout@v2
with:
token: ${{ secrets.CI_TOKEN }}
submodules: true
# Update references
- name: Git Sumbodule Update
run: |
git pull --recurse-submodules
git submodule update --remote --recursive
- name: Commit update
run: |
git config --global user.name 'Git bot'
git config --global user.email '[email protected]'
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
git commit -am "Auto updated submodule references" && git push || echo "No changes to commit"
其中
${{ secrets.CI_TOKEN }}
是我们刚刚配置的 token${{ secrets.GITHUB_TOKEN }}
和${{ github.repository }}
都是默认变量,不需要配置cron: "0 2 * * *"
表示每天 2:00 UTC 运行一次,你可以自定义这个时间
完成创建后立即运行一次,看看有没有问题吧。
如果你的 submodule 是自己的,链接里还展示了一种 submodule 里创建 Actions 主动推送形式更新 submodule 的方法,本文就不展开了。