我想使用Nant(V0.86.3317.0)在SourceGear Vault(V4.1.4)中执行许多任务。
我们有没有办法让Vault使用Nant的Windows身份验证来创建连接?
我用来初始化文件库连接的Nant块是:
<target name="InitialiseVaultSettings">
<echo>InitialiseVaultSettings</echo>
<vaultsetloginoptions user="${vault.Username}" password="${vault.Password}" URL="${vault.Host}" repository="${vault.Repository}" />
<vaultsetworkingfolder repositoryFolderPath="${vault.Folder}" diskPath="${vault.WorkingDirectory}" createDiskPath="true" />
当我与其他开发人员合作开发项目时,将用户名和密码硬编码到Nant构建文件中并不是一个好主意。 username
和password
都是vaultsetloginoptions
命令中的必需选项。
其他替代品(全部带有渔获量)包括:
(a)使用该帐户将“管理员”帐户硬编码到Nant属性和日志库中。这不是很好,因为我们放松了一个审计线索,负责谁负责nant脚本执行的签入/签出操作。当解决方案已检出文件时,它也会导致问题(部分脚本可确保在Vault中生成标签之前将所有文件都检入源控件中。)
(b)使用Nant代码中的C#脚本动态设置用户名和密码的属性...除非我们遇到了从用户那里获取密码的问题
(c)从Vault客户端读取存储的配置文件信息并使用它进行连接(除了我不确定它存储在何处)。
感谢您的考虑。
答案 0 :(得分:3)
我对Vault不熟悉,请原谅这个答案的潜在模糊性。我和NAnt一起工作过,任何执行的任务(任务,执行等)都具有在集成的身份验证模式下运行的固有潜力。
最后,身份验证会传递给正在运行父NAnt进程的用户。话虽这么说,这可能表明Vault的NAnt任务不支持集成身份验证?这意味着,如果 vaultsetloginoptions 任务需要用户和密码参数,那么就没有好的方法来传递凭据(正如您所指出的那样)。
如果可能没有变通办法可能缺少Vault的NAnt任务,则可能使用<exec
>任务来调用其客户端工具的命令行版本(甚至不确定他们是否有一个)。如果这是一个选项,只要运行NAnt进程的用户与需要连接到Vault的用户相同,集成身份验证就会自动启动。
我们必须为我们在构建过程中集成的一些内容执行此操作。我们要么执行命令行版本,要么通过扩展NAnt框架编写我们自己的任务。无论哪种方式,这应该是可能的。
有些人在Vault论坛上看了一下,似乎 AD集成只是让Vault Client提示用户并传递给服务器的一种方式。 From the forum:
Vault客户端将始终提示 用户名/密码。我们的AD 集成仅限于服务器 验证输入的密码 匹配Active中的密码 目录。
因此,客户端没有 true 方式以内置方式传递Windows身份验证信息。 Vault客户端程序要求在AD模式下运行时输入用户名和密码。可悲的是,似乎没有存储用户名/密码,无缝 NAnt集成的可能性很小。
答案 1 :(得分:1)
我已成功实施原型来解决这个问题。
下面介绍的解决方法的完整源代码和二进制文件可以在这里找到:
我创建了一些自定义的NAnt任务和功能。
<VaultLogin>
检查Windows注册表以获取先前存储的用户名和密码信息。如果未找到,则会提示用户显示“登录”窗口。它将条目存储在两个函数中并清除注册表(如果登录失败 - 请参阅下面的<SaveVaultLogin>
):
${VaultLoginFunctions::UserName()}
${VaultLoginFunctions::Password()}
然后<vaultsetloginoptions>
任务可以使用这些功能:
<vaultsetloginoptions user="${VaultLoginFunctions::UserName()}" password="${VaultLoginFunctions::Password()}" URL="${vault.Host}" repository="${vault.Repository}" />
调用<vaultsetloginoptions>
任务后,我们调用<SaveVaultLogin>
任务,将用户名和密码值写回注册表。这可确保仅存储成功的身份验证详细信息(如果用户名和密码不正确,则脚本在任务中失败。
这是放在一起的代码块:
<target name="InitialiseVaultSettings">
<echo>InitialiseVaultSettings</echo>
<loadtasks assembly="CompassHealth.NAntExtensions.Tasks.dll" />
<VaultLoginGet />
<echo message="UserName = ${VaultLoginFunctions::UserName()}" />
<vaultsetloginoptions user="${VaultLoginFunctions::UserName()}" password="${VaultLoginFunctions::Password()}" URL="${vault.Host}" repository="${vault.Repository}" />
<vaultsetworkingfolder repositoryFolderPath="${vault.Folder}" diskPath="${vault.WorkingDirectory}" createDiskPath="true" />
<!-- need to save the login here, as it is cleared once VaultLoginGet is called, this ensures that only correct username and password are stored -->
<VaultLoginSave />
更新:链接到二进制文件和源代码,以便在帖子顶部进行解决。
答案 2 :(得分:0)
在查看Scott Saad的建议之后,遗憾的是,在命令行工具中似乎没有选项可以使用Windows身份验证来调用它。
我目前的想法符合上述(b)。
我将创建一个可以从Nant脚本调用的库,询问当前Windows用户的Vault用户名和密码。
该库将在resigstry条目中查找以前输入的Vault用户名并登录此Windows用户。如果它存在,它将被传递给脚本而无需任何用户交互。
如果此用户名/密码未通过保险库登录,或者如果该登录不存在,则该库将提供一个对话框,供用户输入当前保管库用户名和密码。
用户的条目将存储在注册表中(加密),这意味着每次Vault用户名和密码更改时,只需输入一次。
不是一个理想的解决方案,但应该相对简单,并且可以接受足够的工作。
您怎么看?