繁体   English   中英

如何在 Jenkins 从节点上运行 Dockerfile 代理?

[英]How to run Dockerfile agent on a Jenkins Slave Node?

请在下面帮助我。 我在一台共享服务器上安装了 Jenkins。 目前被多个团队使用,因此不允许在那里安装额外的软件包/软件。 每个团队都有自己的专用从节点添加到他们根据需要进行配置的位置。 同样,我们有一个专用节点来运行我们的工作。(这也是我想运行我的工作的地方)

我有 bitbucket 存储库,其中“ Jenkinsfile ”将具有部署步骤和“ Dockerfile ”,我们希望从中创建容器并在其中运行部署步骤。

我试图先用一些例子来测试这个。 所以我有这样的“ Dockerfile ”。

#This image is Developed from ubuntu:18.04-Dockerhub
FROM ubuntu:18.04

#Updating System Packages and installing required packages
RUN apt-get update && \
    apt-get install -y openssh-server wget git curl zip unzip && \
    apt-get clean

#Installing rsync
RUN apt-get install -y rsync 

我在哪里有“ Jenkinsfile ”,如下所示。

pipeline {
    agent { node { label 'slave_node' } }
    stages {
        stage('Test') {
            agent {
                dockerfile true
            }
            steps {
                sh 'cat /etc/os-release'
                sh 'curl --version'
                sh 'echo Successfully compiled'
            }
        }
    }
} 

当我执行这个管道作业时,

  • 它获取 Jenkins 文件。
  • 在提到的从节点上正确启动。
  • 签出回购代码。
  • 分阶段进行
  • 但是当涉及到阶段('Test')时,Node 变回“Master Jenkins”并再次开始检查 repo 代码。 [这是我有问题的地方。 我不知道为什么会切换]
  • 分阶段进行
  • 运行“Docker 文件”
  • 尝试从集线器中提取图像。 但由于“找不到 Docker 命令”而使作业失败(预期错误,因为主节点没有设置。

问题是:为什么 Job 从 Slave_node 切换到 master_node? 请帮忙。 提前致谢。

如果我在我的个人笔记本电脑上运行它,它工作得非常好。

我会在 Jenkins 中检查您的 Docker 设置。 可能您已将主节点定义为默认 Jenkins 代理,因此当您仅使用 'dockerfile: true' 运行时,它会尝试在主节点上运行构建。

您可以通过在本文档中搜索“指定 Docker 标签”来找到对此特定选项的参考。

https://www.jenkins.io/doc/book/pipeline/docker/

参考https://www.jenkins.io/doc/book/pipeline/docker/我能够使用脚本化管道来满足我的需求。 所以在这里发布作为答案。

但我仍然不知道声明式管道有什么问题。

node ('slave_node') {
    checkout scm
    def customImage = docker.build("custom-image-name")
    customImage.inside {
        sh 'Inside Container'
        sh 'cat /etc/os-release'
    }
}

谢谢

找到了另一种方法来实现这一点。 我们可以使用 dockerfile 功能本身与任何代理节点结合。

示例如下

#!/usr/bin/env groovy
pipeline {
  agent {
    dockerfile {
      filename 'Dockerfile'
      label 'slave_node'
    }
  }
  stages {
    stage("example stage") {
      steps {
        script {
          sh 'cat /etc/os-release'
          sh 'curl --version'
          sh 'echo Successfully compiled'
        }
      }
    }
  }
}

可以在此处找到源:语法并搜索关键字“dockerfile”以查找详细信息。

以下代码也有效,如果您不想实时构建 docker 图像,可以使用此代码。 所以不需要Dockerfile,我们可以直接指定镜像名称。

pipeline {
    agent {
        docker { 
            image 'image-name'                 
            label 'common-build-machine' 
        }
    }
...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM