如何在GitHub Actions中使用不同SSH密钥拉取多个私有子模块
解决方案
问题原因
你原来的写法存在两个核心问题:
- 重复调用
actions/checkout动作时,第二次执行会重置工作区的Git状态与全局SSH配置,第一次配置的子模块拉取结果会被覆盖 actions/checkout的ssh-key参数是全局生效的Git SSH凭证,无法对应到单个子模块的独立权限配置
修复后的完整工作流配置
jobs: your-job-name: runs-on: ubuntu-latest steps: # 第一步:先拉取主仓库,不拉取子模块 - uses: actions/checkout@v4 with: submodules: false # 第二步:写入多份SSH密钥并配置SSH路由 - name: 配置子模块专属SSH密钥 run: | # 写入两个子模块对应的SSH私钥 echo "${{ secrets.REPO_1 }}" > ~/.ssh/repo1_key echo "${{ secrets.REPO_2 }}" > ~/.ssh/repo2_key chmod 600 ~/.ssh/repo1_key ~/.ssh/repo2_key # 配置SSH主机规则,不同域名对应不同密钥 cat > ~/.ssh/config << EOF Host repo1-github HostName github.com User git IdentityFile ~/.ssh/repo1_key StrictHostKeyChecking no Host repo2-github HostName github.com User git IdentityFile ~/.ssh/repo2_key StrictHostKeyChecking no EOF # 第三步:修改子模块远程地址匹配SSH路由规则 - name: 替换子模块远程地址 run: | # 请将下面的<子模块1本地路径>、<子模块1仓库地址>替换为你实际的配置 git config submodule.<子模块1本地路径>.url git@repo1-github:<子模块1仓库地址>.git # 同理替换子模块2的配置 git config submodule.<子模块2本地路径>.url git@repo2-github:<子模块2仓库地址>.git # 如果你不清楚子模块的路径和地址,可以查看项目根目录下的.gitmodules文件获取对应值 # 第四步:拉取所有子模块 - name: 拉取子模块 run: git submodule update --init --recursive
注意事项
- 存储到GitHub Secrets中的
REPO_1、REPO_2必须是完整的私钥内容,包含首尾的-----BEGIN OPENSSH PRIVATE KEY-----和-----END OPENSSH PRIVATE KEY-----标记 - 两个私钥对应的公钥需要分别添加到两个私有子模块仓库的部署密钥中,且要勾选读取权限
- 如果不需要递归拉取子模块的嵌套子模块,可以去掉
git submodule update命令的--recursive参数
内容的提问来源于stack exchange,提问作者This-is-patriiick
相关产品推荐
相关产品推荐

