TeamCity构建运行程序无法识别执行文件。

23

我正在尝试在TeamCity中作为构建的一部分运行一个简单的gruntfile.js。然而,即使安装了全局的node包grunt和grunt-cli,TeamCity仍然无法识别它们。我可以在命令行中输入grunt并且它可以正常工作,但是当我通过命令行运行它或者通过参数运行可执行文件时,TeamCity仍然会给出以下错误:

'grunt'不是内部或外部命令

我还尝试安装TeamCity.Node,这是一个用于运行grunt脚本的插件,但它也找不到grunt。任何想法?

8个回答

34

我不能让被接受的解决方案起作用。 对我而言,问题在于TeamCity服务(服务器和代理)正在系统帐户下运行。 据我所知,“全局安装npm软件包供操作系统的所有用户使用”这一概念不存在。 所以我:

  1. 创建了一个TeamCity Windows用户
  2. 更改了TeamCity服务以运行该用户
  3. 作为TeamCity用户登录操作系统
  4. 运行npm install -g grunt-cli
  5. 重新启动服务。

从那里开始,NodeJS、NPM和Grunt任务就开始工作了。


1
这可能是比我的更好的解决方案。很不错的发现! - Caleb Jares
另请参见:http://stackoverflow.com/questions/16805023/path-on-windows-2008-server-actually-not-working/16805124?noredirect=1#16805124 - Caleb Jares

14

这是对Christopher答案的补充(我没有足够的声望来进行评论)。

如果您不想在构建服务器上创建用户,您可以编写执行npm包的完整路径。以下是一个命令行运行程序,可在不创建专用构建服务器用户的情况下运行Weyland

  • 命令可执行文件:"C:\Program Files\nodejs\node.exe"
  • 命令参数:c:\users\Administrator\AppData\Roaming\npm\node_modules\weyland\bin\cli.js build

顺便说一句,Node.js安装程序似乎有另一种解决方案。不幸的是,它被删减了!

以下是Node.js安装程序的屏幕截图:


2
我只是想提醒一下,对于我来说,Nodejs安装程序为每个用户安装了npm,但其他用户要想让环境变量生效,我必须重启电脑。 - Erti-Chris Eelmaa

5
我遇到了与在尝试将grunt与TFS一起使用时遇到相同的问题,其中它会由tfsservice用户运行。像Christopher的答案建议的那样以不同的用户身份运行我们的构建对我们来说不是一个选项。在我将C:\Users\tfsservice\AppData\Roaming\npm添加到tfsservice用户的Path后,当我手动登录为tfsservice时,它能够找到grunt-cli,但是当TFS Build代理执行构建时却无法找到。首先,我只是更改了我的构建过程,以使用grunt.cmd文件的完整路径。

所以我从这个使用中进行了更改:

grunt deploy

要使用这个:

"C:\Users\tfsservice\AppData\Roaming\npm\grunt.cmd" deploy

我想,对于您的Team City用户也这样做将修复问题。当然,如果您这样做,必须确保在所有构建服务器上都安装了grunt-cli。原来,我只是错过了重新启动电脑的最后一步(以便tfsservice会重新启动),然后构建就可以找到grunt而无需指定完整路径。 我假设Zeke Lu的答案中显示的已修剪的node.js安装程序说明将要说其他用户需要更新其Path环境变量。

我可以确认重新启动解决了我的问题,现在一切都按预期工作,没有任何猴子乱搞。 - Eric Brown - Cal

4
请确保%AppData%\Roaming\npm路径已添加到 Windows 全局路径变量中,重启团队代理服务即可。

我不知道为什么它被踩了,事实上我确实做到了这一点。最小化影响的东西...谢谢。 - harishr
我不相信%AppData%在全局环境变量中起作用(在Server 2019 1809上进行了测试)-它需要在用户环境路径变量中。 - Sam Rueby
我从用户路径变量中获取了路径 "C:\Users<user>\AppData\Roaming\npm",并将其添加到系统路径变量中。然后我不得不使用服务窗口应用程序重新启动TeamCity Build Agent服务。 - Augusto Barreto

2

在安装NPM后,您应该重启TeamCity Build Agents。


1

我知道这个问题有点老了。但最近我也遇到了同样的问题,一直找不到解决方法……但最终我找到了。以下是解决方法。

TeamCity构建步骤应该包括:

1)安装grunt-cli 命令行 命令:npm install grunt-cli

2)运行grunt构建任务 命令行 命令:node "node_modules/grunt-cli/bin/grunt" build

两种情况的工作目录都应该是你的gruntfile.js所在的位置。


0

您不需要将TeamCity帐户从系统更改为本地{{link1:像Christoper写的那样}}。这是更简单的方法:

1. [构建代理机器] 确保您的PATH中有node目录和本地npm软件包目录,例如:

C:\Users\'yourUserName'\AppData\Roaming\npm;C:\Program Files\nodejs
  1. [构建代理机器] 全局安装grunt:npm install grunt-cli
  2. [构建步骤] 在项目目录中运行cmd:npm install -g grunt-cli您只需执行此步骤一次(在本地计算机上),然后提交文件更改到存储库
  3. [构建步骤] 在项目目录中运行cmd:npm install
  4. [构建步骤] 作为powershell脚本运行grunt build:powershell -Command "grunt build"

由于某些原因,以系统帐户运行的构建代理无法通过cmd访问C:\Users\'yourUserName'\AppData\Roaming\npm,但可以通过powershell访问。


0
这是一个奇怪而非常烦人的bug,但我终于找到了一个解决方法。在`%AppData%\Roaming\npm`目录下,有两个文件:"grunt"和"grunt.cmd"。"grunt"是一个Unix文件,而"grunt.cmd"应该使用node来运行grunt-cli应用程序,但事实并非如此。我不得不创建一个名为"grunt.bat"的新文件(它优先于"grunt.cmd"),其内容如下:
node "%~dp0\node_modules\grunt-cli\bin\grunt" %*

现在它正常工作了,但我不确定原因是什么。

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