繁体   English   中英

在 Jenkins Docker 从站内运行 docker 构建

[英]Run docker build inside Jenkins Docker Slave

目前我有一个具有以下阶段的 CI 管道:

  1. 建造
  2. 单元测试
  3. Static代码分析

这就是我的 Jenkinsfile 的样子:

pipeline {
  agent any

  stages {
    stage("Install") {
      steps {
        sh "npm install"
      }
    }
    stage("Build") {
      steps {
        sh "npm run build"
      }
    }
    stage("Format") {
        steps {
            sh "npm run format"
        }
    }
    stage("Lint") {
      steps {
        sh "npm run lint"
      }
    }
    stage("Test") {
      steps {
        sh "npm run test"
      }
    }
    stage("Code Coverage") {
      steps {
        sh "npm run test:cov"
        publishHTML(target: [
            reportDir: "./coverage/lcov-report",
            reportFiles: "index.html",
            reportName: "Jest Coverage Report"
        ])
      }
    }
    stage("End-To-End Testing") {
      steps {
        sh "npm run test:e2e"
      }
    }
  }
}

我想在我的管道中添加更多阶段:

  1. 构建并标记 Docker 图像来自 Dockerfile
  2. 将镜像推送到 Docker Hub
  3. 需要 Docker CLI 的更多步骤

例子:

pipeline {
  .
  .
  .
  stage("Docker Build") {
    steps {
      sh "docker build -t [user_name]/[image_name]:[tag] .
    }
  }
}

我对此很陌生,我尝试了多种安装 docker 的方法,但没有成功,这也是一种不好的做法。

我们可以运行docker run -v /var/run/docker.sock:/var/run/docker.sock...但我不能在使用 docker 构建命令时使用绑定安装。

有人可以建议我在 Jenkins SSH 代理中使用 docker 命令的方法吗?

解决方案

  1. 在 Jenkins Docker 从站中安装没有守护程序的 Docker CLI。 我已使用此Docker 代理并使用此方法在其中安装了 Docker CLI
  2. 然后作为 docker 守护程序,我使用了我的远程 docker 主机。 (此外,您可以使用这些步骤将本地 docker 主机配置为远程主机)。 您可以使用 --host 标志使用 docker 远程主机。 例如docker --host xxxx:2375 build -t johndoe:calculator.
  3. 语法: docker --host [Docker_Host]:[Port] build -t [Image_Name]:[Image_Tag].

我的新 Jenkinsfile 如下:

pipeline {
  agent any

  stages {
    stage("Install") {
      steps {
        sh "npm install"
      }
    }
    stage("Build") {
      steps {
        sh "npm run build"
      }
    }
    stage("Format") {
        steps {
            sh "npm run format"
        }
    }
    stage("Lint") {
      steps {
        sh "npm run lint"
      }
    }
    stage("Test") {
      steps {
        sh "npm run test"
      }
    }
    stage("Code Coverage") {
      steps {
        sh "npm run test:cov"
        publishHTML(target: [
            reportDir: "./coverage/lcov-report",
            reportFiles: "index.html",
            reportName: "Jest Coverage Report"
        ])
      }
    }
    stage("End-To-End Testing") {
      steps {
        sh "npm run test:e2e"
      }
    }
    stage("Docker Build") {
      steps {
        withCredentials([string(credentialsId: 'Docker_Host', variable: 'DOCKER_HOST')]) {
          sh 'docker --host $DOCKER_HOST build -t xxx/xxx .'
        }
      }
    }
  }
}

Note: I have stored Docker host URL on Jenkins as a credential and used it using withCredentials function.

暂无
暂无

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

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