Circle CI 可以引用 gradle.properties 凭据吗?

Can Circle CI reference gradle.properties credentials?

我正在为 Android 项目设置 Circle CI 构建,想知道如何将 gradle.properties 文件添加到我的项目构建中。我使用本地 gradle.properties 来存储我的 API 密钥和敏感数据。其他 CI 工具(即 Jenkins)允许您上传 gradle.properties 文件以在所有构建中使用,但我无法在 Circle CI 中找到执行此操作的方法。

似乎环境变量是 Circle CI 允许您向项目添加秘密凭据的唯一方式。

有没有办法在 Circle CI 构建中使用来自 gradle.properties 的凭据?

我找到了一种通过 Circle CI 添加凭据/API 密钥到 gradle.properties 的方法。它允许 Android 项目以与本地和 CircleCI 构建相同的方式引用 gradle.properties 凭据。

第一步,将您的凭据作为环境变量存储在您的 Circle CI 项目设置中,保证是私有的。在 Circle CI GUI 中,转到您的项目,然后在右上角选择 select "Project Settings"。在左侧的菜单中单击 "Tweaks" header 下的 "Environment variables"。您可以在此处将您的凭据添加为名称值对。

接下来,在您的 Android 项目中创建一个 bash 脚本,它将您的 Circle CI 环境变量写入本地 gradle.properties 文件。我写过这样的脚本posted it here as gist。这是完成工作的方法:

function copyEnvVarsToGradleProperties {
    GRADLE_PROPERTIES=$HOME"/.gradle/gradle.properties"
    export GRADLE_PROPERTIES
    echo "Gradle Properties should exist at $GRADLE_PROPERTIES"

    if [ ! -f "$GRADLE_PROPERTIES" ]; then
        echo "Gradle Properties does not exist"

        echo "Creating Gradle Properties file..."
        touch $GRADLE_PROPERTIES

        echo "Writing TEST_API_KEY to gradle.properties..."
        echo "TEST_API_KEY=$TEST_API_KEY_ENV_VAR" >> $GRADLE_PROPERTIES
    fi
}

此脚本仅在 Circle CI 构建期间调用,而不是在本地构建期间调用。在您的 circle.yml 文件中将此脚本作为 pre-process 依赖项调用,以便您的 gradle.properties 在实际 gradle 构建开始之前编写:

dependencies:
    pre:
        - source environmentSetup.sh && copyEnvVarsToGradleProperties

您将像往常一样继续访问 build.gradle 中的 API 键:

buildConfigField("String", "THIS_TEST_API_KEY", "\"" + TEST_API_KEY + "\"")

gradle.properties 中的所有属性添加到 CircleCI "Environment Variables",但在它们前面加上:

ORG_GRADLE_PROJECT_

根据您的环境,您还可以使用 base64 到 encode/decode gradle.properties。这在我的 macOS CircleCI 环境中对我有用:

  • 在我的本地 macOS 计算机上,我使用以下方法对我的 multi-line gradle.properties 文件进行了编码:

    base64 < gradle.properties > encoded-gradle.properties

  • 我复制了encoded-gradle.properties中的值并将它放在一个CircleCI环境变量中(在本例中,将变量命名为:GRADLE_PROPERTIES_DATA

在我的 CircleCI config.yaml 文件中,在构建之前,创建了 gradle.properties 文件并对编码值进行解码并将其放入 gradle.properties,使用以下内容:

echo $GRADLE_PROPERTIES_DATA | base64 --decode > gradle.properties