正确覆盖 Jenkinsfile Maven build on kubernetes 中的"settings.xml"?



我们正在 Kubernetes 集群(如果重要的话,是 Rancher(上设置一个基于 Jenkins 的 CI 管道,到目前为止,我们已经使用官方的 maven:3-jdk-11-slim 映像进行实验。 不幸的是,它没有提供任何覆盖默认设置的内置方法.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

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

Crou的ConfigMap方法是一种方法。但是,由于settings.xml文件通常包含凭据,因此我会将其视为机密。

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

$ kubectl create secret generic mvn-settings --from-file=settings.xml=./settings.xml

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

高级/可选:如果练习"基础结构即代码",则可能需要保存该机密的清单文件以进行恢复。这可以通过创建密钥后的以下命令来实现:

$ kubectl get secrets mvn-settings -o yaml

您可以保留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

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

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

您可以使用以下命令从文件创建配置映射

kubectl create configmap settings-xml --from-file=settings.xml

您的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
...

这对我有用:

  • 安装配置文件提供程序插件
  • 转到管理 Jenkins>配置文件管理>添加新配置并在此处插入您的设置.xml
  • 在你的 jenkinsfile 中,只需将你的 rtMavenRun 放在一个 configFileProvider 块中,并放置你之前创建的 jenkins 配置文件的相同 fileId
    stage('Build Maven') {
                steps {
                    configFileProvider([configFile(fileId: 'MavenArtifactorySettingId', variable: 'MAVEN_SETTINGS_XML')]) {
                        retry(count: 3) {
                            rtMavenRun(
                                tool: "Maven 3.6.2", //id specified in Global Tool Configuration
                                pom: 'pom.xml',
                                goals: '-U -s $MAVEN_SETTINGS_XML clean install',
                            )
                        }
                    }
                }
            }

如果您想查看更多内容,这正是我使用的管道:https://gist.github.com/robertobatts/42da9069e13b61a238f51c36754de97b

如果您使用代码对项目的设置.xml进行版本控制,则使用 sh step 与mvn install -s settings.xml一起构建是有意义的。这是我在工作中所做的。如果 settings.xml 未与项目一起版本化,则使用 Crou 的解决方案挂载文件确实是有意义的。

回答您的问题"我应该使用另一个内置此功能的图像吗?我建议避免最大限度地构建自定义映像,因为您最终将不得不维护它们

最新更新