Helm Jenkins JCasC自动配置为代码

iq3niunx  于 6个月前  发布在  Jenkins
关注(0)|答案(1)|浏览(71)

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

kfgdxczn

kfgdxczn1#

Kubernetes Helm实现的official Jenkins Configuration as Code (JCasC) plugin documentation没有提到sidecar配置的“folders“属性。
相反,它使用了一个单一的“folder“属性,这意味着Sidecar被配置为只监视 * 一个 * 目录的更改。

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

  • 在您的Kubernetes pod中使用init container来部署和运行脚本。脚本可以在pod初始化期间作为后台进程启动。
  • 一个sidecar container,脚本在Jenkins旁边的自己的容器中运行。该方法提供了与Jenkins容器的隔离。
  • 直接执行,您直接将脚本包含在Jenkins容器中,并将其作为后台进程运行。这可以通过自定义Docker镜像或将脚本装载到容器中并运行来完成。

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

相关问题