별도의 개발자 및 제품 Firebase 환경


154

Firebase를 MBaaS로 사용하는 것을 고려하고 있지만 다음 문제에 대한 확실한 해결책을 찾지 못했습니다.

개발 용과 프로덕션 용으로 각각 별도의 Firebase 환경을 설정하고 싶지만 개발 환경과 프로덕션 환경간에 기능 (예 : 원격 구성 설정, 알림 규칙 등)을 수동으로 복사하고 싶지 않습니다. .

신뢰할 수있는 도구 나 방법이 있습니까? 원격 구성 또는 알림 규칙을 처음부터 설정하는 것은 어려운 작업이며 너무 위험 할 수 있습니다.

어떤 제안? 두 개의 별도 환경이있는 것보다 더 나은 방법이 있습니까?

별도의 Firebase 계정을 설정하는 방법을 설명하는 질문에 대한 다른 답변을 게시하기 전에 질문이 아닙니다. 다시 읽으십시오. 문제는 별도의 개발자 계정과 제품 계정간에 변경 사항을 전송하는 방법 또는 수동으로 복사하는 것보다 더 나은 솔루션입니다.


3
이것을 기능으로 사용하는 것이 좋습니다!
Patrick


@Timmerz 첫 번째 답변보기 : 호스팅 및 데이터베이스에만 관련되어 있지만 다른 기능에는 해당되지 않습니다.
racs

비슷한 문제가 발생했습니다. 다음과 같은 방법으로 해결했습니다. 다음을 확인하십시오. stackoverflow.com/questions/51646512/… 다음과 같은 방법으로이 문제를 해결했습니다 . 1. 디버그 구성을 작성하십시오. ... medium.com/@Miqubel/... : 2.Then은 링크를 따르십시오 새 데이터베이스를 만들 firebase.google.com/docs/database/usage/... 를 기반으로 해당 데이터베이스에 연결하는 제품의 맛에 따라 코드 3.In를 제품에
Kunal Khaire

1
@LOG_TAG 완전히 새로운 태그를 생성 한 이유는 무엇입니까? [firebase]에서 아직 다루지 않은 새로운 기술을 다루고 있습니까?
Michael Dodd

답변:


24

모두가 지적했듯이 둘 이상의 프로젝트 / 데이터베이스가 필요합니다.

그러나 설정 / 데이터 등을 개발에서 프로덕션으로 복사 할 수 있어야한다는 질문에 답하십시오. 나는 똑같은 필요가 있었다. 개발 및 테스트에서 몇 달 동안 데이터를 수동으로 복사하고 싶지 않았습니다.

결과는 데이터를 스토리지 버킷에 백업 한 다음 거기에서 다른 데이터베이스로 복원하는 것입니다. 이 작업을 수행하는 것은 매우 조잡한 방법이며 전체 데이터베이스 백업 / 복원을 수행했지만보다 통제 된 방식으로 해당 방향을 살펴볼 수 있습니다. 나는 그것을 사용하지 않았다-그것은 매우 새로운 것이지만 이것은 해결책일지도 모른다 : NPM Module firestore-export-import

편집 : Firestore 백업 / 내보내기 / 가져 오기 정보 여기 Cloud Firestore 데이터 내보내기 및 가져 오기

Firestore가 아닌 Firebase RTDB를 사용하는 경우이 문서가 도움이 될 수 있습니다. Firebase 자동 백업

프로덕션 데이터베이스가 개발과 동일한 스토리지 버킷에 액세스 할 수 있도록 권한을 올바르게 설정해야합니다. 행운을 빕니다.


1
감사합니다. 지금까지 가장 좋은 답변입니다.
racs

4
사용자가 수천 명인 프로젝트의 경우 프로덕션 데이터베이스에서 스테이징 또는 개발 서버 로 일부 데이터를 이동하게됩니다 . Firebase에 내장되어 있지 않은 것은 부끄러운 일이지만 모든 유형의 프로젝트에 대해 수행해야 할 일입니다.

"프로젝트 간 데이터 이동"안내서를 사용하여 데이터베이스를 가져 왔습니다. 그러나 데이터 스토어 모드에서 Firestore 데이터베이스를 생성했습니다. 기본 모드에서 사용해야합니다.
데비 프라 사드

