我有一个在Docker代理上运行的Jenkins管道,每当它进入一个具有不同代理的阶段时,它都会更改Jenkins节点。如何强制它始终在同一节点上运行?
我有3个节点: master , slave-1 和 slave-2 。我的管道有时只是一个例子,首先使用 master ,然后在调用代理 image-docker-1 时使用 slave-1 然后调用代理 image-docker-2 时,它将再次使用 master 。
如何强制它始终使用 slave-1 ?我知道,如果我不使用docker作为代理,我可以使用类似的东西:
node (label: "slave-1") {
(...)
pipeline {
agent { label "slave-1 }
(...)
但我认为并非如此。
这是我的管道:
node {
properties([
pipelineTriggers(
[cron('H 00 * * 1-5') ]
)]
)
workloadPipeline = load("ImagePull.groovy")
workloadPipeline
}
pipeline {
options {
ansiColor('xterm')
timestamps()
}
agent none
environment {
TOKEN = credentials("token")
HOME = '.'
}
stages {
stage("initiating"){
agent {
docker {
image 'image-docker-1'
args '--entrypoint="" -u root -v /var/run/docker.sock:/var/run/docker.sock'
}
}
stages {
stage('docker 1 scanning') {
steps {
script {
workloadPipeline.loopImages(Images)
}
}
}
stage ('docker 1 test'){
(...)
}
}
}
stage('docker 2 scanning') {
agent {
docker {
image 'image-docker-2'
args '--entrypoint="" -u root -v /var/run/docker.sock:/var/run/docker.sock'
}
}
steps {
script {
workloadPipeline.Scanning()
}
}
}
}
}
答案 0 :(得分:2)
使用 reuseNode true
从this example找到了一个简单的解决方案pipeline {
agent none
stages {
stage("Fix the permission issue") {
agent any
steps {
sh "sudo chown root:jenkins /run/docker.sock"
}
}
stage('Step 1') {
agent {
docker {
image 'nezarfadle/tools'
reuseNode true
}
}
steps {
sh "ls /"
}
}
}
}
答案 1 :(得分:0)
使用:
agent {
docker {
image 'image-docker-1'
args '--entrypoint="" -u root -v /var/run/docker.sock:/var/run/docker.sock'
label 'slave-1'
}
}
将其放置在管道级别上,以供所有阶段使用,或者在每个阶段(如果要逐级分离)放置
感谢João的小修正:)
答案 2 :(得分:0)
感谢答案@Washwater。实际上,我需要进行一些更改。
如果我使用您的建议,它将返回错误“未指定代理类型。必须为[any,docker,dockerfile,label,none]之一”
agent {
node { label "slave-1" }
docker {
image 'image-docker-1'
args '--entrypoint="" -u root -v /var/run/docker.sock:/var/run/docker.sock'
}
}
因此,正确的语法必须是:
agent {
docker {
image 'image-docker-1'
args '--entrypoint="" -u root -v /var/run/docker.sock:/var/run/docker.sock'
label "slave-1"
}
}
答案 3 :(得分:0)
-当我有多个标记为“从属”的节点时,以下代码对我有用 “ init”阶段将从“ slaves”中选择一个节点,随后的阶段将使用具有 env.NODE_NAME (由init状态设置)
的同一节点...
elif keyboard.is_pressed('S'):
if not was_pressed:
if '@' in map1:
map1[place], map2[place] = map2[place], map1[place]
print(f"Moved {map1[place]}, {map2[place]} to {map2[place]} {map1[place]}")
print(*top, sep='')
print(*map1, sep='')
print(*map2, sep='')
print(*map3, sep='')
print(*bot, sep='')
was_pressed = True
elif '@' in map2: # Now only runs once
map2[place], map3[place] = map3[place], map2[place]
print(f"Moved {map2[place]}, {map3[place]} to {map3[place]} {map2[place]}")
print(*top, sep='')
print(*map1, sep='')
print(*map2, sep='')
print(*map3, sep='')
print(*bot, sep='')
was_pressed = True
...