在 kubernetes 上的 Jenkinsfile Maven 构建中正确覆盖“settings.xml”?

Tho*_*sen 5 maven jenkins kubernetes jenkins-pipeline

我们正在我们的 Kubernetes 集群上建立一个基于 Jenkins 的 CI 管道(Rancher,如果这很重要),到目前为止我们已经使用官方maven:3-jdk-11-slim镜像进行实验。不幸的是,它没有提供任何内置方式来覆盖默认 settings.xml 以使用我们需要的镜像 - 最好只是通过设置环境变量。我对 kubernetes 不是很熟悉,所以我可能会遗漏一些简单的东西。

有没有一种简单的方法可以将文件添加到图像中?我应该使用内置此功能的另一个图像吗?


pipeline {
    agent {
        kubernetes {
            yaml """
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: maven
    image: maven:3-jdk-11-slim
    command:
    - cat
    tty: true
  - name: kaniko
.... etc
Run Code Online (Sandbox Code Playgroud)

C D*_*C D 7

摘要:您可以将 settings.xml 文件挂载pod 上的某个特定路径,并通过命令使用该文件mvn -s /my/path/to/settings.xml

Crou 的 ConfigMap 方法是实现这一目标的一种方法。但是,由于该settings.xml文件通常包含凭据,因此我会将其视为Secrets

您可以使用以下命令在 Kubernetes 中创建 Secret:

$ kubectl create secret generic mvn-settings --from-file=settings.xml=./settings.xml
Run Code Online (Sandbox Code Playgroud)

pod 定义将是这样的:

apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
    - name: maven
      image: maven:3-jdk-11-slim
      command:
      - cat
      tty: true
      volumeMounts:
      - name: mvn-settings-vol
        mountPath: /my/path/to
  volumes:
    - name: mvn-settings-vol
      secret:
        secretName: mvn-settings
Run Code Online (Sandbox Code Playgroud)

高级/可选:如果您练习“基础架构即代码”,您可能需要保存该机密的清单文件以供恢复。这可以在创建秘密后通过以下命令来实现:

$ kubectl get secrets mvn-settings -o yaml
Run Code Online (Sandbox Code Playgroud)

您可以保留secrets.yml文件,但不要签入任何 VCS/Github 存储库,因为此版本secrets.yml包含未加密的数据。

一些 k8s 管理员可能安装了kubeseal。在这种情况下,我建议使用 kubeseal 来获取secrets.yml.

$ kubectl create secret generic mvn-settings --from-file=settings.xml=./settings.xml --dry-run -o json | kubeseal --controller-name=controller --controller-namespace=k8s-sealed-secrets --format=yaml >secrets.yml

# Actually create secrets
$ kubectl apply -f secrets.yml
Run Code Online (Sandbox Code Playgroud)

controller-name应从controller-namespacek8s 管理员处获取。这secrets.yml包含您的加密数据settings.xml,可以安全地签入 VCS/Github 存储库。


Cro*_*rou 3

如果你想覆盖里面的文件,pod你可以使用ConfigMap来存储更改的文件并挂载它而不是以前的文件。

您可以使用以下命令从文件创建 ConfigMap

kubectl create configmap settings-xml --from-file=settings.xml
Run Code Online (Sandbox Code Playgroud)

您的pod定义可能如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
    - name: maven
      image: maven:3-jdk-11-slim
      command:
      - cat
      tty: true
      volumeMounts:
      - name: config-settings
        mountPath: /usr/share/maven/ref/settings.xml
  volumes:
    - name: config-settings
      configMap:
        # Provide the name of the ConfigMap containing the files you want
        # to add to the container
        name: settings-xml
...
Run Code Online (Sandbox Code Playgroud)