1

Я пытаюсь выполнить скрипт Python на сервере Windows 2016. У меня Win32-OpenSSH установлен на сервере Windows. Скрипт python ожидает присутствия двух переменных среды (BITBUCKET_REPO_SLUG и BITBUCKET_BRANCH). Они уже установлены по умолчанию в конвейере Bitbucket. Сценарий python копируется на удаленный сервер, а затем, используя SSH, я вызываю его из конвейера Bitbucket.

Когда я пытался выполнить следующую команду в моем конвейере Bitbucket ...

scp <copy_python_script_to_win_server> # Works fine
echo $BITBUCKET_REPO_SLUG   # Prints the repo name
echo $BITBUCKET_BRANCH     # Prints the branch name
ssh john.doe@xx.yyy.zzz.xyz 'C:/Python/bin/python.exe C:/Users/john.doe/deploy.py' >> ./cmd_output
echo $?            
cat ./cmd_output

...Я получил следующую ошибку:

Traceback (most recent call last):
  File "C:/Users/john.doe/deploy.py", line 16, in <module>
    print(os.environ['BITBUCKET_REPO_SLUG'])
  File "C:\Python\lib\os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'BITBUCKET_REPO_SLUG'

Мне казалось, что переменные среды Bitbucket не передаются в скрипт python (скорее всего потому, что я запускал его не из самого конвейера, а потому, что вызывал его на удаленном сервере). Таким образом, оставив все как есть, я изменил команду ssh на следующую:

ssh john.doe@xx.yyy.zzz.xyz 'set BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG; set BITBUCKET_BRANCH=$BITBUCKET_BRANCH; C:/Python/bin/python.exe C:/Users/john.doe/deploy.py' >> ./cmd_output

С указанным выше изменением конвейер показывает успешную сборку и статус возврата ($?) всегда печатает 0. Кроме того, cat ./cmd_output ничего не печатает. Как вы можете ожидать, на сервере Windows скрипт python действительно не запускается.

Содержимое C:/Users/john.doe/deploy.py:

import os
...
print(os.environ['BITBUCKET_REPO_SLUG'])
print(os.environ['BITBUCKET_BRANCH'])
...
...

Я не уверен, что именно я делаю не так. Любая помощь будет по достоинству оценена.

1 ответ1

1

Переменные среды не разрешаются в одиночных кавычках.

Попробуйте заменить их двойными кавычками:

ssh john.doe@xx.yyy.zzz.xyz "set BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG;  ..." >> ./cmd_output

Кроме того, ваш синтаксис, вероятно, не действителен.

  • Если вы используете Windows cmd.exe: вы не можете использовать точку с запятой (;) для разделения команд. Вы должны использовать амперсанд (&).

    set VAR1=$VALUE & set VAR2=$VALUE2 & python ...
    
  • Если ваша оболочка является эмуляцией какой-то распространенной оболочки * nix, например, команда bash: set не предназначена для установки переменных среды. В bash вы устанавливаете переменные просто с помощью присваивания, например, BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG .

    VAR1=$VALUE1; VAR2=$VALUE2; python ...
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .