簡體   English   中英

帶有 docker-workflow-plugin.inside 的 Jenkins 管道 DSL 不允許通過 withEnv 設置/修改 PATH

[英]Jenkins pipeline DSL with docker-workflow-plugin .inside doesn't allow setting/modification of PATH via withEnv

問題

我想修改 docker 容器中的路徑來控制工具選擇,而無需修改現有的管道代碼。 我有一個共享庫和客戶端構建調用 runAnsible,然后通過 docker-workflow-plugin 在 docker 容器中運行管道 DSL。

但是,當我使用withEnv docker.inside 時,我無法修改路徑

docker.inside() {
   withEnv("PATH=${env.PATH}:/ansible2.10/bin") {
    sh 'echo PATH=$PATH'
   }
 }

當導致 PATH= 舊路徑值且不包含我的修改時。 根據JENKINS-45916 ,這不是錯誤,而是它是如何工作的,我們都告訴過 - 不要那樣做,使用不同的圖像等

那么,除了用不同的路徑制作一堆非常相似的圖像之外,我還有什么選擇來改變路徑呢?

Docker 工作流插件允許將參數傳遞給創建容器的 docker 運行命令。 這些 args 只是一個字符串,它的完整性似乎受到 pluign 的尊重,而withEnv在這種情況下具有某種過濾器。

因此,這是可行的,但它確實假設我知道或可以確定原始路徑。 我可以在不修改路徑的情況下運行容器,並通過 docker.inside 使用sh(script: 'echo $PATH', returnStdout: true).trim()在前面的步驟中獲取knownOriginalPath以支付下面的代碼

// hardcoded because I own the image or have determined what the image's path normally is
def knownOriginalPath="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

// my change to the path - in this case, a custom tool location used because I don't want to have to modify a bunch of existing pipeline code.
def pathModification="/ansible2.10/bin"
def desiredPath="${pathModification}:${knownOriginalPath}"


    docker.withRegistry(...) {
       // for now, the plugin seems to respect the integrity of the inside option string.
        docker.image(..)inside("-e PATH=${desiredPath}") {
            sh 'echo PATH = $PATH'        
        }
    } 

暫無
暫無

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

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