【问题标题】:Provide external yaml file to JCasC configScripts向 JCasC configScripts 提供外部 yaml 文件
【发布时间】:2022-08-16 18:11:59
【问题描述】:

我正在使用 jenkins-helm 图表 (https://github.com/jenkinsci/helm-charts/blob/main/charts/jenkins/VALUES_SUMMARY.md#jenkins-configuration-as-code-jcasc) 配置我的 Jenkins 实例

目前 Jenkins 配置在 values.yaml 中提供为:

jenkins:
  controller:
    JCasC:
      configScripts:
        key1:|-
          <a-very-big-yaml-value>

有没有办法从单独的 yaml 文件中导入这个 \'big-yaml-value\',因为它会增强我们代码的可维护性。

    标签: jenkins kubernetes-helm jcasc


    【解决方案1】:

    由于我不使用 helm-charts,我无法权威回答,但在摘要中是支持的。根据JCasC Getting Started 文档:

    首先,启动一个安装了 Configuration as Code 插件的 Jenkins 实例。

    • 那些将 Jenkins 作为 Docker 容器运行(并且可能还预安装插件)的用户,确实包含 Configuration as Code 插件。

    其次,插件查找CASC_JENKINS_CONFIG 环境变量。该变量指向以逗号分隔的以下任何项的列表:

    • 包含一组配置文件的文件夹的路径。例如,/var/jenkins_home/init.CasC
    • 单个文件的完整路径。例如,/var/jenkins_home/init.CasC/jenkins.yaml
    • 指向网络上提供的文件的 URL。例如,https://acme.org/jenkins.yaml

    如果CASC_JENKINS_CONFIG 的元素指向一个文件夹,插件将递归遍历该文件夹以查找带有.yml,.yaml,.YAML,.YML 后缀的文件。它将排除隐藏文件或在完整路径的任何部分包含隐藏文件夹的文件。它遵循文件和目录的符号链接。

    所以,是的,您可以拥有多个 yml 文件。我有超过 20 个(用于 120 个插件)。它们按功能(例如:全局、代理、工具、凭据,包括 2 个用于 RBAC(1 个用于角色、用户等))以及一些特定于插件的 yml 文件进行细分。有些还可以跨实例重用,而另一些则是特定的。

    如果发生冲突,您应该注意Merge Strategy

    • ErrorOnConflictMergeStrategy(默认)
      • 策略名称是errorOnConflict。
      • 如果多个 YAML 文件中存在冲突,则引发异常。
    • 覆盖合并策略
    • 策略名称被覆盖
    • 根据加载顺序覆盖配置文件。

    另请注意,在更新现有实例时,某些插件配置可能会替换配置,而其他插件配置可能会增加现有配置,无论是一个 yaml 还是多个。当然,目前还不是 100% 的选项都支持 JCasC,所以还需要一些 init.groovy。 YMMV。

    您也不妨回顾一下:JCasC Handling Secrets

    【讨论】:

      【解决方案2】:

      下面的设置对我有用。会放相关的部分。

      helm chart 的目录布局:

      jenkins/
      ├── conf/
      │   ├── shared-library.yaml
      │   └── big-yaml.yaml
      ├── templates/
      │   └── jenkins-custom-casc-config.yaml
      ├── values.yaml
      └── Chart.yaml
      

      values.yaml 中,我们覆盖了 CASC_JENKINS_CONFIG,因此它在默认路径之上考虑了配置文件的附加路径。

      controller:
        containerEnv:
          - name: CASC_JENKINS_CONFIG
            value: "/var/jenkins_home/casc_configs,/var/jenkins_home/custom-casc_configs"
         
      persistence:
        volumes:
          - name: jenkins-custom-casc-config
            configMap:
            name: jenkins-custom-casc-config
        mounts:
          - mountPath: /var/jenkins_home/custom-casc_configs
            name: jenkins-custom-casc-config
      

      ConfigMap jenkins-custom-casc-config.yaml 加载存在于conf/ 文件夹中的所有文件

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: jenkins-custom-casc-config
      data:
        {{- (.Files.Glob "conf/*").AsConfig | nindent 2 }}
      

      【讨论】:

        【解决方案3】:

        我在向/var/jenkins_home/casc_configs 注入所有配置文件的子文件夹时让它工作。否则 HiroCereal 的答案有效。

        【讨论】:

          猜你喜欢
          • 2020-05-03
          • 2020-05-17
          • 2017-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-27
          • 2019-01-29
          相关资源
          最近更新 更多