簡體   English   中英

Docker Jenkins Pipeline 安裝全局 NPM 包

[英]Docker Jenkins Pipeline install global NPM packages

我是 Docker/Jenkins 的新手。

Jenkins 通過以下方式觸發容器

docker run -t -d -u 995:315 -w /workspace/projectname -v /workspace/projectname:/workspace/projectname:rw,z -v /workspace/projectname@tmp:/workspace/projectname@tmp:rw,z  circleci/node:latest

我的管道

pipeline {
    agent {
        docker {
            image 'circleci/node:latest'
        }
    }
    environment { 
        HOME="."
        NPM_CONFIG_PREFIX="${pwd()}/.npm-global"
        PATH="$PATH:${pwd()}/.npm-global/bin:${pwd tmp: true}/.npm-global/bin"
    }
    stages {
        stage('NPM Config') {
            steps {
                sh 'npm install -g @angular/cli'
                echo "PATH is: $PATH"
                sh '.npm-global/bin/ng version'
                sh '/workspace/projectname/.npm-global/bin/ng version'
                sh 'ng version'
            }
        }
    }
}

echo "PATH is: $PATH"打印出來

PATH is: /sbin:/usr/sbin:/bin:/usr/bin;/usr/bin/;/etc/;/etc/ssh/ssh/:/workspace/projectname/.npm-global/bin:/workspace/projectname@tmp/.npm-global/bin

這兩個

sh '.npm-global/bin/ng version'
sh '/workspace/projectname/.npm-global/bin/ng version'

做我期望sh 'ng version'做的事情。 但是, sh 'ng version'給了我以下錯誤

ng version
/workspace/projectname@tmp/durable-9f9bc04a/script.sh: 2: /workspace/projectname@tmp/durable-9f9bc04a/script.sh: ng: not found

我試圖避免建立自己的形象,下一步該怎么做?

此外,我只會使用npx ,但我需要更改很多 repos 及其腳本才能使其正常工作,我寧願不這樣做。

更新:看起來管道忽略了更改下的 PATH 環境變量

environment { 
   HOME="."
   NPM_CONFIG_PREFIX="${pwd()}/.npm-global"
   PATH="/foo/bar"
}

是否有特殊的可能來修改 PATH? 或者可能是權限問題?

如果您使用聲明性管道進行構建,那么全局安裝任何東西都是沒有意義的。

如果您在管道執行期間安裝 'angular-cli',npm 將為您設置 PATH 變量,並且 ng 將可用。

如果您構建自己的映像並計划稍后重用它,則全局安裝是有意義的。 但在這種情況下,構建后圖像將被刪除。

在這種情況下,我使用sh "ls -la1 $dir_name"sh "whereis ng"來調試“找不到可執行文件”的問題。

此外,如果您使用聲明性管道,您可以使用最輕的圖像而無需 CI 綁定。 我使用節點:8.11.3-stretch

這是一個格式化的,希望有用的答案,在嘗試用他們的詳細文檔解決問題之后。

首先, environment塊聲明 Jenkins 級別的鍵值對:

  • Jenkins 級別不是工作區級別,根據引號的類型選擇可變插值級別,所以如果我理解正確:

    echo '$PATH'將顯示工作區PATH (在您的情況下為“默認”)

    echo "$PATH"將由 Jenkins 解釋,因此顯示“修改后的” PATH

  • 僅鍵值對有效:即使它看起來像 shell 環境變量設置,您也可以編寫PATH = something=周圍的空格在 shell 中不起作用

似乎主要是在工作區不知道參數的情況下公開參數,就像用戶會交互式地提供信息(他們談論很多憑據)。

其次,只有有限的步驟列表進行有效調用,並且沒有export步驟。

但是有一個withEnv步驟應該可以完成這項工作。 我沒有在聲明性pipeline { ... }找到任何示例,僅在腳本node { ... }塊中,聲明性版本的定義聲明所有步驟都是有效的。 我發現了一個步驟包裝stage塊的示例(盡管在一個node ),所以讓我們希望它對於stages是相同的(否則你必須在每個stage指定withEnv - 或者作為一個stage內的另一個包裝器 - 這需要你的環境模組:當然可行但又很無聊)。

像這樣的事情應該有效,或者至少值得一試:

  pipeline {
    agent { ... }
    environment { 
      HOME="."
      NPM_CONFIG_PREFIX="${pwd()}/.npm-global"
      PATH="$PATH:${pwd()}/.npm-global/bin:${pwd tmp: true}/.npm-global/bin"
    }
    withEnv(["PATH=$PATH", /*or*/ "PATH=${PATH}", /*or*/ "PATH+NPM=${pwd()}/.npm-global/bin:${pwd tmp: true}/.npm-global/bin"]) {
      stages {
        stage('NPM Config') {
          steps { ... }
        }
        stage('something else that needs ng') { ... }
      }
    }
  }

反正你懂這個意思。

最后,如果這個PATH東西不起作用並且比重寫管道更困擾你,那么使用帶有node塊的腳本替代方案可能會更有趣並且更靈活。

我很想從 OP 或周圍的任何 Jenkins 大師那里得到一些反饋!

正確的方法是使用 Jenkins 的 Node.js 插件。 它允許您管理不同版本的 node 和 npm 包,而無需在構建機器上手動安裝它們。 這是一個全局使用節點 13 和 eslint 的配置示例: 在此處輸入圖片說明

在您的管道中,您可以執行以下操作:

stage('Use node commands and npm packages') {
  steps {
    nodejs(nodeJSInstallationName: 'node13') {
      sh 'npm -v'  //substitute with your code
      sh 'node -v'
      sh 'eslint ...'
    }
  }
}

完整示例: https : //pillsfromtheweb.blogspot.com/2020/05/how-to-use-different-nodejs-versions-on.html

暫無
暫無

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

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