Helm Jenkins JCasC 自动将配置重新加载为代码

问题描述 投票:0回答:1

我创建了一个 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 执行升级时自动重新加载?

jenkins kubernetes-helm jenkins-confuration-as-a-code
1个回答
0
投票

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 环境中部署和运行,可以使用:

然后,脚本可以使用以下任一方法重新加载 JCasC:

© www.soinside.com 2019 - 2024. All rights reserved.