当前位置: 首页 > 面试题库 >

在项目之间共享gitlab-ci.yml

贺浩漫
2023-03-14
问题内容

我们正在考虑将ci从jenkins迁移到gitlab。我们有几个项目具有相同的构建工作流程。现在,我们使用一个定义了管道的共享库,而项目内部的jenkinsfile仅调用在共享库中定义的定义实际管道的方法。因此,仅需在单个点上进行更改即可影响多个项目。

我想知道gitlab ci是否也可以做到?据我发现,无法在存储库外部定义gitlab-
ci.yml。还有另一种定义管道并与几个项目共享此配置以简化维护的方法吗?


问题答案:

首先让我开始说:谢谢您提出这个问题!在经常想知道自己是否有可能之后,它再次激发了我寻找解决方案的机会。我们也有20-30个项目,它们完全相同,并且包含.gitlab- ci.yml大约400-500个loc文件,如果一件事情发生变化,则每个文件都必须更改。

所以我找到了一个可行的解决方案:

受Gitlab自身创建的Auto DevOps .gitlab-ci.yml模板的启发,它们在其中使用一个模板作业来定义所使用的所有函数并调用每个函数before_script来加载它们,我提出了以下设置。

  • 多个项目仓库(project-1,project-2)需要一组共享的CI作业/功能
  • 功能脚本包含单独回购中的所有共享功能

档案

因此,使用共享的ci jobs scipt:

#!/bin/bash

function list_files {
  ls -lah
}

function current_job_info {
  echo "Running job $CI_JOB_ID on runner $CI_RUNNER_ID ($CI_RUNNER_DESCRIPTION) for pipeline $CI_PIPELINE_ID"
}

通用和通用.gitlab-ci.yml

image: ubuntu:latest

before_script:
  # Install curl
  - apt-get update -qqq && apt-get install -qqqy curl
  # Get shared functions script
  - curl -s -o functions.sh https://gitlab.com/giix/demo-shared-ci-functions/raw/master/functions.sh
  # Set permissions
  - chmod +x functions.sh
  # Run script and load functions
  - . ./functions.sh

job1:
  script:
    - current_job_info
    - list_files

您可以将文件从project-1复制粘贴到project-2,并且使用相同的共享Gitlab CI函数。

这些示例出于示例目的而非常冗长,可以按照自己喜欢的任何方式对其进行优化。

得到教训

因此,在将上述构造大规模应用(超过40个项目)之后,我想分享一些经验教训,因此您不必找出困难的方法

  • 版本(标记/发布)您共享的ci函数脚本。现在,更改一件事可能会使所有管道失败。
  • 使用不同的Docker映像可能会导致要求bash加载功能的问题(例如,我将一些基于Alpine的映像用于sh默认情况下基于CLI工具的作业)
  • 使用基于项目的CI / CD机密变量来个性化项目的构建作业。像环境网址等。


 类似资料:
  • 问题内容: 有没有办法在Netbeans和Eclipse之间共享相同的* .java文件? 问题答案: 您可以将eclipse项目导入netbeans, 或者,您可以从现有资源创建Eclipse项目。

  • 我已经创建了一个带有OAuth令牌身份验证的Web API应用程序。当令牌服务器与服务在同一个应用程序上运行时,这没有问题。但是,我想将授权服务移动到它自己的应用程序(VS项目)中,并在我正在处理的几个Web API项目中使用它。然而,当我将授权逻辑隔离到它自己的项目中时,原始服务不再将生成的令牌视为有效的。我的问题是,一个Web API项目是否可以生成令牌供另一个项目验证?这是我的身份验证服务和

  • 我有两个不同的java项目,projectA和projectB。我正处于projectB依赖于projectA的阶段。如何提取通过构建projectA及其所有依赖项创建的JAR? 本质上,我想镜像在eclipse中向project ectB的构建路径添加一个project ectA的效果,有效地在classpath project ectA上拉罐子。

  • 我有很多不同版本的应用程序。每一个都是一个独立的IntelliJ项目。每次打开新的配置时,配置列表都是空白的: 最烦人的是,我部署到1个VM,每次要测试不同版本时,我都必须复制和粘贴调试配置。IntelliJ使每个IntelliJ实例都有这个对话框模式,所以我不能在项目实例之间复制和粘贴字段。 最后,我拍摄了一个配置的屏幕截图,并手工将字段复制到另一个项目中。这是一个很原始的解决方案。有没有更方便

  • 问题内容: 创建一个Today小部件,我用来保留一些数据。在主应用程序中,我正在使用。这不能由扩展读取(或可以?),这就是为什么我使用构造函数。 用户在主应用程序中持久存储的数据需要在扩展程序中可用。 目前,我坚持两者,以便可以共享这些值 问题是我应该将它们放在一起并仅在我的应用程序中使用,还是这种不好的做法? 编辑:我正在使用一个应用程序组容器。为了澄清起见,我问我是否应该在整个项目中用suit

  • 问题内容: 假设我有一个要注入到config中的模块: 有两个子模块: 这是第一个: 第二个是相同的,以简化示例: 您会注意到,您可以将它们作为提供者来访问以配置选项: 如果我们在控制器中,则可以覆盖每个范围,例如: 但是,如果他们总是共享相同的财产怎么办?如何在提供商之间共享某些东西? 我可以同时为和注入和配置共享属性吗? 如何同时访问和作为单个模块的扩展? 问题答案: 将模块插入两个共享这些属