如何在Jenkinsfile管道中使用docker代理



我在GitHub上传了一个Django项目,我需要将它与jenkins链接。我在Ubuntu 20.04机器上安装了Jenkins和Docker服务。

我用我的repo配置了Jenkins服务器,并安装了所有建议的plggins+docker管道插件。

之后,我创建了一个Jenkinsfile,它使用docker代理在python docker容器中运行stage,但我得到了"詹金斯没有"码头工人"的标签;在控制台输出中。我试图在项目设置中添加标签docker,但仍然出现相同的错误!

这是我的詹金斯档案:

pipeline {
agent any
stages {

stage("install pip dependencies") {
agent { 
docker {
label "docker" 
image "python:3.7"
}
}
steps {
withEnv(["HOME=${env.WORKSPACE}"]) {
sh "pip install virtualenv"
sh "virtualenv venv"
sh "pip install -r requirements.txt "
}
}
}
}}

我错过了什么?

谢谢!

该消息意味着您唯一可用的节点,恰好是您的Jenkins控制器,没有您在此块中的代理上所需的标签docker

agent {
docker {
label 'docker'
image 'python:3.7'
}
}

将标签docker添加到控制器,然后重新启动Jenkins(需要识别标签更改,尽管这让我很惊讶。这可能是标记控制器本身的一个特点,因为如果可能的话,应该避免将作业安排在那里运行(解决了这个问题。

预贴标签:

Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test
[Pipeline] {
[Pipeline] stage
[Pipeline] { (install pip dependencies)
[Pipeline] node
Still waiting to schedule task
‘Jenkins’ doesn’t have label ‘docker’
Aborted by admin
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: ABORTED

贴标签后,重新启动前:

Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test
[Pipeline] {
[Pipeline] stage
[Pipeline] { (install pip dependencies)
[Pipeline] node
Still waiting to schedule task
‘Jenkins’ doesn’t have label ‘docker’
Aborted by admin
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: ABORTED

重启后,突出显示我的控制器没有安装docker

Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test
[Pipeline] {
[Pipeline] stage
[Pipeline] { (install pip dependencies)
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test@2
[Pipeline] {
[Pipeline] isUnix
[Pipeline] sh
+ docker inspect -f . python:3.7
/var/jenkins_home/workspace/test@2@tmp/durable-4a9f38a7/script.sh: 1: /var/jenkins_home/workspace/test@2@tmp/durable-4a9f38a7/script.sh: docker: not found
[Pipeline] isUnix
[Pipeline] sh
+ docker pull python:3.7
/var/jenkins_home/workspace/test@2@tmp/durable-58d19d02/script.sh: 1: /var/jenkins_home/workspace/test@2@tmp/durable-58d19d02/script.sh: docker: not found
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 127
Finished: FAILURE

您的管道将如下所示:

pipeline {
agent {
label 'docker'
}
stages {
stage('install pip dependencies') {
steps {
withEnv(["HOME=${env.WORKSPACE}"]) {
sh'''
pip install virtualenv
virtualenv venv
pip install -r requirements.txt
'''
}
}
}
}
}

但是,在您需要遵循以下步骤使jenkins将docker容器作为奴隶运行之前:

  • 在主机上安装docker
  • 将jenkins添加到docker组:sudo usermod -aG docker jenkins
  • 将文件/lib/systemd/system/docker.service中的ExecStart=/usr/bin/dockerd行修改为以下ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// -s overlay2 --containerd=/run/containerd/containerd.sock
  • 运行sudo systemctl daemon-reloadsudo systemctl restart docker
  • 在Jenkins中配置docker部分:manage Jenkins -> manage nodes and clouds -> configure clouds -> add a new cloud -> docker在docker URL字段中键入tcp://127.0.0.1:2375 (or 4243)unix:///var/run/docker.sock。配置代理,设置任何标签并在管道中使用

您可能需要关闭selinux。

最新更新