CI项目用到submodule问题解决
最近在自己尝试写一个FastAPI的项目, 其中用到了Git的Submodules功能和Gitlab的CI功能, 这两个组合就出现了一些坑, 记录一下
Gitlab-CI & Git submodule的组合
项目目录结构
其中utils下的两个package为其他项目,
并添加到了主项目的submodule里面, 本地构建dockerimage不会报错,
使用CI就会报错
.gitlab-ci.yml
1 | # This file is a template, and might need editing before it works on your project. |
👆🏻是我从官方提取的.gitlab-ci.yml文件
Dockerfile
1 | FROM python:3.9-slim |
问题复现
push以后, CI流水线提示报错
定位问题
这个是在我submodule里的一个字体文件, 不应该没有的, 猜测可能由于submodule没拉取导致, 启动一个历史容器查看
果然submodule没有拉取, 文件夹都是空的
解决过程
查了CSDN1的博客, 发现问题原因, 需要配置ci设置, 修改CI文件
1 | # This file is a template, and might need editing before it works on your project. |
再次执行CI流水线, 仍然提示问题
查阅了Gitlab runner项目的issues23,
发现需要配置runner的pre_clone_script
1 | concurrent = 1 |
👆🏻是我的runner的config.toml, 增加配置后, 再次执行,
提示权限问题
此时参考第一次的博文4, 增加Deploy
key并修改.gitmodules, 但是我的版本是CE的, 只能使用Project
Access Token, 参考官方手册5可以分别给各个submodule创建一个
权限设置为Reporter即可, 详细权限可参见: Gitlab
permission and role cheat sheet | Rex Chow's Blog
查了很多博客文档6, 大体都说通过Project Access
Token进行clone操作语句是git clone https://oauth2:<access_token>@gitlab.com/.../xxx.git,
没有一个说明白为什么username是oauth2?
搜索了一下官方文档7, 发现了端倪.
Gitlab是支持oauth2认证方式和Personal/project/group access
tokens方式, 需要通过以下两种方法实现:
传递parameter的方式(全部适用)
1
curl "https://gitlab.example.com/api/v4/projects?private_token=<your_access_token>"
添加到请求头headers(全部适用)
1
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects"
或使用
OAuth兼容类构造请求头1
curl --header "Authorization: Bearer <your_access_token>" "https://gitlab.example.com/api/v4/projects"
因此, 需要修改原来的.gitmodules文件中项目的地址,
从SSH改为HTTP(S)才能使用, 故此上面修改runner的配置就可以不必修改了.
总结
使用了submodule的git, 想通过Gitlab CI进行自动构建, 需要按照以下步骤操作才能实现:
确认
.gitlab-ci.yml相关build的step包含submodule策略1
2variables:
GIT_SUBMODULE_STRATEGY: normal # 或者 recursive为每个submodule创建一个Project Access Token, 并修改
.gitmodule文件中submodule的URL为以下格式http(s)://oauth2:<project_access_token>@gitlab.com/.../xxx.git重试流水线, 此时应该可以顺利部署
Gitlab CI 拉取 submodules_麦田里的守望者-Jiang的博客-CSDN博客_git submodule 拉取↩︎
Docker: error cannot run ssh: No such file or directory (#2075) · Issues · GitLab.org / gitlab-runner · GitLab↩︎
How to use pre_clone_script in config.toml? (#2352) · Issues · GitLab.org / gitlab-runner · GitLab↩︎
Gitlab CI 拉取 submodules_麦田里的守望者-Jiang的博客-CSDN博客_git submodule 拉取↩︎