簡體   English   中英

如何使用 Jenkins 聲明式管道在遠程 Docker 服務器上構建?

[英]How to build on remote Docker server with Jenkins declarative pipeline?

我在 Jenkins 中編寫了一個聲明性管道。 此管道應在遠程 Docker 服務器上的 Docker 容器中運行。

我閱讀了自定義執行環境

自定義執行環境

Pipeline 旨在輕松使用 Docker 鏡像作為單個 Stage 或整個 Pipeline 的執行環境。 這意味着用戶可以定義其流水線所需的工具,而無需手動配置代理。 實際上任何可以打包在 Docker 容器中的工具。 只需對 Jenkinsfile 進行少量編輯即可輕松使用。

 pipeline { agent { docker { image 'node:7-alpine' } } stages { stage('Test') { steps { sh 'node --version' } } } }

它可以工作,但它使用 Jenkins 服務器作為 Docker 服務器。

我閱讀了使用遠程 Docker 服務器

使用遠程 Docker 服務器

默認情況下,Docker Pipeline 插件將與本地 Docker 守護進程通信,通常通過 /var/run/docker.sock 訪問。

要選擇非默認 Docker 服務器,例如 Docker Swarm,應使用 withServer() 方法。

通過將 URI 和(可選的)在 Jenkins 中預先配置的 Docker 服務器證書身份驗證的憑據 ID 傳遞給具有以下功能的方法:

 node { checkout scm docker.withServer('tcp://swarm.example.com:2376', 'swarm-certs') { docker.image('mysql:5').withRun('-p 3306:3306') { /* do things */ } } }

這有效,但它使用腳本化管道。

我還閱讀了指定 Docker 標簽

指定 Docker 標簽

默認情況下,Pipeline 假設任何配置的代理都能夠運行基於 Docker 的 Pipelines。 對於無法運行 Docker 守護程序的 macOS、Windows 或其他代理的 Jenkins 環境,此默認設置可能有問題。 Pipeline 在 Manage Jenkins 頁面和文件夾級別提供了一個全局選項,用於指定要使用哪些代理(按標簽)來運行基於 Docker 的管道。

但是使用標簽需要一個完整的 Jenkins slave 和 sshd 並且安裝了一個 Jenkins 用戶,並且一直在線並且 Jenkins 的 master 會安裝從庫。 僅使用聲明性管道而不是腳本化管道,這聽起來有點沉重。

如何使用聲明式管道在遠程 Docker 服務器上構建?

我認為你在這里混合了一些東西。 關於代理的文檔部分,代理部分用於標識您的階段應該運行的節點,以及特殊的配置和信息。

Docker 標簽反過來給出了它應該從鏡像內部運行的信息。

這不會為您連接到外部 docker 服務器留下任何空間,除非您將其設置為帶有一些特殊標簽的 Jenkins 節點,例如“docker-special”。 然后你可以做一些簡單的事情

agent {
    docker {
        image 'maven:3-alpine'
        label 'docker-special'
    }
}

docker 標簽上的文檔部分

碼頭工人

使用給定的容器執行管道或階段,該容器將在預先配置為接受基於 Docker 的管道的節點上或在與可選定義的標簽參數匹配的節點上動態配置。

至於您的特定用例。

jenkins文檔的這一部分,提到了 sidecar 模式/高級用法,他們立即切換到腳本。

所以是的,正如我所提到的,這在聲明式中不可用。 聲明式的唯一出路是將外部服務器標記為具有特定標簽的 jenkins 節點。

你不需要一個“完整的 Jenkins slave”——你只需要一台運行 Docker 的機器,它通過 TCP/TLS 為 docker 套接字提供服務,x509 客戶端身份驗證; 不要提供未經身份驗證和未加密的服務,否則您將在安全范圍內打開一個行星大小的漏洞(這是學習 openssl 的機會!;)

對於聲明性,您可以在代理標簽內使用“節點”,並使用標簽關聯的 docker 容器(具有 Jenkins 所需的一切)配置模板。

pipeline {
    agent {
        node {
            label 'docker-agent'
        }
    }
    ...

您需要掛載 docker 套接字(和您的代理工作區),否則您將無法從代理容器內部執行太多操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM