jenkins上的android build release apk,没有以纯文本格式存储我的密码

时间:2014-12-01 18:09:07

标签: android jenkins apk android-build

我需要能够使用Jenkins工作构建我的apk的发布版本。

阅读以下SO问题

How to create a release signed apk file using Gradle?

我知道我可以通过两种方式之一来做到这一点。要么让用户在cmd提示符下输入密码,要么将我的密码详细信息存储在一个没有提交给git的纯文本文件中,并存在于我的本地计算机上。

但是在jenkins上运行构建作业时,这些都不起作用。 1)我无法获得用户输入,因为这可能是在半夜运行(即使用户在他们的机器上,我甚至不知道如何从cmd线路获得用户输入)2任何可以访问该构建框的人都可以通过cmd行或在该jenkins服务器上运行的另一个build.gradle作业捕获该文件的内容。

有没有人知道我可以隐藏密码,但Jenkins的工作可以访问它?

由于

3 个答案:

答案 0 :(得分:6)

您可以使用Mask Password Plugin,它就是这样做的。或者EnvInject插件中包含相同的功能,并且迟早所有Jenkins项目都需要EnvInject插件(这可以做很多其他事情),所以不妨现在就开始使用它。

在构建/构建后步骤中安全地使用密码

  • 安装EnvInject plugin
  • Jenkins全球配置下,找到全局密码部分。
  • 添加名称(这将是环境变量名称)和密码(将加星标****)。
  • 作业配置下,找到构建环境部分。
  • 选中标记将构建密码作为环境变量注入
  • 然后选中全局密码

在任何构建步骤中,您现在可以使用$name(如前所述)来引用密码,就像您在纯文本中输入密码一样。

  • 密码变量仅在作业执行时注入(在服务器的命令行上键入$name本身不会产生任何内容,并且像所有Jenkins变量一样,它不是持久的)。
  • 如果出现,作业控制台日志将显示****而不是密码。
  • 您可以为每个作业配置密码,而不是全局,以便其他作业无法使用它。

唯一的安全问题是,如果某人具有管理权限来配置您的作业,他们可以将echo $name > secretpassword.txt写入构建步骤,然后查看工作区中的文件。但是你应该小心为谁分配管理权限。

答案 1 :(得分:1)

答案 2 :(得分:0)

如果您的Jenkins实例恰好在EC2上运行,并且您不想在文件系统中永久存储机密,则可以将商店和密钥密码放入Systems Manager Parameter Store,然后在构建时查询它们。此外,您可以将密钥库本身放入外部存储(例如S3),并且只在构建期间将其保留在本地。

以下是一个示例构建脚本(假设秘密参数名为android-keystore-passandroid-signature-key-pass):

set -o errexit
set -o pipefail

keystore_file=keystore.properties
keystore=wise.jks

aws s3 cp s3://path-to-android/$keystore .

chmod go-rwx $keystore

touch $keystore_file
chmod go-rwx $keystore_file

cat > $keystore_file << EOF
storePassword=`aws ssm get-parameters --names android-keystore-pass --with-decryption | cut -f4`
keyPassword=`aws ssm get-parameters --names android-signature-key-pass --with-decryption | cut -f4`
keyAlias=android
storeFile=$WORKSPACE/$keystore
EOF

可以找到Gradle构建脚本的示例in this answer。您可以向源控件提交虚拟keystore.properties,以便(非发布)构建在dev计算机上工作。

还有一些独立于平台的开源秘密分发工具,例如: Vault,但我没有尝试过任何一个。