我正在尝试在 Windows Server 2016 上执行 Python 脚本。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 [email protected] '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 [email protected] '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
环境变量无法在单引号字符串中解析。
尝试用双引号替换它们:
ssh [email protected] "set BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG; ..." >> ./cmd_output
此外,您的语法可能无效。
如果您的 shell 是 Windows
cmd.exe
:您不能使用分号 (;
) 来分隔命令。您必须使用与号 (&
)。set VAR1=$VALUE & set VAR2=$VALUE2 & python ...
如果您的 shell 是某些常见 *nix shell 的模拟,例如
bash
:set
命令不用于设置环境变量。在 中bash
,您只需通过赋值即可设置变量,例如BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG
。VAR1=$VALUE1; VAR2=$VALUE2; python ...