有没有办法自动执行将settings.xml(由Maven使用)与域密码更改保持同步的任务?随着越来越多的开发迁移到maven,settings.xml中的repos列表也在增长,因此更新任务也在不断增长。
我们最近开始将maven与一些内部(公司)svn存储库一起使用,这些存储库使用每个开发人员的域用户ID和密码来控制其存储库访问。我们的域密码过期,必须经常更改。这意味着(经常)使用新的密码哈希更新〜/ .m2 / settings.xml。
我更喜欢使用bash或csh解决方案,它使用我系统上已经存在的简单命令。
我在这里看到了对Sonatype Nexus的引用 - 看起来可能会有所帮助,我会向我们的CM工作人员提出建议。但是,如果有的话,我很快就会采纳它并不乐观。我没有时间维护另一个工具的私人副本。
想法?
谢谢, 肯
答案 0 :(得分:2)
我写了一个bash脚本,可以正常工作。它需要在〜/ .m2 / settings.xml中添加一小部分才能获得支持(见下文)。该脚本采用一个可选参数:一个正则表达式字符串,用于匹配与xml文件中的一个或多个密码哈希相关联的可选标记。我用它来表示域名,但它可以是任何东西(或者没有,因为它是可选的)。
脚本提示对新密码进行哈希处理,它会将新生成的哈希限制为纯字母数字(以避免在其他地方出现意外的shell-escapes的潜在问题),它会生成settings.xml的备份副本文件,然后它更新settings.xml中的选定哈希值。这是脚本:
#!/bin/bash
# Update instances of password-hashes in ~/.m2/settings.xml for a given password [and domain]
# Usage: ./mvnpwd.sh [domain-name-regex-string]
# Force domain-string to upper-case to keep things simple ...
mvnDomainNameRegexString=`echo $1 | tr '[a-z]' '[A-Z]'`
echo -n "New Password: "
read -s mvnPassword
echo
# Prefer pure alpha-numeric hash ...
mvnPasswordHash=""
while [ -z "$mvnPasswordHash" ]
do
mvnHashMash=`mvn --encrypt-password "$mvnPassword"`
mvnPasswordHash=`echo "$mvnHashMash" | egrep -o "\{[[:alnum:]]+\=\}"`
done
cp ~/.m2/settings.xml ~/.m2/settings.xml.old
oldPasswordHash=`egrep -o "<changingPasswordHash_*$mvnDomainNameRegexString>\{[a-zA-Z0-9]+\=\}</changingPasswordHash_*$mvnDomainNameRegexString>" ~/.m2/settings.xml | egrep -o "\{[a-zA-Z0-9]+\=\}"`
set $oldPasswordHash
for p do
sed --in-place -e "s/$p/$mvnPasswordHash/g" ~/.m2/settings.xml
done
我在settings.xml文件的顶部附近添加了一个注释块来支持我的脚本。我正在使用类似xml的标记来识别(对于脚本)xml文件中其他地方使用的密码哈希值,并将任何[可选]域名与给定的哈希值相关联。由于所有这些都发生在注释块中,因此maven应该忽略它。这是一个示例settings.xml:
<settings>
<!-- Info below is to aid in updating passwords that change periodically (e.g., domain password) ...
<changingPasswordHash>{SomeHashWithoutADomainxYzZyHaShGiBbErIsHsTuFf=}</changingPasswordHash>
<changingPasswordHash_MYDOMAIN>{SomeHashForMyDomainxYzZyHaShGiBbErIsHsTuFf=}</changingPasswordHash_MYDOMAIN>
<changingPasswordHash_ANOTHERDOMAIN>{SomeHashForAnotherDomainxYzZyHaShGiBbErIsHsTuFf=}</changingPasswordHash_ANOTHERDOMAIN>
-->
<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
<host>myProxy.rightHere.com</host>
<port>80</port>
<username>justMe</username>
<password>{SomeHashWithoutADomainxYzZyHaShGiBbErIsHsTuFf=}</password>
<nonProxyHosts>*.rightHere.com|*.whereIWork.com</nonProxyHosts>
</proxy>
</proxies>
<servers>
<server>
<id>mySVNrepo1.rightHere.com</id>
<username>justMe</username>
<password>{SomeHashForMyDomainxYzZyHaShGiBbErIsHsTuFf=}</password>
</server>
<server>
<id>corpSVNrepo2.whereIWork.com</id>
<username>justMe</username>
<password>{SomeHashForAnotherDomainxYzZyHaShGiBbErIsHsTuFf=}</password>
</server>
<server>
<id>anotherSVNrepo3.notHere.com</id>
<username>myOtherUserID</username>
<password>{SomeHashWithoutADomainxYzZyHaShGiBbErIsHsTuFf=}</password>
</server>
</servers>
</settings>