背景信息
客户的submodule使用的是ssh协议拉取
前置操作
gitlab添加子模块
git clone ssh://git@kube.bdeet.top:2222/cicd/123.git
cd 123/
ls -la
git submodule add ssh://git@kube.bdeet.top:2222/approve/test-1.git
git submodule add ssh://git@kube.bdeet.top:2222/mr/123123.git
ls -la
cat .gitmodules
git add .
git commit -m 'add submodule repo'
git push
界面查看.gitmodules文件
在CI/CD中使用submodule
方法1: 使用相对路径的方式
该方法并不需要对ci文件进行大的调整,只需要添加GIT_SUBMODULE_STRATEGY: recursive关键字;但是需要修改submodule文件。
修改submodule文件
[submodule "test-1"]path = test-1url = ../../approve/test-1.git
[submodule "123123"]path = 123123url = ../../mr/123123.git
gitlab-ci文件
image: ubuntu:22.04
variables:GIT_SUBMODULE_STRATEGY: recursive
build2:script: - echo "**************** $(date +'%H:%M:%S') Update DVC****************="tags:- docker-mac
方法2: 通过单独一个job来控制
该方法并不需要对submodule文件进行调整,但是需要对ci文件进行比较大的调整。另外需要注意的是GITLABUSERNAME和GITLAB_TOKEN都已经保存到变量中
另外就是里面的修改涉及到了对ssh端口是标准方式和非标准方式的修改
variables:GIT_STRATEGY: cloneGIT_SUBMODULE_STRATEGY: nonedefault:tags:- docker-mactest1:extends: .git:submodulestage: testscript:- echo "input your code".git:submodule:before_script:# 还未update submodule之前- ls -l- ls 123123 test-1- pwd# 检查未替换前效果- cat .gitmodules## 情况1: 标准的ssh# 调整.gitmodules中的url配置,ssh-> http,标准端口STEP1: 为了匹配https的url规范,需替换:为/#- sed -i "s/:/\//g" .gitmodules## 情况2: 非标准的ssh# 调整.gitmodules中的url配置,ssh-> http,非标准端口STEP1: 为了删除前面的ssh://- sed -i "s%ssh://%%g" .gitmodules# 调整.gitmodules中的url配置,ssh-> http,非标准端口STEP1: 为了删除前面的端口数字- sed -i "s%:${CI_SERVER_SHELL_SSH_PORT}%%g" .gitmodules# STEP2: 加入submodule的用户名和personal token 换为http 模式的url- sed -i "s/git@/https:\/\/${GITLAB_USERNAME}:${GITLAB_TOKEN}@/g" .gitmodules# 检查替换后效果- cat .gitmodules# 做首层的submodule的拉取- git submodule sync- git submodule update --init# 检查拉取状态- git submodule# 检查submodule代码是否拉取成功- ls -limage:entrypoint: ['']name: bitnami/git
方法 3: 通过pre_get_sources_script关键字
该方法并不需要对submodule文件进行调整,只需要对ci文件进行稍微的调整即可。
将私钥以变量的方式通过base64加密添加到变量中
gitlab-ci文件
variables:GIT_STRATEGY: cloneGIT_SUBMODULE_STRATEGY: recursivedefault:tags:- '888'build:image: ubuntu:latestscript:- ls -l- ls -l envsubsthooks:pre_get_sources_script:- apk update- apk add openssh-client- eval $(ssh-agent -s)- echo $SSH_PRIVATE_KEY | base64 -d > id_rsa- chmod 400 id_rsa- ssh-add id_rsa- mkdir -p ~/.ssh- chmod 700 ~/.ssh- mv id_rsa ~/.ssh/- ssh-keyscan -t rsa $CI_SERVER_HOST >> ~/.ssh/known_hosts