对于以下示例,我有两个问题:
pipeline {
agent { label "docker" }
stages {
stage('Build') {
agent {
docker {
image 'maven:3.5.0-jdk-8'
}
}
steps {
...
}
}
}
}
问题1:
当我在Jenkinsfile的顶层声明agent时,这意味着它将用于以下所有阶段。那么之间的区别是什么?
agent { label "docker" }
和
agent {
docker {
image 'maven:3.5.0-jdk-8'
}
}
第一个将使用docker代理,第二个将使用maven映像作为可执行环境的docker代理?标签“ docker”代理是在哪里配置/安装的?
问题2:
标签标签如何工作?我知道某个地方已经创建了代理程序,并使用标签指向了它,就像上面的示例一样:默认情况下,我使用“ docker”代理程序?这还意味着在steps {...}
期间,此代理将被 maven 代理覆盖吗?
问题3:
以下示例的最后一个问题:
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v ... -e ...'
}
}
stages {
stage('Maven Build') {
steps {
sh '...'
}
}
stage('Docker push') {
agent {
docker 'openjdk:8-jdk-alpine'
}
steps {
script {
docker.build("my-image")
}
}
}
}
post {
...
}
}
我想使用带有 maven:3-alpine 映像的docker容器构建第一阶段。在构建过程中,将显示以下错误:
...tmp/durable-54b54bdc/script.sh: line 1: docker: not found
所以我修改了这个示例,这是工作结果:
pipeline {
agent any
stages {
stage('Docker push') {
steps {
script {
docker.build("my-image")
}
}
}
}
}
在这种情况下,任何代理商如何工作?哪个代理可以执行docker.build?
答案 0 :(得分:0)
答案1:
agent { label "docker" }
这将尝试查找标签为docker
的代理,并在该代理中执行步骤。
agent {
docker {
image 'maven:3.5.0-jdk-8'
}
}
这将尝试提取名称为maven:3.x.x
的docker映像并启动容器并执行管道中提到的步骤。如果您使用的是MultiJob
,则会根据以下配置在带有标签的从站中执行:
答案2:
在管道的顶级定义agent
可确保将执行程序分配给标记为docker
的代理。据我所知,我假设将在标记为docker
的代理中创建docker容器,并且将在该容器内执行步骤。
答案3:
原因可能是,您可能尚未配置Docker Label
(请参见上图)。该任务可能已在未安装docker的主服务器中执行。其他一项工作的原因可能是因为该作业是在安装了docker的代理中执行的。