我创建了一个Jenkins示例,在其中我使用Jenkins Configuration as Code(JCasC),并使用Helm来管理部署/升级。
作为测试,我创建了一个welcome-message.yaml文件:
jenkins:
systemMessage: "JCasC used to configure Jenkins"
字符串
我把它放在Jenkins的Helm chart中一个名为JCasC的目录中:
helm-charts/
charts/
jenkins/
jcasc/
- welcome-message.yaml
型
在templates文件夹中,我放置了jenkins-custom-casc-config.yaml文件:
apiVersion: v1
kind: ConfigMap
metadata:
name: jenkins-custom-casc-config
data:
{{ (.Files.Glob "jcasc/*").AsConfig | indent 2 }}
型
在
helm-charts/
charts/
jenkins/
templates/
- jenkins-custom-casc-config.yaml
型
在values.yaml中,我为卷创建配置Map信息:
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
型
这一切都像它应该的那样工作,将welcome-messages.yaml正确地放置在/var/jenkins_home/custom_casc_configs
中。我已经设置了CASC_JENKINS_CONFIG
在标准CASC目录和新的自定义目录中查找文件。
containerEnv:
- name: CASC_JENKINS_CONFIG
value: "/var/jenkins_home/casc_configs,/var/jenkins_home/custom_casc_configs"
型
对于sidecar,我在values.yaml文件中设置了以下内容:
sidecars:
configAutoReload:
enabled: true
image: kiwigrid/k8s-sidecar:1.24.4
imagePullPolicy: IfNotPresent
resources: {}
reqRetryConnect: 10
folder: /var/jenkins_home/casc_configs
型
无论我做什么,当我执行helm upgrade...
时,JCasC永远不会重新加载,即使新的/更新的配置文件被放置在/var/jenkins_home/custom_casc_configs
目录中。我可以通过进入Jenkins UI中的Configuration as Code控制台进行干预,并通过手动输入目录并应用来更新配置。
我在网上找了很多遍,但是没有明确的解决方案。当我通过Helm执行升级时,如何让JCasC自动重新加载?
1条答案
按热度按时间kfgdxczn1#
Kubernetes Helm实现的official Jenkins Configuration as Code (JCasC) plugin documentation没有提到sidecar配置的“
folders
“属性。相反,它使用了一个单一的“
folder
“属性,这意味着Sidecar被配置为只监视 * 一个 * 目录的更改。字符串
在本例中,sidecar被设置为监视
/var/jenkins_home/casc_configs
目录。由于您还使用自定义配置目录(/var/jenkins_home/custom_casc_configs
),因此sidecar在其当前状态下将 * 不 * 监视此目录。如果可行,您可能需要将所有JCasC文件移动到sidecar监视的同一个目录(
/var/jenkins_home/casc_configs
)。这将确保此目录中的任何更改都会触发自动重新加载。但是如果您需要保持自定义配置目录独立,另一种选择是实现自定义解决方案(例如脚本或辅助Sidecar)来监视
/var/jenkins_home/custom_casc_configs
目录,并在检测到更改时触发重新加载。持续监视指定目录的更改。这可以使用带有简单循环和校验和比较的shell脚本来实现:
型
该脚本需要在Jenkins环境中部署和运行,或者使用:
init
container来部署和运行脚本。脚本可以在pod初始化期间作为后台进程启动。然后,脚本可以使用以下任一项重新加载JCasC: