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

时间:2019-11-21 12:51:25

标签: maven jenkins kubernetes jenkins-pipeline

我们正在Kubernetes集群(如果需要的话,Rancher)上建立基于Jenkins的CI管道,到目前为止,我们已经使用官方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

4 个答案:

答案 0 :(得分:3)

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

您可以使用

从文件创建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
...

答案 1 :(得分:3)

摘要:您可以在特定位置将您的 settings.xml文件安装在Pod上,并通过命令mvn -s /my/path/to/settings.xml使用该文件。

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

您可以使用以下命令在Kubernetes中创建一个秘密:

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

广告连播定义如下:

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存储库中。

答案 2 :(得分:0)

这对我有用:

  • 安装配置文件提供程序插件
  • 转到“管理Jenkins”>“配置文件管理”>添加新配置,并在此处插入您的settings.xml
  • 在您的jenkins文件中,只需将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

答案 3 :(得分:0)

如果您使用代码对项目的settings.xml进行了版本控制,则可以使用 sh 步骤使用mvn install -s settings.xml进行构建。这是我在工作中所做的。如果settings.xml没有随项目一起版本化,那么使用Crou的解决方案来挂载文件确实很有意义。

回答您的问题“我是否应该使用内置此功能的其他图像?”我建议避免最大程度地构建自定义图像,因为您最终将不得不对其进行维护