如何不在 git 中包含带有 API 字符串的 class 文件,但仍然在构建服务器上获取它?
How to not include a class file with API strings in git, but still get it on a build server?
作为最后一年的 IT 学生,我目前正在做我的期末项目,我正在为此创建一个 Android 应用程序。
在我的应用程序中的某个地方,我允许我的用户在从我的应用程序中拍摄照片后立即对其进行编辑。由于这不是应用程序的核心功能,我使用了一个可以完美完成工作的库。为此,我使用 Adobe Creative SDK。
我遵循了他们关于如何集成所需 API 密钥和所有密钥的指南,目前一切都在本地按预期工作。另一方面,在我的自动构建服务器上,我的构建失败了,因为它无法获取 API 密钥,因为包含它们的 class 文件未添加到 git 存储库中服务器构建。
如何为我的构建服务器提供那些 API 密钥而不在 git 中公开它们?
仅供参考:在我的应用程序 class 中,这是检索密钥的方式。
private static final String CREATIVE_SDK_CLIENT_ID = Keys.CSDK_CLIENT_ID;
private static final String CREATIVE_SDK_CLIENT_SECRET = Keys.CSDK_CLIENT_SECRET;
private static final String CREATIVE_SDK_REDIRECT_URI = Keys.CSDK_REDIRECT_URI;
private static final String[] CREATIVE_SDK_SCOPES = Keys.CSDK_SCOPES;
提前致谢!
我设法利用环境变量解决了这个问题。
构建服务器将使用 Jenkins 构建应用程序,因此我设法在 Jenkins 项目设置中配置环境变量。有关如何做到这一点的更多信息,以及我在哪里找到如何做到这一点:http://blog.zuehlke.com/en/configure-your-android-project-on-jenkins/
现在我们在构建服务器上设置环境变量,但当然我们的应用程序仍然需要能够从我们开发人员的机器上构建。为了能够做到这一点,我们还需要在这些机器上设置这些环境变量。
您可以找到很多关于如何在特定平台上执行此操作的指南。但是,此页面解释了它对多个平台的欠债:https://superuser.com/questions/284342/what-are-path-and-other-environment-variables-and-how-can-i-set-or-use-them
在所需机器上设置环境变量后,您需要在应用程序中获取它们。要在应用程序构建时读取环境变量,我们使用 gradle。在您的 app.gradle 中,您应该执行以下操作:
buildTypes {
buildTypes.each {
it.buildConfigField 'String', 'ENV_VAR_ALIAS', "$System.env.ENV_VAR_KEY"
}
}
ENV_VAR_ALIAS 是我们赋予环境变量的别名,以便稍后在我们的代码中访问它,例如应用程序 class 或 Activity class.
ENV_VAR_KEY就是我们要获取的环境变量名。如果您像这样配置环境变量,例如:
键:MY_SECRET_KEY 和 值:MY_SECRET_VALUE
ENV_VAR_KEY 应该是 MY_SECRET_KEY
完成后,我们现在可以使用 BuildConfig 在代码中访问环境变量的值,如下所示:
private final static String MY_ENV_VAR_VALUE = BuildConfig.ENV_VAR_ALIAS;
作为最后一年的 IT 学生,我目前正在做我的期末项目,我正在为此创建一个 Android 应用程序。
在我的应用程序中的某个地方,我允许我的用户在从我的应用程序中拍摄照片后立即对其进行编辑。由于这不是应用程序的核心功能,我使用了一个可以完美完成工作的库。为此,我使用 Adobe Creative SDK。
我遵循了他们关于如何集成所需 API 密钥和所有密钥的指南,目前一切都在本地按预期工作。另一方面,在我的自动构建服务器上,我的构建失败了,因为它无法获取 API 密钥,因为包含它们的 class 文件未添加到 git 存储库中服务器构建。
如何为我的构建服务器提供那些 API 密钥而不在 git 中公开它们?
仅供参考:在我的应用程序 class 中,这是检索密钥的方式。
private static final String CREATIVE_SDK_CLIENT_ID = Keys.CSDK_CLIENT_ID;
private static final String CREATIVE_SDK_CLIENT_SECRET = Keys.CSDK_CLIENT_SECRET;
private static final String CREATIVE_SDK_REDIRECT_URI = Keys.CSDK_REDIRECT_URI;
private static final String[] CREATIVE_SDK_SCOPES = Keys.CSDK_SCOPES;
提前致谢!
我设法利用环境变量解决了这个问题。
构建服务器将使用 Jenkins 构建应用程序,因此我设法在 Jenkins 项目设置中配置环境变量。有关如何做到这一点的更多信息,以及我在哪里找到如何做到这一点:http://blog.zuehlke.com/en/configure-your-android-project-on-jenkins/
现在我们在构建服务器上设置环境变量,但当然我们的应用程序仍然需要能够从我们开发人员的机器上构建。为了能够做到这一点,我们还需要在这些机器上设置这些环境变量。
您可以找到很多关于如何在特定平台上执行此操作的指南。但是,此页面解释了它对多个平台的欠债:https://superuser.com/questions/284342/what-are-path-and-other-environment-variables-and-how-can-i-set-or-use-them
在所需机器上设置环境变量后,您需要在应用程序中获取它们。要在应用程序构建时读取环境变量,我们使用 gradle。在您的 app.gradle 中,您应该执行以下操作:
buildTypes {
buildTypes.each {
it.buildConfigField 'String', 'ENV_VAR_ALIAS', "$System.env.ENV_VAR_KEY"
}
}
ENV_VAR_ALIAS 是我们赋予环境变量的别名,以便稍后在我们的代码中访问它,例如应用程序 class 或 Activity class.
ENV_VAR_KEY就是我们要获取的环境变量名。如果您像这样配置环境变量,例如:
键:MY_SECRET_KEY 和 值:MY_SECRET_VALUE
ENV_VAR_KEY 应该是 MY_SECRET_KEY
完成后,我们现在可以使用 BuildConfig 在代码中访问环境变量的值,如下所示:
private final static String MY_ENV_VAR_VALUE = BuildConfig.ENV_VAR_ALIAS;