我正在使用Ant+Ivy,我们公司最近为自己的私有库建立了一个Nexus服务器。通过使用ibilio解析器和m2compatible=true,Ivy可以从Nexus服务器获取依赖项,但我必须在ivysettings.xml文件中放置我的凭据。
不同的开发人员应该如何存储他们的凭据?
ivsettings.xml文件是否不应该提交到版本控制系统中?
我真的不想以明文形式存储我的密码。
使用一个包含控制Nexus凭证的属性的设置文件:
<ivysettings>
<property name="repo.host" value="default.mycompany.com" override="false"/>
<property name="repo.realm" value="Sonatype Nexus Repository Manager" override="false"/>
<property name="repo.user" value="deployment" override="false"/>
<property name="repo.pass" value="deployment123" override="false"/>
<credentials host="${repo.host}" realm="${repo.realm}" username="${repo.user}" passwd="${repo.pass}"/>
..
..
</ivysettings>
在运行构建时,您可以指定真实的用户名和密码:
ant -Drepo.user=mark -Drepo.pass=s3Cret
将密码存储为文件系统属性需要加密。
Jasypt有一个命令行程序可以生成加密字符串:
$ encrypt.sh verbose=0 password=123 input=s3Cret
hXiMYkpsPY7j3aIh/2/vfQ==
这可以保存在构建的属性文件中:
username=bill
password=ENC(hXiMYkpsPY7j3aIh/2/vfQ==)
以下ANT目标将解密任何加密的ANT属性:<target name="decrypt">
<taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>
<groovy>
import org.jasypt.properties.EncryptableProperties
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor()
encryptor.setPassword(properties["master.pass"])
Properties props = new EncryptableProperties((Properties)properties, encryptor);
props.propertyNames().each {
properties[it] = props.getProperty(it)
}
</groovy>
</target>
当然,要使这个工作正常运行,加密属性所使用的密码需要作为构建的一部分进行指定。ant -Dmaster.pass=123
这意味着该解决方案仅适用于隐藏静态数据。
出于我的目的,命令行凭据不是一个选项,因为我正在通过Jenkins运行,并且它们会清晰地粘贴在构建输出上,所以这是我的解决方案,通过合理安全来达到平衡。
在您的主目录中创建一个包含敏感信息的属性文件(我们将其称为“maven.repo.properties”)
repo.username=admin
repo.password=password
在您的构建文件顶部附近,导入属性文件
<property file="${user.home}/maven.repo.properties"/>
在build.xml中的发布目标下,设置ivy设置文件的位置(该文件会被检入代码控制),但嵌入您的凭证属性。
<target name="publish">
<ivy:settings file="ivysettings.xml">
<credentials host="repohostname" realm="Artifactory Realm" username="${repo.username}" passwd="${repo.password}"/>
</ivy:settings>
<!-- ivy:makepom and ivy:publish targets go here -->
</target>
按照之前的方式创建ivysettings.xml文件,但是删除username和passwd属性。
然后利用操作系统的权限确保maven.repo.properties文件只有你(或你的自动化构建实现)可以看到。
马克·奥康纳(Mark O'Connor)在他的回答中提供的ivysettings.xml示例实际上应该如下所示:
<ivysettings>
<property name="repo.host" value="default.mycompany.com" override="false"/>
<property name="repo.realm" value="Sonatype Nexus Repository Manager" override="false"/>
<property name="repo.user" value="deployment" override="false"/>
<property name="repo.pass" value="deployment123" override="false"/>
<credentials host="${repo.host}" realm="${repo.realm}" username="${repo.user}" passwd="${repo.pass}"/>
..
</ivysettings>