一、设置 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,马上就要用了

PS. 本节内容翻译自 https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-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

  1. 在 Actions 页面新建 workflow。
  2. 找到 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 'bot@noreply.github.com'
        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 运行一次,你可以自定义这个时间

完成创建后立即运行一次,看看有没有问题吧。

PS. 本节内容翻译自 https://stackoverflow.com/questions/64407333/using-github-actions-to-automatically-update-the-repos-submodules

如果你的 submodule 是自己的,链接里还展示了一种 submodule 里创建 Actions 主动推送形式更新 submodule 的方法,本文就不展开了。