使用 "label" 或在 jenkinsfile 中为 kubernetes-plugin 定义 pod 模板?
Use "label" or define a pod template in jenkinsfile for kubernetes-plugin?
一般
我在为 Jenkins 使用 kubernetes-plugin 时尝试使用标签,但我有点困惑。
在我的 pipeline
波纹管中,我尝试在 parallel
个步骤中使用不同的标签(代理)构建测试作业。
我已经在我的 Jenkins 配置中配置了带有 pod 模板和容器的插件,我在其中使用了与在管道 podTemplate
中定义的相同的设置。
问题
问题是当我在第 2 阶段使用 agent label
时,有 jnpl 图像 运行 而不是我在配置 someimage:latest
.
中指向的图像
在 stage 1
中,我在管道中定义 pod 没有问题,所需的图像 运行 很好。
问题
我做错了什么?
这是我的 jenkinsfile
和 Jenkins 中 kubernetes-plugin 的配置:
def podTemplate = """
apiVersion: v1
kind: Pod
spec:
containers:
- name: k8s
image: someimage:latest
command:
- sleep
args:
- infinity
volumeMounts:
- name: workspace-volume
mountPath: /home/jenkins/agent
workingDir: "/home/jenkins/agent"
volumes:
- name: "workspace-volume"
persistentVolumeClaim:
claimName: "jenkins-worker-pvc"
readOnly: false
"""
pipeline {
agent none
stages {
stage("Parallel") {
parallel {
stage("1.k8s") {
agent {
kubernetes {
yaml podTemplate
defaultContainer 'k8s'
}
}
steps {
sh """
mvn -version
"""
}
}
stage("2. k8s") {
agent { label 'k8s' }
steps {
sh """
mvn -version
"""
}
}
stage("win") {
agent { label 'windows' }
steps {
bat "dir"
}
}
}
}
}
}
您没有为 stage
和 label
k8s
和 windows
指定图像。
您可以在 docs 中读到:
The plugin creates a Kubernetes Pod for each agent started, defined by the Docker image to run, and stops it after each build.
Agents are launched using JNLP, so it is expected that the image connects automatically to the Jenkins master.
您正在使用 podTemplate
,我建议设置 container
,这可能如下所示:
podTemplate(containers: [
containerTemplate(name: 'maven', image: 'maven:3.3.9-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
containerTemplate(name: 'golang', image: 'golang:1.8.0', ttyEnabled: true, command: 'cat')
]) {
node(POD_LABEL) {
stage('Get a Maven project') {
git 'https://github.com/jenkinsci/kubernetes-plugin.git'
container('maven') {
stage('Build a Maven project') {
sh 'mvn -B clean install'
}
}
}
stage('Get a Golang project') {
git url: 'https://github.com/hashicorp/terraform.git'
container('golang') {
stage('Build a Go project') {
sh """
mkdir -p /go/src/github.com/hashicorp
ln -s `pwd` /go/src/github.com/hashicorp/terraform
cd /go/src/github.com/hashicorp/terraform && make core-dev
"""
}
}
}
}
}
您可以阅读更多关于 Container Configuration and Container Group Support
一般
我在为 Jenkins 使用 kubernetes-plugin 时尝试使用标签,但我有点困惑。
在我的 pipeline
波纹管中,我尝试在 parallel
个步骤中使用不同的标签(代理)构建测试作业。
我已经在我的 Jenkins 配置中配置了带有 pod 模板和容器的插件,我在其中使用了与在管道 podTemplate
中定义的相同的设置。
问题
问题是当我在第 2 阶段使用 agent label
时,有 jnpl 图像 运行 而不是我在配置 someimage:latest
.
在 stage 1
中,我在管道中定义 pod 没有问题,所需的图像 运行 很好。
问题
我做错了什么?
这是我的 jenkinsfile
和 Jenkins 中 kubernetes-plugin 的配置:
def podTemplate = """
apiVersion: v1
kind: Pod
spec:
containers:
- name: k8s
image: someimage:latest
command:
- sleep
args:
- infinity
volumeMounts:
- name: workspace-volume
mountPath: /home/jenkins/agent
workingDir: "/home/jenkins/agent"
volumes:
- name: "workspace-volume"
persistentVolumeClaim:
claimName: "jenkins-worker-pvc"
readOnly: false
"""
pipeline {
agent none
stages {
stage("Parallel") {
parallel {
stage("1.k8s") {
agent {
kubernetes {
yaml podTemplate
defaultContainer 'k8s'
}
}
steps {
sh """
mvn -version
"""
}
}
stage("2. k8s") {
agent { label 'k8s' }
steps {
sh """
mvn -version
"""
}
}
stage("win") {
agent { label 'windows' }
steps {
bat "dir"
}
}
}
}
}
}
您没有为 stage
和 label
k8s
和 windows
指定图像。
您可以在 docs 中读到:
The plugin creates a Kubernetes Pod for each agent started, defined by the Docker image to run, and stops it after each build.
Agents are launched using JNLP, so it is expected that the image connects automatically to the Jenkins master.
您正在使用 podTemplate
,我建议设置 container
,这可能如下所示:
podTemplate(containers: [
containerTemplate(name: 'maven', image: 'maven:3.3.9-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
containerTemplate(name: 'golang', image: 'golang:1.8.0', ttyEnabled: true, command: 'cat')
]) {
node(POD_LABEL) {
stage('Get a Maven project') {
git 'https://github.com/jenkinsci/kubernetes-plugin.git'
container('maven') {
stage('Build a Maven project') {
sh 'mvn -B clean install'
}
}
}
stage('Get a Golang project') {
git url: 'https://github.com/hashicorp/terraform.git'
container('golang') {
stage('Build a Go project') {
sh """
mkdir -p /go/src/github.com/hashicorp
ln -s `pwd` /go/src/github.com/hashicorp/terraform
cd /go/src/github.com/hashicorp/terraform && make core-dev
"""
}
}
}
}
}
您可以阅读更多关于 Container Configuration and Container Group Support