Featured image of post GitHub实现自动更新子模块

GitHub实现自动更新子模块

当我们的仓库中使用到子模块,并且需要保持最新版本时,可以使用GitHub Actions实现自动更新。

导言

在开发较大规模的项目时,为了管理方便,我们通常会将项目拆分成多个子模块,使用不同的仓库进行管理,并使用Git的子模块(Submodule)功能引入到同一个主仓库中。

但是,由于不同的仓库分别管理提交记录(Commit)和版本,我们需要在引用的仓库中持续更新,以保证各个模块最新。在传统的版本管理中,我们需要将仓库拉取到本地,手动运行更新命令,然后再提交和推送。这种管理方式比较麻烦,而且手动操作有可能产生意料之外的错误。

GitHub Actions是一个基于GitHub仓库和Git工具的持续集成和部署自动化工具。直观来说,GitHub Action就是负责在某个事件发生时,在某个特定环境下,进行某些特定操作序列。

GitHub Actions

GitHub Actions运行的基本单元是工作流(Workflow),由.github/workflows/下的配置文件实现。在每一个工作流配置文件中,主要包含两部分:事件触发器和工作任务。工作任务部分可以包含多个任务(Job),每个任务包含多个步骤(Step)。需要注意的是,在每一个任务中,所有步骤必须在同一个环境下运行;而不同的任务间环境(包括文件)并不共享,而需要使用缓存(Cache)或成品(Artifact)进行共享。这也是GitHub Actions区分任务和步骤的原因。

方法

需要在仓库内的.github/workflows/目录下建立一个.yml文件,不妨命名为update_submodules.yml。需要注意的是,仅有默认分支下的工作流可以被执行,所以当你在其他分支修改工作流配置文件后,请同步到默认分支。

先给工作流命个名吧,在update_submodules.yml写入以下内容:

1
name: Update Submodules

事件触发器

我们定义两个事件触发器:手动运行和每15分钟自动运行。在update_submodules.yml写入以下内容:

1
2
3
4
on:
  schedule:
    - cron: "* * * * *"
  workflow_dispatch:

schedule事件触发器用于定时执行任务。其中的cron参数配置和Linux下cron命令配置文件格式一致。但需要注意的是,GitHub允许定时执行的最高频率是15分钟,且不保证一定能够运行。

workflow_dispatch事件触发器用于在Actions菜单中添加一个手动运行按钮。

工作任务

由于我们只需要一个环境,因此只需要一个任务。在update_submodules.yml写入以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
jobs:
  update_sdk:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Update submodules
        run: |
          git submodule update --init --remote
          git config --global user.name "github-actions[bot]"
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
          git commit -am "Update SDK" || exit 0
          git push || exit 0          

在第一个步骤(Checkout)中,我们签出仓库的默认分支,这类似于在本地运行git clone命令。

在第二个步骤(Update submodules)中,我们运行一系列命令,实现更新子模块、提交、推送。这里利用到一个有趣的特性,那就是GitHub Actions环境中必然有能读写仓库的密钥,因此不需要另外配置密钥。

保存、提交并推送,很快就能看到自动更新的运行效果了。

参考资料

  1. Git - git-submodule Documentation
  2. GitHub Actions Documentation - GitHub Docs
  3. Events that trigger workflows - GitHub Docs
  4. Workflow syntax for GitHub Actions - GitHub Docs
Built with Hugo
主题 StackJimmy 设计