【问题标题】:Read Jenkins environment variables in Android project? Sign APK for automated builds在 Android 项目中读取 Jenkins 环境变量?为自动构建签署 APK
【发布时间】:2017-01-14 22:22:59
【问题描述】:

以为我会通过搜索找到答案,但没有运气。我计划自动化我的构建过程并通过我的 Jenkins 服务器上的fastlane 将构建上传到Crashlytics BetaCrashlytics beta 需要签名的 APKS,但我当然不想将我的 keystore 和密码直接添加到我的 build.gradle 文件中,然后再添加到版本控制中。

我被指向 Jenkins 环境变量的方向。这就是我在我的 Android 项目中所拥有的:

signingConfigs {
   release {
        storeFile file(ANDROID_KEYSTORE)
        storePassword ANDROID_STORE_PASSWORD
        keyAlias ANDROID_KEY_ALIAS
        keyPassword ANDROID_STORE_PASSWORD
   }
}

然后在我的gradle.properties 文件中,我有以下内容:

ANDROID_KEYSTORE=$ANDROID_KEYSTORE
ANDROID_STORE_PASSWORD=$ANDROID_STORE_PASSWORD
ANDROID_KEY_ALIAS=$ANDROID_KEY_ALIAS

当我尝试通过fastlanejenkins 上构建我的项目时,我收到以下错误:

* What went wrong:
Execution failed for task ':app:validateReleaseSigning'.
> Keystore file /Users/macmini/.jenkins/workspace/AndroidProject/app/$ANDROID_KEYSTORE not found for signing config 'release'.

另一件事,我在终端中有 env,它向我显示了所有系统 env 变量,我定义的那些变量不存在,所以我不完全确定 Jenkins 将它们放在哪里。我需要直接路径吗?那会是什么?

感谢任何帮助,谢谢!

【问题讨论】:

    标签: android jenkins environment-variables fastlane


    【解决方案1】:

    来自 Fabric 和 Fastlane 的 Mike。

    我不相信这个:

    ANDROID_KEYSTORE=$ANDROID_KEYSTORE
    ANDROID_STORE_PASSWORD=$ANDROID_STORE_PASSWORD
    ANDROID_KEY_ALIAS=$ANDROID_KEY_ALIAS
    

    将以您希望的方式工作。如果你已经用你想要的值设置了环境变量,你可以在你的build.gradle 中使用String.valueOf(System.env.ANDROID_KEYSTORE) 等,并跳过在gradle.properties 中添加任何其他内容。

    【讨论】:

    • 稍微调整一下就可以了。我不得不改为 String.valueOf(System.env.ANDROID_KEYSTORE) 否则我的项目将无法编译并出现以下错误:路径和 baseDir 都可能为 null 或空字符串
    【解决方案2】:

    假设您的问题是:“我是否需要直接(或绝对)路径(到密钥库)”和“那(路径)是什么”。

    我会回答“否”和“它可能是日志最后一行中显示的路径,但包括变量 $ANDROID_KEYSTORE 的扩展”!

    事实上,我遇到了您希望在 Jenkins GNU/Linux 从站上实现几乎相同的问题。

    首先,我认为您面临的问题是那些环境变量不会从 gradle.properties 文件中扩展! Groovy 有时很神奇,所以我检查并确定:它不会那样做,这就解释了为什么您的密钥库路径错误(包含字符串“$ANDROID_KEYSTORE”而不是变量的值)。

    要解决这个问题,我看到了两个选项:

    1. 您可以尝试配置您的 Jenkins 作业(可能使用前置步骤)以生成具有扩展值的 gradle.properties 文件:

      echo "ANDROID_KEYSTORE=${ANDROID_KEYSTORE}" >> gradle.properties

    您甚至可以考虑使用here 建议的特定属性文件。

    1. 在我看来,一个更灵活的选择是添加一些代码来尝试从环境中读取这些变量,然后使用上述属性文件来定义默认值(如果某些开发人员有密钥的副本,这很有用并允许手动发布版本)。

    我已经在 app/build.gradle 中成功测试了类似的东西:

    // Load a specific properties file to access the keystore if exists
    def keystoreProperties = new Properties()
    def keystorePropertiesFile = rootProject.file("keystore.properties")
    
    if (keystorePropertiesFile.exists() ) {
        // Load keystore properties from file
        keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    } else {
        // Load keystore properties from environment or set their default values
        def env = System.getenv()
        if (env['ANDROID_KEYALIAS']) keystoreProperties.put('keyAlias', env['ANDROID_KEYALIAS'])
        else keystoreProperties.put('keyAlias', "myDefaultAlias")
        if (env['ANDROID_KEYPASSWORD']) keystoreProperties.put('keyPassword', env['ANDROID_KEYPASSWORD'])
        else keystoreProperties.put('keyPassword', "myDefaultKeyPass")
        if (env['ANDROID_STOREFILE']) keystoreProperties.put('storeFile', env['ANDROID_STOREFILE'])
        else keystoreProperties.put('storeFile', "./keystore.jks")
        if (env['ANDROID_STOREPASSWORD']) keystoreProperties.put('storePassword', env['ANDROID_STOREPASSWORD'])
        else keystoreProperties.put('storePassword', "myDefaultStorePass")
    }
    
    ...
    
    android {
        signingConfigs {
            release {
                keyAlias keystoreProperties['keyAlias']
                keyPassword keystoreProperties['keyPassword']
                storeFile file(keystoreProperties['storeFile'])
                storePassword keystoreProperties['storePassword']
            }
        }
    

    我确信这可以改进很多,并且可能会转而使用环境变量覆盖属性(如果存在)。但它今天对我有用。

    话虽如此,正如您所提到的,如果您在env 命令的输出中没有看到这些变量,您最好查找它们。我建议您使用 env 命令开始构建步骤。当然,在单独的终端中输入此命令不会显示 Jenkins 为该特定构建所做的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2018-09-21
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多