【问题标题】:Provide external yaml file to JCasC configScripts向 JCasC configScripts 提供外部 yaml 文件
【发布时间】:2022-08-16 18:11:59
【问题描述】:
标签:
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 的答案有效。