Невозможно экспортировать переменную env из скрипта - PullRequest
0 голосов
/ 08 апреля 2020

Я сейчас пытаюсь запустить скрипт .sh, который пытаюсь вызвать с Дженкинс .

В разделе «Выполнение оболочки» Jenkins я подключаюсь к удаленному серверу (Агент Jenkins не имеет нужной ОС для сборки того, что мне нужно. ), используя:

cp -r . /to/shared/drive/to/have/access/on/remote
ssh -t -t username@servername << EOF
    cd /to/shared/drive/to/have/access/on/remote
    source build.sh dev
    exit
EOF

Внутри build.sh, я экспортирую R_LIBS для создания пакета для различных версий R .

...
for path in "${!rVersionPaths[@]}"; do
    export R_LIBS="${path}"
    Rscript -e 'install.packages(c("someDependency", "someOtherDependency"), repos="http://cran.r-project.org");'
...

Настройка R_LIBS должна функционировать здесь как настройка lib в пределах install.packages(...). По какой-то причине R_LIBS export не подняли. Также установка других переменных env, таких как http_proxy, игнорируется. Это приводит к сбою любых запросов вне сети.

Есть ли какой-то конкретный способ добиться этого?

Ответы [ 5 ]

1 голос
/ 15 апреля 2020

Возможно передать эти переменные с помощью env, например

env R_LIBS="${path}" Rscript -e 'install.packages(c("someDependency", .....
0 голосов
/ 20 апреля 2020

Вы, вероятно, не хотите source build.sh, просто вызовите его напрямую (т.е. удалите команду source).

Путем source -ing файла, который ваш скрипт выполняется в S SH shell (скорее всего sh), а не bash, что звучит так, как вы и хотели.

0 голосов
/ 17 апреля 2020

Вы сказали, что "R_LIBS export не забрали". Вопрос Значение UNSET? Или для него задано какое-то другое значение, и вы пытаетесь его переопределить?

Возможно, S SH может вызывать "/ bin / sh - c". Основываясь на втором ответе на: Почему команда 'cd' не работает через S SH? , вы можете упростить команду S SH и явно вызвать сценарий сборки. sh в Bash:

cp -r . /to/shared/drive/to/have/access/on/remote
ssh -t -t username@servername "cd /to/shared/drive/to/have/access/on/remote && bash -f build.sh dev"

Это делает вызов S SH более похожим на вызов команды в удаленной интерактивной оболочке. (Вы можете избежать создания сценариев поиска и экспорта переменных.)

Вам не нужно export R_LIBS или env R_LIBS, когда возможно использовать префикс любой команды с переопределением переменных локальной среды (согласен с ответом Луиса) :

...
for path in "${!rVersionPaths[@]}"; do
    R_LIBS="${path}" Rscript -e 'install.packages(c("someDependency", "someOtherDependency"), repos="http://cran.r-project.org");'
...

Rscript может многое делать с переменными env. Вы можете проверить, что вы устанавливаете R_LIBS env var, заменив Rscript командой env и наблюдая вывод:

...
for path in "${!rVersionPaths[@]}"; do
    R_LIBS="${path}" env
...

Согласно этому руководству " Инициализация при запуске сеанс R", Rscript просматривает несколько мест для загрузки" файлов сайта и пользователя ":

  • $ R_PROFILE
  • $ R_HOME / etc / Renviron
  • $ R_HOME / etc / Renviron.site
  • $ R_ENVIRON_USER
  • $ R_PROFILE_USER
  • . /. Rprofile
  • $ HOME / .Rprofile
  • . /. RData

В разделе «Примеры» этого руководства показано следующее:

## Not run: 
## Example ~/.Renviron on Unix
R_LIBS=~/R/library
PAGER=/usr/local/bin/less

Если добавить параметр командной строки --vanilla для игнорирования все эти файлы, тогда вы можете получить разные результаты и знать, что что-то в файлах сайта / init / environment влияет на ваш R_LIBS! Я не могу запустить эту систему сам. Надеюсь, мы дали вам несколько областей для расследования.

0 голосов
/ 17 апреля 2020

Вы можете установить эту переменную в той же командной строке следующим образом:

R_LIBS="${path}" Rscript -e \
    'install.packages(c("someDependency", "someOtherDependency"), repos="http://cran.r-project.org");'

Таким способом можно добавить больше переменных. Обратите внимание, что эти переменные среды будут установлены только для команды, вызываемой после них (и для ее дочерних процессов).

0 голосов
/ 14 апреля 2020

Ну, я не могу прокомментировать вопрос, поэтому разместил его как ответ.

У меня была похожая проблема при вызове скрипта удаленной оболочки из Jenkins, проблема была в том, что переменные bash_profile не загружались при вызове сценарий от Дженкинса, но локально это работает. Загрузка профиля bash в соединение s sh решила его для меня.

Добавление исходного кода в bash_profile в сборке. sh

. ~/.bash_profile ИЛИ source ~/.bash_profile

Или перезагрузите bash_profile в s sh соединение

`ssh -t -t username@servername << EOF
   . ~/.bash_profile
   your commands here
   exit
EOF
...