我已经在我们的Jenkins中安装了Kubernetes plugin - 1.23.3
,并且能够在kubernetes pod(动态Jenkins从站)上执行shell命令。这适用于默认的jnlp & jenkins/jnlp-slave:latest
假设我将下面的“名称”和“ Docker映像”部分更改为使用我们的私有注册表和映像,
Manage Jenkins --> Configure System--> Cloud --> Pod Template --> Container Template
Name: sonatype
Docker image:sonatype:4546/ubuntu-16.04
它不使用我们的私有docker映像,甚至不运行pod容器上的shell命令。这个想法是在Kubernetes集群pod上使用我们自己的docker映像作为动态Jenkins Build Agents执行build + static analysis
。
如何使用我们的私有Docker注册表映像并将其作为kubernetes集群中的Jenkins奴隶执行?我有下面的脚本管道代码。到K8S工作节点的第1阶段“ SCM代码签出”正在运行,在下一个第2阶段构建中,它将从template Kubernetes Pod Template
启动pod agent。但是如果失败,则返回docker: not found
。似乎试图将我们的注册表映像拉到pod中。从我们的工作者节点系统的代码需要安装在动态的Jenkins从属pod中,并执行构建和后续阶段。任何实现的方向都会有所帮助。
node ("kubupods") {
stage('Code Compile') {
sh 'hostname'
}
stage('Code Analysis') {
sh 'hostname'
}
}
答案 0 :(得分:0)
默认情况下,詹金斯将从dockerhub中提取图像。在您的情况下,图像sonatype:4546 / ubuntu-16.04。为了使用专用注册表,如果您正在构建管道,则需要提供专用注册表及其凭据。您可以在UI上提供它,也可以通过代码来完成它。请参阅here
之后,您还需要向kubernetes YAML告知私有注册表。
为此,您可以参考here。这实质上是两个步骤
a)创建一个kubernetes秘密
b)使用imagepullsecret
字段告知您的部署有关机密的信息。
确保您将图片引用为
<username or registry URL/<image_name>:<tag(maybe $BUILD_NUMBER)>
===============在添加问题并添加新问题后编辑1 =====
配置插件以使用Jenkins安装软件包。
如果已安装在计算机上,请使用Docker的位置更新Jenkins中的PATH变量。
答案 1 :(得分:0)
塔伦(Tarun)的答案假设您正在管道中构建图像。
我在管道中执行了类似的操作,但是我们在管道外部构建了一个自定义的jnlp-slave映像(加载了CI / CD所需的工具),并在kubernetes插件yaml中进行了引用。
构建自定义的jnlp从属映像。 (下面的Dockerfile)
FROM jenkins/jnlp-slave:latest
# Download/install tools
ENTRYPOINT ["jenkins-slave"]
将自定义jnlp-slave映像推送到您的私有注册表中
docker build -t my-private-registry/jnlp-slave:custom .
docker push my-private-registry/jnlp-slave:custom
定义您的Jenkins文件,以便pod使用您在上一步中构建的图像。
pipeline {
agent {
kubernetes {
yaml """
apiVersion: v1
kind: Pod
metadata:
label:
jenkins: slave
spec:
containers:
- name: jnlp
image: my-private-registry/jnlp-slave:custom
}}}
stages {
stage("Test") {
sh("hostname")
}
}
我们的注册表不需要身份验证,但是如果需要,则需要向詹金斯提供机密信息(如Tarun所述),以使其能够在注册表中进行身份验证。