使用GitHub Actions自动更新存储库的子模块

ghhkc1vu  于 2023-01-04  发布在  Git
关注(0)|答案(8)|浏览(251)

Title说明了一切。我尝试使用了一堆不同的git命令,比如git submodule update --remote --mergegit submodule foreach git pull origin master,它们在我的电脑上运行良好,但在GitHub操作上运行时就不行了。我尝试将git status添加到工作流中,状态只是显示“最新的origin/master,没有要提交的内容”或类似的内容。

6ioyuze2

6ioyuze21#

如果您需要通过GitHub操作自动更新对子模块的引用:

在父存储库中创建一个新工作流,以同步引用:

name: 'Submodules Sync'

on:
  # 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"

其中

  • CI_TOKEN是GitHub中的一个安全令牌变量,对父存储库具有“读写”访问权限,对子模块存储库具有“读”访问权限。

在子(子模块)GitHub操作中,通知父操作更改。

name: 'Submodule Notify Parent'

on:
  push:
    branches:
      - main    

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:
  notify:
    name: 'Submodule Notify Parent'
    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:
    - name: Github REST API Call
      env:
        CI_TOKEN: ${{ secrets.CI_TOKEN }}
        PARENT_REPO: <my_organization/my-app>
        PARENT_BRANCH: develop
        WORKFLOW_ID: <9999999>
      run: |
        curl -fL --retry 3 -X POST -H "Accept: application/vnd.github.v3+json" -H "Authorization: token ${{ env.CI_TOKEN }}" https://api.github.com/repos/${{ env.PARENT_REPO }}/actions/workflows/${{ env.WORKFLOW_ID }}/dispatches -d '{"ref":"${{ env.PARENT_BRANCH }}"}'

其中

  • PARENT_REPO -父存储库在Github中的名称(my_org/my_app,如果没有组织,则只使用my_app)。
  • WORKFLOW_ID -要通过rest API调用的父级Wofklow ID。要找到它,请使用CI_TOKEN运行curl:
curl -X GET -H "Authorization: token $CI_TOKEN" https://api.github.com/repos/$PARENT_REPO/actions/workflows

为每个子模块重复创建工作流。
对我来说,它工作得非常稳定。如果有的话,请用上面的逻辑添加关于现有github操作的信息。

ejk8hzay

ejk8hzay2#

您可以通过子模块存储库中的单个操作来实现此目的:

name: Send submodule updates to parent repo

on:
  push:
    branches: 
      - main

jobs:
  update:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with: 
          repository: org/parent_repository
          token: ${{ secrets.PRIVATE_TOKEN_GITHUB }}
          submodules: true

      - name: Pull & update submodules recursively
        run: |
          git submodule update --init --recursive
          git submodule update --recursive --remote

      - name: Commit
        run: |
          git config user.email "actions@github.com"
          git config user.name "GitHub Actions - update submodules"
          git add --all
          git commit -m "Update submodules" || echo "No changes to commit"
          git push

您需要:

通过此操作,子模块存储库中main分支上的每次推送都将导致一个提交,该提交将更新拉入父存储库。

f87krz0w

f87krz0w3#

现在一个更好的选择是利用Dependabot自动为子模块创建PR。
https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem
每天检查子模块是否已更新的示例:输入.github/dependabot.yml

version: 2

updates:
  - package-ecosystem: gitsubmodule
    schedule:
        interval: "daily"
    directory: /
ruyhziif

ruyhziif4#

简单的解决方案

递归地拉取和更新子模块,然后提交到repo。

name: Update submodules

# Controls when the action will run.
on:
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:
  # This workflow contains a single job called "update"
  update:
    runs-on: ubuntu-latest

    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2

      - name: Pull & update submodules recursively
        run: |
          git submodule update --init --recursive
          git submodule update --recursive --remote

      - name: Commit & push changes
        run: |
          git config --global user.name ${{ secrets.USER_NAME }}
          git config --global user.email ${{ secrets.USER_EMAIL }}
          git commit -am "Update submodules"
          git push

我没有使用像${{ secrets.USER_NAME }}这样的Github秘密,我只是硬编码我的git凭证,因为我很懒,但我想你可能会关心安全性。

zmeyuzjn

zmeyuzjn5#

你可以将你的GitHub Action源代码与submodule-branch-check这样的源代码进行比较,后者至少是一个git submodule update
检查update --remote是否足以从其自己的远程源拉入。

f45qwnt8

f45qwnt86#

它为我工作,在这里阅读文章https://zenn.dev/ymmmtym/articles/dc741561759a49

name: Update submodules
on:
  push:
    branches:
      - dev
  pull_request:
    branches:
      - dev
jobs:
  update_submodules:
    name: Update submodules
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
      with:
        token : ${{secrets.OOG_TOKEN}}
        submodules : true
    - name: Update submodules
      id: update
      run: git submodule update --remote --recursive 
    - name: Run git status
      id: status
      run: echo "::set-output name=status::$(git status -s)"
    - name: Add and commit files
      run: |
        git add .
        git config --local user.email "action@github.com"
        git config --local user.name "GitHub Action"
        git commit -m "Update submodules at $(date "+DATE: %Y-%m-%d TIME: %H:%M:%S")"
      if: ${{ steps.status.outputs.status }}
    - name: Push changes
      uses: ad-m/github-push-action@master
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        branch: dev
      if: ${{ steps.status.outputs.status && github.event_name == 'push' }}
uqcuzwp8

uqcuzwp87#

我试过了,对我很有效

- uses: actions/checkout@v3
      with:
        repository: {owner}/repo
        token: ${{ secrets.PRIVATE_TOKEN_GITHUB }}
        submodules: recursive

    - name: submodules recursively
      run: git submodule update --init --recursive
ca1c2owp

ca1c2owp8#

我能够实现@Droplet的解决方案!我扩展了它,使用如下矩阵更新多个使用子模块的父repos:

on:
  push:
    branches: 
      - master

jobs:
  update_parent_repos:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        parent_repo: [parent_repo_1, parent_repo_2]

    steps:
      - uses: actions/checkout@v3
        with: 
          repository: myriadgenetics/${{ matrix.parent_repo }}
          token: ${{ secrets.ACTIONS_TOKEN }}
          submodules: 'recursive'
      - name: Pull & update submodules recursively
        run: |
          git submodule update --init --recursive
          git submodule update --recursive --remote
      - name: Commit
        run: |
          git config user.email "actions@github.com"
          git config user.name "GitHub Actions - update submodules"
          git add --all
          git commit -m "Update submodules" || echo "No changes to commit"
          git push

如果不是ubuntu-latest,您必须为您的用例的操作运行器使用正确的标签,将parent_repo_1parent_repo_2更新为您想要在其中更新子模块的父repos的名称,并为您的用例使用正确的令牌名称。出于某种原因,我必须包括submodules: 'recursive',否则在“Pull &”中运行命令时会遇到问题递归更新子模块”。

相关问题