使用 YAML(带有 Helm),我们创建了以下文件来定义代理容器。如下所示,该文件与具有不同代理定义集的另一个文件一样可以正常工作。
apiVersion: v1
kind: Pod
metadata:
name: pod-yaml
spec:
containers:
- name: maven
image: maven:3.8.1-jdk-8
command:
- sleep
args:
- 99d
- name: python
image: python:latest
command:
- sleep
args:
- 99d
- name: node10jdk8
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node10_jdk8:v4
command:
- sleep
args:
- 99d
- name: node10jdk11
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node10_jdk11:v2
command:
- sleep
args:
- 99d
- name: node12jdk8
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node12_jdk8:v2
command:
- sleep
args:
- 99d
- name: node12jdk11
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node12_jdk11:v2
command:
- sleep
args:
- 99d
- name: node14jdk8
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node14_jdk8:v2
command:
- sleep
args:
- 99d
- name: node16jdk11
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node16_jdk11:v2
command:
- sleep
args:
- 99d
- name: node18jdk11
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node18_jdk11:v2
command:
- sleep
args:
- 99d
- name: node20jdk11
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node20_jdk11:v2
command:
- sleep
args:
- 99d
- name: jra-base
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_base:v3
command:
- sleep
args:
- 99d
我们定义了更多容器,但在运行 Jenkins 管道时会出现这样的错误:
14:26:47 Created Pod: kubernetes jenkins-dev/agents-jenkins-yaml-agents-test-128-tlk8h-tnw11-gf62j
14:26:53 ERROR: Unable to pull Docker image "ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_base:v3". Check if image tag name is spelled correctly.
14:26:53 ERROR: Unable to pull Docker image "ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node12_jdk11:v2". Check if image tag name is spelled correctly.
14:26:53 ERROR: Unable to pull Docker image "ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node12_jdk8:v2". Check if image tag name is spelled correctly.
14:26:53 ERROR: Unable to pull Docker image "ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node14_jdk8:v2". Check if image tag name is spelled correctly.
14:26:53 ERROR: Unable to pull Docker image "ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node16_jdk11:v2". Check if image tag name is spelled correctly.
14:26:53 ERROR: Unable to pull Docker image "ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node18_jdk11:v2". Check if image tag name is spelled correctly.
14:26:53 ERROR: Unable to pull Docker image "ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node20_jdk11:v2". Check if image tag name is spelled correctly.
我将所有有问题的容器镜像放入一个单独的 YAML 文件中,运行测试并且测试成功。
我决定再添加一张图像,测试,重复泡沫冲洗。我添加一张图片:
- name: node16jdk17
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node16_jdk17:v2
command:
- sleep
args:
- 99d
错误再次出现,但不是与添加的新容器定义一起出现的。我删除了该定义,它再次完美运行。我决定再找一张图片来尝试并添加这个:
- name: node14jdk11
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node14_jdk11:v2
command:
- sleep
args:
- 99d
它失败了,但这次只有新图像显示失败:
13:10:58 [Pipeline] node
13:11:08 Created Pod: kubernetes jenkins-dev/agents-jenkins-yaml-agents-test-125-93416-q6bzf-bqr63
13:11:12 ERROR: Unable to pull Docker image "ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node14_jdk11:v2". Check if image tag name is spelled correctly.
13:11:12 [Pipeline] // node
我在这里缺少什么?据我所知,YAML 文件没有达到长度限制。图像标签名称必须“拼写正确”,因为在未添加任何内容时会检索工件。我已经检查并仔细检查了语法。文件中没有奇怪的字符。
我错过了一些非常明显的东西吗?
这是使用 Pod/容器定义的管道的基本版本:
@Library('SCMLibraries@jenkins-pod-tests')_ // Load External Libraries
def podDefs = libraryResource('./pod.yaml')
pipeline {
agent any
environment {
PATH = '/var/jenkins/.nvm/versions/node/v10.24.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
NVM_DIR = '/var/jenkins/.nvm'
NVM_INC = '/var/jenkins/.nvm/versions/node/v10.24.1/include/node'
NVM_CD_FLAGS = ''
NVM_BIN = '/var/jenkins/.nvm/versions/node/v10.24.1/bin'
}
stages {
stage('Setup the Build') {
agent {
kubernetes {
defaultContainer 'jnlp'
yaml podDefs
}
}
steps {
container('node10jdk8') {
// code goes here
}
}
}
}
}
未显示的是使用多个容器的并行处理管道。
因为 pod.yaml 被作为资源调用,所以它不会继承 Kubernetes 上 Jenkins 实例所使用的服务帐户。我们为 Pod 创建了一个单独的服务帐户,然后将其包含在 YAML 文件中:
apiVersion: v1
kind: Pod
metadata:
name: pod-yaml
spec:
serviceAccountName: agent-pods
containers:
- name: maven
image: maven:3.8.1-jdk-8
command:
- sleep
args:
- 99d
- name: python
image: python:latest
command:
- sleep
args:
- 99d
- name: node10jdk8
image: ourartifacts.jfrog.io/docker-local/jenkins_remote_agent_node10_jdk8:v4
command:
- sleep
args:
- 99d
pod.yaml 使用默认服务帐户,该帐户无权访问某些资源。 (这也强调我们需要确定为什么它确实允许某些调用,但这是另一个故事。)为这些调用添加服务帐户可以解决问题。