Serverless WSGI在Bitbucket流水线中执行失败(本地运行正常)
看起来你遇到的核心问题是:流水线中sls wsgi manage无法识别已部署的函数,但本地执行完全正常。结合你的配置和流水线步骤,我整理了几个最可能的原因和对应的解决办法:
1. 流水线步骤的工作目录不一致(最可能)
Bitbucket Pipelines的每个独立步骤(就是你用-列出的每一行)默认都是在仓库根目录执行的,单个步骤里的cd src只会在当前步骤生效,下一个步骤会自动回到根目录。
你看,你在「配置Serverless」步骤里有cd src,但后面的sls deploy、sls wsgi manage都是单独的步骤,这意味着这些命令其实是在根目录执行的——而你的serverless.yml是放在src目录里的!虽然sls deploy可能因为之前的插件安装或其他原因侥幸成功,但sls wsgi manage对配置的依赖更直接,找不到正确目录下的serverless.yml就会识别不出函数名,抛出undefined错误。
解决办法:把所有需要在src目录执行的命令合并到同一个脚本块里,确保工作目录始终正确。比如修改流水线配置为:
script: | cp requirements.txt src/requirements.txt serverless config credentials --provider aws --key ${AWS_KEY} --secret ${AWS_SECRET} cd src sls plugin install -n serverless-python-requirements sls plugin install -n serverless-wsgi sls plugin install -n serverless-dotenv-plugin sls deploy --stage ${LOCAL_SERVERLESS_STAGE} sls deploy list functions sls wsgi manage --stage ${LOCAL_SERVERLESS_STAGE} --command "migrate" sls wsgi manage --stage ${LOCAL_SERVERLESS_STAGE} --command "collectstatic --noinput"
用script: |把所有命令串起来,这样cd src之后的所有命令都会在src目录下执行。
2. sls wsgi manage未指定部署的Stage
你部署的时候用了--stage ${LOCAL_SERVERLESS_STAGE},但执行wsgi manage时没加这个参数。Serverless默认会用serverless.yml里配置的dev stage,如果你的LOCAL_SERVERLESS_STAGE不是dev,那wsgi manage会去查找dev stage的函数——而这个stage根本没部署过,自然找不到。
解决办法:给sls wsgi manage命令加上--stage ${LOCAL_SERVERLESS_STAGE}参数,和部署时保持一致,比如:
sls wsgi manage --stage ${LOCAL_SERVERLESS_STAGE} --command "migrate"
3. 强制指定函数名(兜底方案)
如果上面两个办法都不行,可能是serverless-wsgi插件在流水线环境里没正确识别到你的WSGI函数。你可以直接在命令里显式指定函数名(你的函数叫app),强制插件找到正确的函数:
sls wsgi manage --function app --stage ${LOCAL_SERVERLESS_STAGE} --command "migrate"
你可以先试试第一个办法,这是Bitbucket流水线里最常见的路径问题,大概率能解决你的问题。
内容的提问来源于stack exchange,提问作者Bryant Makes Programs

