Grunt无法在Azure Web Site上运行

7

我正在尝试使用Azure的Git部署构建和打包我的项目。

我创建了以下文件

  • .deployment
  • deploy.cmd
  • Gruntfile.js
  • package.json

我的.deployment文件调用deploy.cmddeploy.cmd通过设置路径来包括Node.js和npm的检入版本,从而设置环境。我可以成功地调用npm install。当我调用grunt时,它似乎执行到第一个标准输出消息,然后返回并设置错误返回代码。我没有得到任何其他信息。其他命令似乎运行得很好。

我尝试将STDERR输出到管道中,但没有运气。我尝试在Remote Execution控制台下运行,那里也没有运气。我的Gruntfile.js在本地运行得很好。

我是否缺少某些神奇酱料?


当你说“远程执行控制台”时,你指的是什么?尝试从scm服务的根目录(与git url相同的主机名)启动诊断控制台。它在那里失败了吗?你能粘贴出确切的输出吗?此外,如果有一个最小的repo可以分享,那将有助于调查。有可能是沙盒阻止了某些东西。 - David Ebbo
@DavidEbbo 是的,我指的是诊断控制台。它在那里失败了。我只是得到了C提示符。我正在复制文件,在复制它们后删除其中一些(不需要,但是作为Git子模块的一部分),运行一些模板并解析环境变量。所以这是相当标准的东西。沙盒阻止哪些分类的事情? - Daniel A. White
沙盒块的确有些微妙。您可能还想查看诊断转储(https://github.com/projectkudu/kudu/wiki/Investigating-issues#getting-the-diagnostic-dump),其中可能会有更多信息。如果您能分享一个最小的存储库,让我们能够看到您所看到的内容,我们应该能够确定发生了什么。 - David Ebbo
1个回答

15
这篇文章有点过时,但我会回答它,以防有人遇到同样的问题。

首先,建议禁用颜色运行grunt,因为诊断控制台和部署日志难以处理ANSI代码。要做到这一点,请运行grunt --no-color。这应该将STDOUT信息返回到控制台和部署日志中。

其次,我不建议使用已检入的Node或NPM版本。Windows Azure已经将它们构建到环境中,并已配置了特殊的临时路径和缓存路径,以便两者以最佳状态执行。

Project Kudu是驱动Azure部署的部署引擎,但您已经知道这一点,因为您有一个 .deployment 文件。然而,Azure命令行工具[npm install azure-cli --global]将帮助您创建一些更好的部署脚本,这些脚本将使用Azure预安装的Node和NPM设置。

azure site deploymentscript –-node

我会为您提供基础的节点脚本。

从那里开始,需要对deploy.sh进行一些修改,以便可靠地执行Grunt。在deploy.sh中有一个#Deployment部分。请用以下内容替换其内容:

# Deployment
# ----------

echo Handling node.js grunt deployment.

# 1. Select node version
selectNodeVersion

# 2. Install npm packages
if [ -e "$DEPLOYMENT_SOURCE/package.json" ]; then
  eval $NPM_CMD install
  exitWithMessageOnError "npm failed"
fi

# 3. Install bower packages
if [ -e "$DEPLOYMENT_SOURCE/bower.json" ]; then
  eval $NPM_CMD install bower
  exitWithMessageOnError "installing bower failed"
  ./node_modules/.bin/bower install
  exitWithMessageOnError "bower failed"
fi

# 4. Run grunt
if [ -e "$DEPLOYMENT_SOURCE/Gruntfile.js" ]; then
  eval $NPM_CMD install grunt-cli
  exitWithMessageOnError "installing grunt failed"
  ./node_modules/.bin/grunt --no-color clean common dist
  exitWithMessageOnError "grunt failed"
fi

# 5. KuduSync to Target
"$KUDU_SYNC_CMD" -v 500 -f "$DEPLOYMENT_SOURCE/dist" -t "$DEPLOYMENT_TARGET" -n "$NEXT_MANIFEST_PATH" -p "$PREVIOUS_MANIFEST_PATH" -i ".git;.hg;.deployment;deploy.sh"
exitWithMessageOnError "Kudu Sync to Target failed"

这将运行npm install,然后是bower install(如果存在bower.json),接着是grunt clean common dist(如果存在Gruntfile.js),最后是KuduSync到您的/wwwroot。(注意:用您需要运行的Grunt任务替换'clean common dist'。)
您可能会遇到其他一些问题。我在个人博客上的文章中写了这个,并包括了一些您可能会遇到的问题。

Jay,这个方法可以用来让Azure网站在我使用Git部署后立即运行我的Karma测试,而不是我自己运行它们(类似于Travis-CI)吗? - pilau
感谢提供示例。我也查看了相关的博客文章,但没有找到与我的问题相关的内容。我将bower和grunt步骤复制到我的deploy.sh文件中。当我部署时,在部署日志中会出现这个错误消息“grunt-cli:grunt命令行界面。(v0.1.13)网站部署期间发生错误。grunt失败。”有什么想法吗? - moke
azure site deploymentscript --node 会在我的情况下生成一个 deploy.cmd 文件。这是否意味着这篇文章现在已经过时了?! - Vaibhav
@Vaibhav 不是这样的。你是在Windows上生成的。它会在OS X上生成bash文件,在Windows上生成等效的批处理文件。这些示例只是所有Bash中发生的事情,但可以在任何平台上完成。 - Jay Harris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接