54

firebase-tools firebase use를 사용하는 경우 사용할 프로젝트를 설정할 수 있는 명령 이 있습니다.firebase deploy

firebase use --add프로젝트 목록을 불러 와서 하나를 선택하면 별명을 묻습니다. 거기에서 당신은 할 수 firebase use aliasfirebase deploy해당 프로젝트에 밀어 것입니다.

개인적으로 Firebase 콘솔에 프로젝트로 my-app 및 my-app-dev가 있습니다.


1
Firebase 도구는 호스팅 된 파일 및 데이터베이스를 배포하는 데 유용하지만 데이터베이스, 분석 또는 원격 구성과 관련이있는 것은 아닙니다. 아니면 뭔가 빠졌습니까?
racs

@racs 이것이 최근 인 것 같지만, dev 인스턴스에서 데이터 시드 / 데이터 유지 관리를 위해 cli를 사용하려고합니다 : firebase.googleblog.com/2015/11/…
Chris

@ chris 감사합니다, 그것은 적어도 시작입니다. 그러나 그것은 다소 신비한 일처럼 보입니다. 행운을 빕니다!
racs

시드 데이터 및 개발 흐름이 진행되는 한 @racs는 실제로 잘 작동합니다. 버전이 지정된 npm run 명령 및 버전이 지정된 seed 데이터를 기반으로 dev 데이터베이스를 안정적으로 변경할 수 있습니다. 메타 데이터를 복사하는 방법을 찾고 있었지만 불행히도 그것을 보지 못했습니다.
Chris

@Chris 우리에게 알려 주셔서 감사합니다. 이것은 내가 알 수있는 한 여전히 열린 질문입니다.
racs

25

현재 Firebase를 사용하고 있지 않지만 본인처럼 생각하고 있습니다. 콘솔에서 완전히 별도의 프로젝트를 만드는 방법이 있습니다. 이전 Firebase 사이트에 이것을 추천하는 블로그 게시물이 있었지만 지금은 제거 될 것으로 보입니다. https://web.archive.org/web/20160310115701/https://www.firebase.com/blog/2015-10-29-managing-development-environments.html

또한이 토론은 다음을 권장합니다 : https://groups.google.com/forum/#!msg/firebase-talk/L7ajIJoHPcA/7dsNUTDlyRYJ


2
답변 해주셔서 감사합니다. 두 개의 별도 프로젝트가있는 것이 유일한 옵션 일 가능성이 높습니다. 그러나 그들 사이에 데이터를 복사하는 것은 기껏해야 복잡합니다. Firebase 도구가 규칙, 대상 설정 등을 복사 할 수 있는지 궁금합니다. github.com/firebase/firebase-tools
racs

2
확실하지가 본 적이 있지만, 당신은 중포 기지 서버에 대한 dev에 실행할 수있는 경우 : firebase.googleblog.com/2015/04/...
krico

2
그것이 내가 한 일이지만, 문제는 두 환경 사이에서 설정을 어떻게 복사 할 수 있습니까? 예 : 원격 구성, 대상 설정 등? 프로덕션 환경에 수동으로 추가하면 오류가 발생하기 쉽습니다.
racs

2
내가 겪었던 문제는 동일한 패키지 및 서명을 가진 여러 firebase 인스턴스를 사용한 인증입니다. 콘솔에서는 동일한 패키지 sha1을 둘 이상의 프로젝트에 추가 할 수 없으므로 불가능할 수도 있습니다. 문서는 clientid를 허용 목록에 추가하여 해결 방법이 있다고 말했지만 성공하지 못했습니다. 다른 해결 방법은 별도의 패키지 이름 (보다 정확하게 'applicationIds')이지만 다른 합병증이 있습니다.
Patrick


8

내가 한 방식 :

  1. 나는 firebase에 대해 2 개의 프로젝트를 가졌다. 하나는 DEV를위한 것이고 다른 하나는 PROD를위한 것이었다.
  2. 로컬로 내 앱에는 두 개의 분기가 있습니다. 하나는 DEV이고 다른 하나는 PROD입니다.
  3. 내 DEV 지점에는 항상 DEV firebase 프로젝트의 JSON 파일이 있으며 PROD에 대해서도 마찬가지입니다.

