如何设置Jenkins以在Powershell脚本中使用Knife

3
我正在使用Windows Server 2012 R2上的Jenkins。 我想运行一个构建作业,强制推广后,它应该告诉远程chef服务器配方已更改或更新,然后在远程节点上启动chef-client。
我已安装了Chef Identity插件、 Promoted-builds插件、 MSbuild插件、 TFS-4.0.0插件和Deploy插件。
到目前为止,构建工作正常进行,晋升也能正常工作。 我已设置在强制晋升时运行两个PowerShell脚本。 第一个脚本很好用,只是进行基本数据管理和文件命名。
但第二个脚本说它失败了,但晋升仍然通过,并没有证据表明它起作用了。
我已明确使用Knife路径,因为如果不使用它,Jenkins会给出错误:
WARNING: No knife configuration file found
ERROR: Could not find cookbook MyFirstCookingLesson in your cookbook path, skipping it
ERROR: ArgumentError: Cannot sign the request without a client name, check that :node_name is assigned

如果我添加了-V标志,并通过在Jenkins工作区中右键单击脚本并使用Powershell运行它,我会得到以下信息:

enter image description here

ps1文件包含(我们称其为“Chef-client.ps1”):

C:\opscode\chefdk\bin\knife cookbook upload MyFirstCookingLesson
C:\opscode\chefdk\bin\knife job start 'chef-client' WIN-COMPNAME

使用“执行 Windows 批处理命令”调用 Chef-client.ps1:

cd C:\chef-source\cookbooks
PowerShell.exe -File  C:\chef-source\cookbooks\Chef-client.ps1

我还在Jenkins凭据中设置了Chef身份,如下所示:

Identity name: geoff
user.pem key : <a whole bunch of secret stuffs and gibberish>

knife.rb : 

log_level :info
log_location STDOUT
node_name 'geoff'
client_key 'C:/Users/user123/.chef/geoff.pem'
validation_client_name  'geoff.pem'
validation_key 'C:/Users/user123/.chef/secretName-validator.pem'
chef_server_url 'https://secretLocation.268lab.local/organizations/secretName/'
syntax_check_cache_path 'C:/Users/user123/.chef/syntax_check_cache'
cookbook_path [ 'c:/chef-source/cookbooks/' ]
http_proxy 'http://22.151.32.85:3128'
https_proxy 'http://22.151.32.85:3128'
no_proxy 'secretLocation.268lab.local'
knife[:editor] = '"C:\Program Files (x86)\Notepad++\notepad++.exe"';

所以我发现Jenkins似乎在其自己的用户配置文件中运行,这可能会使一切变得混乱。
我已经阅读了很多设置博客,但没有一个真正告诉我如何明确设置。这些博客要么假设已经完成,要么使用不同的工具。
我还将 .chef 文件夹的副本放在了 Jenkins 工作区和“hopeful”用户配置文件空间中,希望它能起作用。
请问有人可以指导我吗?
1个回答

1

太长了,不能作为评论:

我还发现Jenkins似乎在其自己的用户配置文件中运行,我感觉这可能会导致一切都失控。

如果您的Jenkins用户无法读取user123主目录,则无法读取knife配置文件并正确进行身份验证,因为它无法读取geoff.pem文件。

解决此问题的一种方法是将配置文件、密钥等放入特定目录,并使用knife的-c选项指定配置文件的路径。另一种选择是使用KNIFE_HOME环境变量,但在Jenkins中更容易出错。


抱歉,我已将错误消息上移以便更好地阅读。我假设“-vv”不是(双 u),而应该是“-V”?如果我使用“-vv”,它会成功,如果我使用“-W”,则会显示它不是有效的参数。 - Dean Marsden
将V加倍会使刀更加冗长,我的意思是你向我们展示了一个你说已经修复的错误,这似乎对帮助你没有什么用处。 - Tensibai
1
在这种情况下,我的答案的第一部分是:Jenkins用户访问另一个用户主目录中的文件时存在权限问题。 - Tensibai
好的,那就意味着我正在正确的轨道上工作。但是你是否知道如何解决这个问题呢?我需要将Chef文件放置在Jenkins用户配置文件中,还是更像是配置Jenkins以便能够访问其他用户的主目录? - Dean Marsden
1
个人而言,我使用特定的目录,并通过 -c 选项将路径传递给 knife(这使我可以为开发和生产组织拥有两个配置)。 - Tensibai
显示剩余5条评论

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