运行 docker 在 Jenkins 内部构建 Docker Slave

Run docker build inside Jenkins Docker Slave

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

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

这是我的 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 图片来自 Docker 文件
  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 Slave 中安装 Docker 没有守护进程的 CLI。这个我用过 Docker Agent and installed Docker CLI inside it using this method
  2. 然后作为 docker 守护程序,我使用了我的远程 docker 主机。 (另外,您可以使用这些 steps 将本地 docker 主机配置为远程主机)。您可以使用 docker 远程主机使用 --host 标志。例如。 docker --host x.x.x.x:2375 build -t johndoe:calculator .
  3. 语法:docker --host [Docker_Host]:[Port] build -t [Image_Name]:[Image_Tag] .

我新建的Jenkins文件如下:

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 .'
        }
      }
    }
  }
}

注意:我已将 Docker 主机 URL 作为凭据存储在 Jenkins 上,并使用 withCredentials 函数使用它。