이 방법으로 JSON을 유지 관리 할 필요가 없습니다.


1
이해하지만 최신 Firebase 버전에 따라 일반적인 질문에 대한 해결책은 없습니다. 당신은 현재의 옵션을 가지고 놀아야하고 최고의 실천을 이끌어 내야합니다. 내 대답이 이것을 가리 키지 않았을 수도 있지만, 단지 내 관점으로 asker를 돕고 싶습니다.
Kunal Khaire

5

이 블로그 포스트 는 디버그 및 릴리스 빌드 유형의 매우 간단한 접근 방식을 설명합니다.

간단히 말해서 :

  • 다른 애플리케이션 ID 접미사를 사용하여 각 빌드 유형마다 Firebase에서 새 앱을 만듭니다.
  • 최신 JSON 파일로 Android 프로젝트를 구성하십시오.
  • applicationIdSuffix를 사용하여 빌드 유형에 따라 다른 애플리케이션 on Firebase와 일치하도록 애플리케이션 ID를 변경하십시오.

=> 자세한 설명은 블로그 포스트를 참조하십시오.

다른 빌드 풍미를 사용 하려면 공식 firebase 블로그 에서이 광범위한 블로그 포스트 를 읽으십시오 . 유용한 정보가 많이 포함되어 있습니다.

희망이 도움이됩니다!


답장을 보내 주셔서 감사합니다. 다른 앱을 설정할 수 있었지만 여전히 질문에 따라 FB dev 앱에서 FB prod 앱으로 다양한 설정을 복사하는 방법을 찾고 있습니다. (예 : 원격 구성 또는 대상 설정)
racs

2
이 같은 프로젝트 내부에 두 개의 애플 리케이션 그러므로 당신이 그런 분석으로 일부 서비스를 분리하지만 너무 공유 할 데이터베이스가 여기에 설명 된대로 환경의 실제 분리되지 만들고 있습니다 firebase.googleblog.com/2016/08/...
AntPachon

5

다른 빌드 유형을 관리해야합니다

이것을 따르십시오

  1. 먼저 Firebase 콘솔에서 아이디를 YOURAPPNAME-DEV로 새 프로젝트를 만듭니다.

  2. "Android 앱 추가"버튼을 클릭하고 새 앱을 만듭니다. 예를 들어 com.yourapp.debug로 이름을 지정하십시오. 새로운 google-services.json 파일이 자동으로 다운로드됩니다

  3. 프로젝트 src 디렉토리에서 이름이 "debug"인 새 디렉토리를 작성하고 여기에 새 google-services.json 파일을 복사하십시오.

  4. 모듈 레벨 build.gradle에서 이것을 추가하십시오

    debug {
            applicationIdSuffix ".debug"
        }
    

이제 디버그 빌드를 빌드 할 때 "debug"폴더에서 google-services.json이 사용되며 릴리스 모드에서 빌드 할 때 모듈 루트 디렉토리에서 google-services.json이 고려됩니다.


누구나 공식 문서가 필요한 경우 Google 서비스 Gradle 플러그인은 다음에 src설명 된대로 buildType 에 대한 하위 디렉토리에서 google-services.json을 찾는 것으로 알고 있습니다. developers.google.com/android/guides/…
Michael Osofsky

4

내 상황 에서이 문제를 해결하기 위해 각각 동일한 Android 프로젝트 (예 : 다른 사람들 applicationIdapplicationIdSuffix제안을 사용하지 않은 프로젝트)로 3 개의 Firebase 프로젝트를 만들었습니다 . 결과적으로 3 개의 google-services.json 파일이 CI (Continuous Integration) 서버에 사용자 정의 환경 변수로 저장되었습니다 . 빌드의 각 단계 (dev / staging / prod)에 대해 해당 google-services.json 파일을 사용했습니다.

dev와 관련된 Firebase 프로젝트의 경우 Android 프로젝트에서 디버그 SHA 인증서 지문을 추가했습니다. 그러나 준비 및 자극을 위해 CI에 APK에 서명했습니다.

