Docker Jenkins Pipeline устанавливает глобальные пакеты NPM - PullRequest
0 голосов
/ 02 февраля 2019

Я новичок в 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, но мне нужно было бы изменить множество репозиториев и их сценариев, просто чтобы сделать эту работу, и я бы предпочел не делать этого.

ОБНОВЛЕНИЕ : Похоже, что конвейер игнорирует изменения переменной среды PATH в

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

Есть ли специальная возможность для изменения PATH?или может проблема с разрешением?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Вот отформатированный, надеюсь, полезный ответ, после попытки разобраться с их подробной документацией.

Прежде всего, блок environment объявляет пары ключ-значение уровня Дженкинса:

  • Уровень Дженкинса не является уровнем рабочей области, уровень интерполяции переменной выбирается в зависимости от типа кавычек, поэтому, если я правильно понял:

    echo '$PATH' будет отображать рабочую область PATH («по умолчанию», в вашем случае)

    echo "$PATH" будет интерпретироваться Дженкинсом, следовательно, будет отображаться «модифицированный» PATH

  • Допустимы только пары ключ-значение: хотя это выглядит как установка переменной среды оболочки, вы также можете написать PATH = something, тогда как пробелы вокруг = не будут работать в оболочке

ItПохоже, что в основном предполагалось выставлять параметры без ведома рабочей области, зная их, как если бы пользователь в интерактивном режиме предоставлял информацию (они много говорят о полномочиях).

Во-вторых, только ограниченный список шагов делает допустимые вызовы, и шага export нет.

Но есть шаг withEnv, который должен выполнить эту работу.Я не нашел ни одного примера в декларативном pipeline { ... }, только в скриптовых блоках node { ... }, определение декларативной версии гласит, что все шаги допустимы.И я нашел пример шага, оборачивающего блок stage (хотя в node), поэтому будем надеяться, что он одинаков для stages (в противном случае вам придется указывать withEnv для каждого stage -или в качестве другой обертки внутри 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 может быть интересным и весьма кстати.более гибким.

Я бы хотел получить отзыв об этом от ОП или любого гуру Дженкинса!

0 голосов
/ 02 февраля 2019

Если вы используете декларативные конвейеры для сборки, нет смысла устанавливать что-либо глобально.

Если вы установили angular-cli во время выполнения конвейера, npm установит для вас переменную PATH, а ng будетдоступно.

Глобальная установка имеет смысл, если вы создаете свой собственный образ и планируете использовать его позже.Но в этом случае изображение будет удалено после сборки.

В таких случаях я использую sh "ls -la1 $dir_name" или sh "whereis ng" для отладки проблем "исполняемый файл не найден".

Также, если вы используете декларативный конвейер, вы можете использовать самые легкие изображения без привязок CI.Я использую узел: 8.11.3-stretch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...