我们正在 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-name
和controller-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 的解决方案挂载文件确实是有意义的。
回答您的问题"我应该使用另一个内置此功能的图像吗?我建议避免最大限度地构建自定义映像,因为您最终将不得不维护它们