다음은 .gitlab-ci.yml이 설정에서 작동 하는 제거 된 것 입니다.

# This is a Gitlab Continuous Integration (CI) Pipeline definition
# Environment variables:
#   - variables prefixed CI_ are Gitlab predefined environment variables (https://docs.gitlab.com/ee/ci/variables/predefined_variables.html)
#   - variables prefixed GNDR_CI are Gitlab custom environment variables (https://docs.gitlab.com/ee/ci/variables/#creating-a-custom-environment-variable)
#
# We have three Firebase projects (dev, staging, prod) where the same package name is used across all of them but the
# debug signing certificate is only provided for the dev one (later if there are other developers, they can have their
# own Firebase project that's equivalent to the dev one).  The staging and prod Firebase projects use real certificate
# signing so we don't need to enter a Debug signing certificate for them.  We don't check the google-services.json into
# the repository.  Instead it's provided at build time either on the developer's machine or by the Gitlab CI server
# which injects it via custom environment variables.  That way the google-services.json can reside in the default
# location, the projects's app directory.  The .gitlab-ci.yml is configured to copy the dev, staging, and prod equivalents
# of the google-servies.json file into that default location.
#
# References:
# https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html
# /programming/57129588/how-to-setup-firebase-for-multi-stage-release

stages:
  - stg_build_dev
  - stg_build_staging
  - stg_build_prod

jb_build_dev:
  stage: stg_build_dev
  image: jangrewe/gitlab-ci-android
  cache:
    key: ${CI_PROJECT_ID}-android
    paths:
      - .gradle/
  script:
    - cp ${GNDR_CI_GOOGLE_SERVICES_JSON_DEV_FILE} app/google-services.json
    - ./gradlew :app:assembleDebug
  artifacts:
    paths:
      - app/build/outputs/apk/

jb_build_staging:
  stage: stg_build_staging
  image: jangrewe/gitlab-ci-android
  cache:
    key: ${CI_PROJECT_ID}-android
    paths:
      - .gradle/
  dependencies: []
  script:
    - cp ${GNDR_CI_GOOGLE_SERVICES_JSON_STAGING_FILE} app/google-services.json
    - ./gradlew :app:assembleDebug
  artifacts:
    paths:
      - app/build/outputs/apk/

jb_build_prod:
  stage: stg_build_prod
  image: jangrewe/gitlab-ci-android
  cache:
    key: ${CI_PROJECT_ID}-android
    paths:
      - .gradle/
  dependencies: []
  script:
    - cp ${GNDR_CI_GOOGLE_SERVICES_JSON_PROD_FILE} app/google-services.json

    # GNDR_CI_KEYSTORE_FILE_BASE64_ENCODED created on Mac via:
    # base64 --input ~/Desktop/gendr.keystore --output ~/Desktop/keystore_base64_encoded.txt
    # Then the contents of keystore_base64_encoded.txt were copied and pasted as a Gitlab custom environment variable
    # For more info see http://android.jlelse.eu/android-gitlab-ci-cd-sign-deploy-3ad66a8f24bf
    - cat ${GNDR_CI_KEYSTORE_FILE_BASE64_ENCODED} | base64 --decode > gendr.keystore

    - ./gradlew :app:assembleRelease
      -Pandroid.injected.signing.store.file=$(pwd)/gendr.keystore
      -Pandroid.injected.signing.store.password=${GNDR_CI_KEYSTORE_PASSWORD}
      -Pandroid.injected.signing.key.alias=${GNDR_CI_KEY_ALIAS}
      -Pandroid.injected.signing.key.password=${GNDR_CI_KEY_PASSWORD}
  artifacts:
    paths:
      - app/build/outputs/apk/

이 솔루션은 너무 불투명하고 유지 관리하기 어려운 build.gradle 트릭에 의존하지 않기 때문에이 솔루션에 만족합니다. 예를 들어, applicationIdSuffixbuildTypes를 사용하여 접근 방식을 시도했을 때을 사용하여 빌드 유형을 전환하려고 할 때 계측 테스트를 실행하거나 컴파일 할 수 없다는 것을 알았습니다 testBuildType. 안드로이드는 debug buildType내가 이해할 수없는 특별한 속성을주는 것처럼 보였다 .

