【问题标题】:Commiting google-services.json to GitHub将 google-services.json 提交到 GitHub
【发布时间】:2016-03-19 00:19:17
【问题描述】:

我正在创建一个公共 android 项目,并且正在使用 Google 登录服务。我是按照this tutorial 做的。正如它所说,我有 google-services.json 文件。

  • 我需要将上述文件提交到 Github 吗?
  • 其他开发人员(如果有人贡献)是否需要此文件?
  • 或者,他们必须在那里创建自己的吗?
  • 顺便说一下,我使用的是 Travis-CI。此文件会影响 CI 构建吗?

【问题讨论】:

  • 它对我来说确实是一个相当重要的文件。
  • 是的,但是我需要将该文件提交到 Github 吗?由于它包含我的谷歌应用程序 ID 和东西,这是否意味着其他开发人员也应该为自己生成它?
  • 如果它包含您的敏感数据并且Travis需要它来构建它,您可以file encrypt它。如果它不包含敏感数据并且需要,请添加它。在所有其他情况下,请忽略它。 (如果 Android 存储库添加了它并做同样的事情,我也会环顾四周)
  • Google is not recommending包括 google-services.json 仅适用于开源项目的源代码控制:“对于开源项目,我们通常不建议将应用程序的 Firebase 配置文件或对象包含在源代码控制,因为在大多数情况下,您的用户应该创建自己的 Firebase 项目并将他们的应用指向他们自己的 Firebase 资源(通过他们自己的 Firebase 配置文件或对象)。"

标签: android github travis-ci google-signin


【解决方案1】:

您可以创建一个新的build variant 并存储一个模板google-services.json 用于在您的应用程序build.gradle 中构建您的CI 平台。

为新的dev 构建变体使用不同的google-services.json(请参阅this post)。将以下google-services.json 模板添加到app/src/dev folder

{
  "project_info": {
    "project_number": "",
    "project_id": ""
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "1:123456789012:android:1234567890123456",
        "android_client_info": {
          "package_name": "com.your.package"
        }
      },
      "oauth_client": [
        {
          "client_id": "",
          "client_type": 3
        },
        {
          "client_id": "",
          "client_type": 1,
          "android_info": {
            "package_name": "com.your.package",
            "certificate_hash": ""
          }
        }
      ],
      "api_key": [
        {
          "current_key": ""
        }
      ],
      "services": {
        "analytics_service": {
          "status": 2,
          "analytics_property": {
            "tracking_id": ""
          }
        },
        "appinvite_service": {
          "status": 1,
          "other_platform_oauth_client": []
        },
        "ads_service": {
          "status": 1
        }
      }
    }
  ],
  "configuration_version": "1"
}

请注意,如果您还使用 Google Analytics 或 GCM 服务,我已扩展此 google-services。

您将拥有以下配置:

app/
├── src/
│   ├── main/
│   └── dev/
│       └── google-services.json
├── google-services.json
└── build.gradle

你可以使用任何一个:

  • 一种新的构建类型
  • 一种新的产品风味(如果您已经有现有的)

构建类型

添加以下构建类型:

buildTypes {

    dev {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

我们不需要在常规构建中构建这个“dev”构建变体,所以如果没有指定参数,你可以排除这个变体。将以下内容添加到您的应用中 build.gradle

def build_param = "${build}";

if (build_param != "dev") {
    //exclude production build
    android.variantFilter { variant ->
        if (variant.buildType.name.equals('dev')) {
            variant.setIgnore(true);
        }
    }
} else {
    //exclude all except production build
    android.variantFilter { variant ->
        if (!variant.buildType.name.equals('dev')) {
            variant.setIgnore(true);
        }
    }
}

产品风味

dev 产品风格添加到现有产品风格中:

productFlavors {

    full {
    }

    dev {
    }
}

要从常规构建中删除此 dev 产品风味:

def build_param = "${build}";

if (build_param != "dev") {
    //exclude dev
    android.variantFilter { variant ->
        if (variant.getFlavors().get(0).name.equals('dev')) {
            variant.setIgnore(true);
        }
    }
} else {
    //exclude all but dev
    android.variantFilter { variant ->
        if (!variant.getFlavors().get(0).name.equals('dev')) {
            variant.setIgnore(true);
        }
    }
}

最后,将您的应用模块 google-services.json 添加到 .gitignore

app/google-services.json

我们之前已确保仅在指定参数build=dev 时才会使用此dev 变体

编辑.travis.yml 以修改构建配置:

script:
  - ./gradlew clean build -Pbuild=dev

-Pbuild=dev 只会使用位于app/src/dev/google-services.jsongoogle-services.json 构建开发版本变体

看看使用google-services Google projectthis sample project

Travis log 中,您可以看到正在解析的JSON 文件是dev 构建变体的文件:

Parsing json file: /home/travis/build/bertrandmartel/android-googlesignin/app/src/dev/google-services.json 

补充说明

请注意,此方法不限于 CI,当您需要生产 google-services.json 或不同的 AndroidManifest.xml(具有某些特定属性,如 fabric.io 键)时,可以将其扩展到您的生产构建

检查this method 以防止提交嵌入在 AndroidManifest.xml 中的结构密钥(并且不能从 gradle 导入)使用不同的构建变体并使用参数来启用生产构建。

【讨论】:

    【解决方案2】:

    你可以使用travis encrypt-file google-services.json

    Documentation

    你可以这样做:

    • 通过运行$ gem install travis 安装了 Travis CI 命令行客户端。

    • 使用 $ travis login$ travis login --pro 登录 Travis CI

      $ travis encrypt-file super_secret.txt
      encrypting super_secret.txt for rkh/travis-encrypt-file-example
      storing result as super_secret.txt.enc
      storing secure env variables for decryption
      

    然后它将在控制台上打印:

    openssl aes-256-cbc -K $encrypted_0a6446eb3ae3_key -iv $encrypted_0a6446eb3ae3_iv -in super_secret.txt.enc -out super_secret.txt -d

    您可以将其复制到您的 .travis.yml 文件中,就像我在 here 中所做的那样

    不要忘记将您的 .enc 文件放在您的 GitHub 存储库中。

    如果您有多个文件,您可以将它们压缩,然后在 Travis ci 上解压缩解密的文件。

    例如,您可以这样做:

    $ tar cvf secrets.tar foo bar
    $ travis encrypt-file secrets.tar
    $ vi .travis.yml
    $ git add secrets.tar.enc .travis.yml
    $ git commit -m 'use secret archive'
    $ git push
    

    我做到了。

    就我而言,我有两个文件可用于构建我的应用程序。所以,我使用了this,因为 travis 不支持多个加密文件。因此,您将其压缩到一个文件上并加密该文件。

    你可以看看我的 travis 脚本here

    【讨论】:

      【解决方案3】:

      Firebase 文档似乎暗示将文件提交到 GitHub 没有问题。

      这是the docs的摘录

      Firebase 配置文件包含您项目的唯一但非机密标识符。要了解有关此配置文件的更多信息,visit Understand Firebase Projects.

      【讨论】:

        【解决方案4】:

        Firebase 文档说:

        “对于开源项目,我们通常不建议在源代码管理中包含应用的 Firebase 配置文件或对象,因为在大多数情况下,您的用户应该创建自己的 Firebase 项目并将其应用指向自己的 Firebase 资源(通过他们自己的 Firebase 配置文件或对象)。”

        https://firebase.google.com/docs/projects/learn-more?authuser=0#config-files-objects

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-20
          • 2020-01-04
          • 1970-01-01
          相关资源
          最近更新 更多