簡體   English   中英

帶有來自 SCM 的 Docker/Dockerfile 代理的 Jenkins 聲明式管道

[英]Jenkins declarative pipeline with Docker/Dockerfile agent from SCM

對於使用詹金斯的Declarative Pipeline Syntax我如何得到Dockerfile( Dockerfile.ci在這個例子中)從SCM(GIT),因為agent塊之前的所有階段執行?

pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.ci'
        }
    }
    stage ('Checkout') {
        steps {
            git(
                url: 'https://www.github.com/...',
                credentialsId: 'CREDENTIALS',
                branch: "develop"
            )
        }
    }
    [...]
}

在我看到的所有示例中,Dockerfile 似乎已經存在於工作區中。

您可以嘗試分別為每個階段聲明代理,對於結帳階段,您可以為其他階段使用一些默認代理和 docker 代理。

pipeline {
    agent none
    stage ('Checkout') {
        agent any
        steps {
            git(
                url: 'https://www.github.com/...',
                credentialsId: 'CREDENTIALS',
                branch: "develop"
            )
        }
    }
    stage ('Build') {
        agent {
            dockerfile {
            filename 'Dockerfile.ci'
        }
        steps {
            [...]
        }
}
    }
    [...]
}

如果您使用的是多分支管道,它會在評估代理之前自動檢查您的 SCM。 因此,在這種情況下,您可以從 SCM 中的文件中指定代理。

答案在關於 Dockerfile 參數Jenkins 文檔中

為了使用這個選項,Jenkinsfile必須從 Multibranch Pipeline 或來自 SCM 的 Pipeline 加載。

只需向下滾動到 Dockerfile 部分,它就記錄在那里。

這種方法的明顯問題是它損害了管道的開發。 現在,不是在服務器上的管道字段中測試代碼,而是必須為每個可測試的更改提交到源存儲庫。 還要注意Jenkinsfile 結帳不能是稀疏或輕量級的,因為這只會拾取腳本——而不是任何要構建的隨附 Dockerfile。

我可以想到幾種方法來解決這個問題。

  1. 使用reuseNode true指令針對節點中的代理進行開發。 然后當代碼穩定時,單獨的代理塊可以在 Jenkinsfile 的頂部組合在一起,然后必須從 SCM 加載。
  2. 使用指定確切工作區目錄的dir()解決方案進行開發,或者交替使用此解決方案中的其他示例之一。

暫無
暫無

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

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