我创建了一个 Jenkins 实例,在其中使用 Jenkins 配置即代码 (JCasC),并使用 Helm 来管理部署/升级。
作为测试,我创建了一个welcome-message.yaml 文件:
jenkins:
systemMessage: "JCasC used to configure Jenkins"
我将其放入 Jenkins 的 Helm 图表中名为 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中,我为卷创建配置映射信息:
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-message.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,我在 value.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 中的“配置即代码”控制台进行干预,并通过手动输入目录并应用来更新配置。
我在网上寻找答案,但没有明确的解决方案。如何让 JCasC 在通过 Helm 执行升级时自动重新加载?
Kubernetes Helm 实现的官方 Jenkins 配置即代码 (JCasC) 插件文档没有提及 sidecar 配置的“
folders
”属性。folder
”属性,这意味着 sidecar 配置为仅监视 one 目录的更改。
sidecars:
configAutoReload:
enabled: true
image: shadwell/k8s-sidecar:0.0.2
imagePullPolicy: IfNotPresent
sshTcpPort: 1044
label: jenkins_config
folder: /var/jenkins_home/casc_configs
# Additional configurations
在您的情况下,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 脚本来实现:
#!/bin/bash
# Define the directory to monitor
MONITOR_DIR="/var/jenkins_home/custom_casc_configs"
# Initialize the last checksum
LAST_CHECKSUM=$(find $MONITOR_DIR -type f -exec md5sum {} + | md5sum)
while true; do
# Calculate current checksum
CURRENT_CHECKSUM=$(find $MONITOR_DIR -type f -exec md5sum {} + | md5sum)
# Compare checksums
if [ "$LAST_CHECKSUM" != "$CURRENT_CHECKSUM" ]; then
echo "Change detected, reloading JCasC..."
# Command to reload JCasC
# Example: using Jenkins CLI or Jenkins REST API call
# jenkins-cli.sh -s http://jenkins:8080 reload-configuration
# or
# curl -X POST http://jenkins:8080/reload-configuration --user user:token
# Update last checksum
LAST_CHECKSUM=$CURRENT_CHECKSUM
fi
# Wait for a bit before checking again
sleep 60
done
该脚本需要在 Jenkins 环境中部署和运行,可以使用:
init
容器用于部署和运行脚本。该脚本可以在 Pod 初始化期间作为后台进程启动。