사실, CI 스크립은 내 경험상 상당히 투명하고 유지 관리가 쉽습니다. 실제로 내가 설명한 접근 방식은 CI에서 생성 한 각 APK를 에뮬레이터에서 실행했을 때 Firebase 콘솔의 '앱을 실행하여 설치 확인'단계에서 시작한 것입니다.

앱이 서버와 통신했는지 확인 앱을 제거했다가 다시 설치해야 할 수도 있습니다.

에:

축하합니다. 앱에 Firebase를 성공적으로 추가했습니다.

에뮬레이터에서 하나씩 시작하면서 세 가지 앱 모두에 대해


이 모든 자세한 설명에 감사드립니다, 마이클 별도의 플레이버를 추가하고 각 플레이버의 폴더 아래에 적절한 google-services.json을 복사하여 동일한 결과를 관리했습니다. 그러나 이것은 내 질문이 아니므로 다시 읽으십시오.
racs

나는 @racs 동의하지만, 내가 쓴 때 불행하게도 stackoverflow.com/questions/37450439/...를 , 그것은하여 질문의 중복으로 표시되었다 stackoverflow.com/users/807126/doug-stevenson
마이클 Osofsky

1
더그 ... 무슨 짓을 한거야! : DI 귀하의 답변을 여기에 신경 쓰지 마십시오. 별도의 환경을위한 솔루션을 찾는 사람들에게 도움이 될 것이라고 확신합니다.
racs

예, 우리는 firebase 서비스가있는 별도의 환경이 필요한 모바일 애플리케이션을위한 솔루션을 찾고있었습니다. 이것은 확실히 우리에게 좋은 출발점입니다. 우리는 그것을 시도 할 것입니다.
LT

2

Firebase에는 개발자 및 제품을 설정하는 방법을 다루는 페이지가 있습니다.

https://firebase.google.com/docs/functions/config-env

프로젝트의 환경 구성 설정 환경 데이터를 저장하기 위해 Firebase CLI에서 firebase functions : config : set 명령을 사용할 수 있습니다. 각 키는 마침표를 사용하여 네임 스페이스를 지정하여 관련 구성을 그룹화 할 수 있습니다. 키에는 소문자 만 사용할 수 있습니다. 대문자는 허용되지 않습니다.

예를 들어 "일부 서비스"에 대한 클라이언트 ID 및 API 키를 저장하려면 다음을 실행하십시오.

firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"

현재 환경 구성 검색 프로젝트의 환경 구성에 현재 저장된 내용을 검사하기 위해 firebase 함수 : config : get을 사용할 수 있습니다. 다음과 같이 JSON을 출력합니다.

{
  "someservice": {
    "key":"THE API KEY",
    "id":"THE CLIENT ID"
  }
}

1
404로 해결됩니다. 다음에 내용도 포함하십시오!
CorayThan

1

방금 찾은 정보를 기반 으로이 답변을 업데이트하고 있습니다.

1 단계

firebase.google.com에서 여러 환경을 만듭니다 (예 : dev, staging, prod).


mysite-dev

내 사이트 준비

내 사이트 제품


2 단계

ㅏ. 당신이 당신의 기본값이되고 싶은 직접으로 이동하십시오 (즉, dev)

비. 운영firebase deploy

씨. 배포되면 실행firebase use --add

디. 현재 가지고있는 다른 프로젝트 중에서 선택할 수있는 옵션이 나타납니다.

추가하려는 프로젝트 ( mysite-staging)로 스크롤하여 선택하십시오.

이자형. 그런 다음 해당 프로젝트의 별명을 묻는 메시지가 표시됩니다. 준비를 입력 합니다.

prod 및 dev에 대해 항목 ae를 다시 실행하여 각 환경에 별명이 있습니다.


어떤 환경에 있는지 알고

운영 firebase use default (mysite-dev)

* dev (mysite-dev)

staging (mysite-staging)

prod (mysite-dev)

