在CI/CD中使用submodule

背景信息

客户的submodule使用的是ssh协议拉取

前置操作

gitlab添加子模块

bash 复制代码
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文件

bash 复制代码
[submodule "test-1"]
	path = test-1
	url = ../../approve/test-1.git
[submodule "123123"]
	path = 123123
	url = ../../mr/123123.git

gitlab-ci文件

bash 复制代码
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端口是标准方式和非标准方式的修改

bash 复制代码
variables:
  GIT_STRATEGY: clone
  GIT_SUBMODULE_STRATEGY: none

default:
  tags:
    - docker-mac

test1:
  extends: .git:submodule
  stage: test
  script:
    - 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 -l
  image:
    entrypoint: ['']
    name: bitnami/git

方法 3: 通过pre_get_sources_script关键字

该方法并不需要对submodule文件进行调整,只需要对ci文件进行稍微的调整即可。

将私钥以变量的方式通过base64加密添加到变量中

gitlab-ci文件

bash 复制代码
variables:
  GIT_STRATEGY: clone
  GIT_SUBMODULE_STRATEGY: recursive

default:
  tags:
    - '888'
    
build:
  image: ubuntu:latest
  script:
    - ls -l
    - ls -l envsubst
  hooks:
    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
相关推荐
lbb 小魔仙1 小时前
Git + Python 项目工作流最佳实践:pre-commit、CI、CHANGELOG 自动化
git·python·ci/cd
不厌 -_-8 小时前
gitlab中怎么创建MR提交模板
gitlab·mr
MC皮蛋侠客1 天前
uv 系列(七):CI/CD、Docker 与私有索引——生产级交付
python·ci/cd·docker·uv
diving deep1 天前
CI/CD
ci/cd
酿情师1 天前
Gitlab 任意文件读取漏洞(CVE-2016-9086)
gitlab
lxw18449125141 天前
PHP后端(CI框架方向)面试题库,分为基础必问、MySQL、Redis、工程运维、高阶加分、场景实操六大模块,适配该JD全部考点,附带标准答案
ci/cd·面试·php
糖果罐子♡2 天前
TortoiseGit 首次上传本地工程至已初始化的GitLab仓库教程
gitlab
Byron Loong2 天前
【Git】如何检查 Ubuntu 系统上 gitLab 是否开启
git·ubuntu·gitlab
QN1幻化引擎3 天前
SFA 信号场注意力:用8KB参数换248x KV Cache压缩,边缘设备也能跑长序列
人工智能·算法·gitee·gitlab
阿里云云原生3 天前
研发福音:云效 AI 智能评审正式支持 GitLab 集成,VPC 内网即可实现自动审阅
gitlab