如何在 gitlab 中更新子模块 CI/CD

How to update submodules in a gitlab CI/CD

我在下面的树中组织了一个项目

|.
|..
|-- devops
|-- project1
|-- project2

在 devops 文件夹中,我将另外两个项目作为子模块包含在内,因为这两个项目是由两个不同的团队独立开发的。

|.
|..
|-- project1@0deed0fa
|-- project2@0beef0fb
|-- .gitlab-ci.yml

我已经设置了部署项目的管道。每当任何项目有新提交时,都会为 运行 devops 项目管道设置一个触发器。作为 devops 工作的一部分,我 运行 git submodule 命令来获取和合并。然后构建。有效。

我遇到的问题是,在一段时间内,子模块发生了很多变化。每次对任何项目进行提交时,都会重播从最后一个子模块提交到 devops 项目文件夹的更改。每月一次,我手动更新 devops 项目文件夹并更新到子模块项目的最新提交。我可以提交来自 devops 管道任务的更改,但这将在同一个 devops 管道中生成新管道。 (我没有测试,但看起来很明显)。

作为 devops 管道的一部分,有什么方法可以将子模块更新到最新提交吗?

谢谢。

只构建一次二进制文件

使用 git 子模块不是实现集成管道的最佳实践。开创性的书 Continuous DeliveryOnly Build Your Binaries Once 部分(第 5 章)中陈述了以下内容:

Many build systems use source code held in the version control system as the canonical source for many steps. The code will be compiled repeatedly in different contexts during the commit process, again at acceptance test time, [etc.] Every time you compile the code, you run the risk of introducing some difference.

另外,重新编译需要很多时间,导致反馈周期变长。推荐是:

You should only build your binaries once, during the commit stage of the build. These binaries should be stored in a filesystem somewhere [...] where it is easy to retrieve them for later stages of the pipeline.

CI/CD管道流量

遵循此范例,您的工作流程将如下所示:

  1. project1project2 中开发功能分支的开发人员将推送一个提交
  2. 项目管道被触发,构建二进制文件,运行unit/component测试和容器
  3. 如果一切顺利,二进制文件或容器将部署到“开发”存储库
  4. 项目管道将触发您的下游 devops 管道,这将从存储库下载 binaries/containers。
  5. devops 管道集成各个部分并运行端到端测试
  6. 如果 E2E 测试通过,binaries/containers 将部署(也称为提升)到 release 存储库
  7. 如果您正在进行持续交付,您会在此处部署到生产环境,但许多团队更喜欢在手动作业中按下按钮

注意源代码是如何只构建一次的。

流行的二进制存储库

有许多流行的二进制存储库可用。大多数都有免费和付费的专业版。查看他们的网站了解更多信息。

  1. GitLab Job Artifacts(阶段或管道之间)
  2. GitLab Package Registry or GitLab Container Registry
  3. GitHub Package Registry or GitHub Container Registry
  4. JFrog Artifactory
  5. Nexus Repository
  6. 云存储容器注册表(AWS ECR, GCP CR, Azure CR