(환경 중 하나는 왼쪽에 별표가 있습니다. 현재있는 환경입니다. 파란색으로 강조 표시됩니다)


환경 간 전환

실행 firebase use staging하거나 firebase use prod그들 사이를 이동합니다.

원하는 환경에 도달하면 실행하면 firebase deploy프로젝트가 배포됩니다.

몇 가지 유용한 링크가 있습니다 ...

CLI 참조

여러 환경에 배포

도움이 되었기를 바랍니다.


여러 환경을 말할 때 여러 프로젝트를 의미합니까?
walidvb

여러 환경을 의미합니다. 설명을 보려면 여기 에서 게시물을 읽으십시오 . 그것이 제목입니다. 동일한 프로젝트와 관련이 있지만 dev / qa 및 프로덕션과 관련이 있습니다.
Jared Newnam

0

우리가하는 방법은 환경에 따라 다른 json 키 파일을 만드는 것입니다. Google에서 권장하는 서비스 계정 기능을 사용했으며 하나의 개발 파일과 다른 하나의 프로덕션 파일이 있습니다

여기에 이미지 설명을 입력하십시오


0

Firebase에서 Dev 및 프로덕션 환경으로 Tow 프로젝트를 작성하십시오.

https://firebase.google.com/docs/android/setup 또는 Crashlytics의 경우 https://firebase.google.com/docs/crashlytics/get-started?platform=android에 따라 SDK를 설정 하십시오.

먼저 각 buildType에 대해 각각의 google_services.json을 다음 위치에 배치하십시오.

app/src/debug/google_services.json
app/src/test/google_services.json
app/google_services.json

참고 : 루트 app / google_services.json이 파일은 빌드 변형에 따라 루트 json 파일의 json 코드를 복사해야합니다.

이제 적절한 google_services.json을 app / google_services.json으로 이동하는 자동화를위한 앱의 build.gradle에서 몇 가지 gradle 작업을 수행하십시오.

이것을 app / Gradle 파일에 복사하십시오

task switchToDebug(type: Copy) {
description = 'Switches to DEBUG google-services.json'
from "src/debug"
include "google-services.json"
into "."
}

task switchToRelease(type: Copy) {
description = 'Switches to RELEASE google-services.json'
from "src/release"
include "google-services.json"
into "."
}

훌륭하지만 앱을 빌드하기 전에 이러한 작업을 수동으로 실행해야하는 것은 번거 롭습니다. assembleDebug 또는 : assembleRelease가 실행되기 전에 언젠가 위의 적절한 복사 작업을 실행하고 싶습니다. : assembleRelease가 실행될 때 어떤 일이 발생하는지 보자 : 이것을 / gradlew 파일에 복사

Zaks-MBP:my_awesome_application zak$ ./gradlew assembleRelease
Parallel execution is an incubating feature.
.... (other tasks)
:app:processReleaseGoogleServices
....
:app:assembleRelease

: app : processReleaseGoogleServices 작업을 확인하십시오. 이 작업은 루트 google_services.json 파일을 처리합니다. 올바른 google_services.json을 처리하려면 즉시 복사 작업을 실행해야합니다. 이것을 build.gradle에 추가하십시오. afterEvaluate 엔 클로징에 유의하십시오.

이것을 app / Gradle 파일에 복사하십시오

afterEvaluate {
processDebugGoogleServices.dependsOn switchToDebug
processReleaseGoogleServices.dependsOn switchToRelease
}

이제 : app : processReleaseGoogleServices가 호출되면 새로 정의 된 : app : switchToRelease가 미리 호출됩니다. 디버그 buildType에 대해 동일한 논리입니다. : app : assembleRelease를 실행하면 출시 버전 google_services.json이 자동으로 앱 모듈의 루트 폴더에 복사됩니다.


1
이 답변에 많은 에너지를 넣었지만 1. 질문과 관련이 없습니다 (다시 읽으십시오). 2. google-services.json파일을 루트 폴더 에 복사 할 필요가 없습니다 . 완벽하게 좋은 맛 폴더. 대신 작업을 assembleRelease호출 할 수 있습니다 assembleTestRelease.
racs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.