簡體   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