çŸåšã firebase functions:config:get
ã䜿çšããŠé¢æ°å
šäœã®æ§æãJSONãã¡ã€ã«ãšããŠååŸããããšã¯å¯èœã§ããã firebase functions:config:set
ã³ãã³ãã䜿çšããå Žåã¯ãåå€æ°ãæåã§ã€ã³ã©ã€ã³åããå¿
èŠããããŸããããŸããŸãªç°å¢ã
çæ³çã«ã¯ã次ã®ããšãã§ããã¯ãã§ãã
firebase functions:config:get > config.json
firebase functions:config:set -f config.json
@jpreynatã«åæããŸããæ§æå€æ°ãèšå®ããã®ãå¿ããæ¥ãconfigïŒsetãã«ã¹ã¿ã ãããã€ã¹ã¯ãªããã«é¢é£ä»ãããšãè¿œå ãããæ©èœã確èªã§ããŸãã
çŸåšãèšå®ã«é
管ãããªã©ã®åé¿çã¯ãããŸããïŒ
ãããžã§ã¯ãéã§æ§æãè€è£œããããšããŠããããã§ãã firebase functions:config:clone
ã¯ããªãã®ããã«åããŸããïŒ
ã³ã³ããã¹ããäžããããã«ããã¡ã€ã«ããŒã¹ã®æ§æããæå³çã«é¢ããŸãããããã¯ãæªãç¿æ £ãå©é·ãããšèããŠããããã§ãïŒã€ãŸãããã¡ã€ã«ãã³ãŒããšãšãã«ä¿åãããç§å¯ã§ãã£ã±ãã«ä¿ã¡ãå Žåã«ãã£ãŠã¯ãœãŒã¹ãªããžããªã«ãã§ãã¯ã€ã³ããããšãããããŸãïŒã
ãå¿ é ãã®æ§æå€æ°ã宣èšããããã®äœããã®æ¹æ³ïŒååŠæªå®ïŒã«ã€ããŠã©ãæããŸããïŒçŸåšã®ãããžã§ã¯ãã§å¿ èŠãªæ§æãªãã§ãããã€ããããšãããšãäœããå€æŽãããåã«ãšã©ãŒãçºçããŸãã ããã¯ããªãã®äž»ãªæžå¿µã解決ããŸããïŒ ããã§ãªãå Žåããªããã¡ã€ã«ãç¹ã«åœ¹ç«ã€ã®ã§ããïŒ
@mbleighããã¯ãŸãã«ç§ãæãã§ããããšãç§ãç¥ããªãã£ããã®ã§ãã è¯ãã¢ã€ãã¢ïŒ
ãããããMechanicsTBDãã«ãã£ãŠäžãããã/æå³ããããšã§ãããä»ã®ãã¹ãŠã®ããã«git / PRã¬ãã¥ãŒããã»ã¹ãééããããã«ããªã¢ãŒãã§ã¯ãªããããžã§ã¯ãå
ã®ããã€ãã®ãã¡ã€ã«ã§ããŒ/æ§ææ§é ãå®çŸ©ããŸãã
@jpreynatãã€ãžã£ãã¯ã®åé¡ã§ããããªãã
@laurenzlongã¢ããã€ã¹ãããããšãããããŸãããæ§æãè€è£œããããšã¯ããŠããŸããã
ç§ãã¡ã®äž»ãªé¢å¿äºã¯ãå±é段éã«å¿ããŠããŸããŸãªãããžã§ã¯ãæ§æãæŽæ°ããããšã§ãã
ã€ãŸããåºæ¬çã«ãç°å¢ïŒdevãstagingãprodïŒããšã«æ§æãã¡ã€ã«ããããFirebaseæ§æãããããèšå®ããŸãïŒPRã®å Žåã¯ããã¹ã¿ãŒãšã¿ã°ãããã·ã¥ããŸãïŒã
@mbleighæ
å ±ãããããšãã
ãã ããæ§æãã¡ã€ã«ã䜿çšãã以å€ã®æ¹æ³ã§ããããã¹ãŠã®ç°å¢ãä¿åããæ¹æ³ã¯æ£ç¢ºã«ã¯ããããŸããã
çŸåšãèªã¿ãããããããã«JSONãšããŠãã©ãŒããããããŠããŸãããããŒãšå€ã®ãã¢ãšããŠãã©ãŒãããããŠã functions:config:set
ã³ãã³ãã«çŽæ¥æž¡ãããšãæ€èšããŠããŸãã
ããã¯JSONãã¡ã€ã«ãæž¡ãããšã»ã©å®å
šã§ã¯ãªãããšã«åæããŸãã
ãã¡ã€ã«ã䜿çšãã以å€ã®ããŸããŸãªæ®µéã§ç°å¢å€æ°ãä¿åããæ¹æ³ã«ã€ããŠãäœãæšå¥šäºé
ã¯ãããŸããïŒ
@ahavertyå¿é ãããŸãããããã§è°è«ã§ããããšãããããæããŸãã
@jpreynat functions:config:set
ãå®è¡ãããšãçŸåšã®ãããžã§ã¯ãã«ä¿åãããŸãã firebase use
ã䜿çšããŠãããžã§ã¯ããåãæ¿ããå Žåãæ§æã¯æ°žç¶çã§ãã ãããã£ãŠããããžã§ã¯ãããšã«1åset
ãå®è¡ãããšãåžžã«ããã«è¡šç€ºãããŸãã ããã§ãç°å¢ããšã«ç°ãªãæ§æãã®åé¡ã解決ããã¯ããªã®ã§ãæ¬åœã®åé¡ãç解ããŠããªãã®ã§ã¯ãªãã§ããããã
@jpreynatãšãããããã®å·ãéããŸããããã€ã±ã«ãšç§ãããªãã®ãªã¯ãšã¹ãã誀解ããå Žåã¯ã
@ laurenzlong @ mbleighãã®ã¹ã¬ããã§ããã«åçã§ããªãã£ãããšã
ä»ã®ãšããããã®åé¡ã®åé¿çãèŠã€ããŸããããç§ã®èŠæ±ãæ確ã«ããããã®ã³ã³ããã¹ãã次ã«ç€ºããŸãã
Travisã䜿çšããŠã¢ããªããããã€ããŠããŸãïŒããã¯ãã©ã®CIã§ããããŒã«ã«ã§ãåªããŠããããšã«æ³šæããŠãã ããïŒã ãã©ã³ããšã¿ã°ã«å¿ããŠã¢ããªãããŸããŸãªã¹ããŒãžã«ãããã€ãããããç°å¢ã«åºã¥ããŠããŸããŸãªJSONãã¡ã€ã«ã䜿çšã§ãããšäŸ¿å©ã§ãã
ããšãã°ãããã«ããããã®æ¡ä»¶ã«å¿ããŠfirebase config:set -f staging.json
ãŸãã¯firebase config:set -f prod.json
ãããããå®è¡ã§ããŸãã
åé¿çã¯ããŒãã¢ãžã¥ãŒã«ãšããŠfirebase
ã䜿çšããããš
ãã@jpreynatç§ã¯ãŸã ããªãã®çãã«å°ãæ··ä¹±ããŠããŸãã èšå®ãäžåºŠèšå®ãããšãfirebase FunctionsïŒconfig ïŒunsetãå®è¡ããŠèšå®å€ãæ瀺çã«èšå®è§£é€ããªãéãããããã€éã§ãåžžã«èšå®ãç¶æãããŸãã ãããã£ãŠãCIããã»ã¹ã®äžéšãšããŠãããè¡ãå¿ èŠã¯ãããŸããã
誰ãããããåéã§ããŸããïŒ ïŒ
ïŒ @ jpreynat @ mbleighããã¯æ¬åœã«æ¬ ããŠãããã®ã®1ã€ã§ãã Atmç§ã¯15è¿ãã®æ§æå€æ°ïŒãããŠãã£ãšæ¥ãïŒãæã£ãŠããŸãããããŠããã¯functions:config:set
ãäœããã®æ¹æ³ã§JSONãåãå
¥ããããšãã§ããã°éåžžã«äŸ¿å©ã§ãã
ããå¿
é ãã®æ§æå€æ°ã宣èšãã-ãããŠãçŸåšã®ãããžã§ã¯ãã§å¿
èŠãªæ§æãªãã§ãããã€ããããšãããšãäœããå€æŽãããåã«ãšã©ãŒãçºçããããšãã@mbleighã®ææ¡ã«è³æ祚ãæããŸããã
ç§ãã¡ã«ãšã£ãŠãåé¡ç¹ã«ãªããŸãããããã¯ç§ãã¡ã®ãã¹ãŠã®åé¡ã解決ããããŒãžã§ã³ç®¡ç/ã¬ãã¥ãŒããã»ã¹ã«ããŸãé©åããŸãð
https://medium.com/@AllanHasegawa/setting -config-for-firebase-cloud-functions-with-json-136f455e7c69
ã¡ãã£ãš@yaronyosefFirebaseã®functionsïŒconfig ïŒsetã³ãã³ãã«JSONãçŽæ¥æäŸã§ããŸãããã©ãããã©ãŒã ã«é©ããæ¹æ³ã§ãã©ãŒãããããå¿ èŠãããã ãã§ãã Linuxã®å Žåã以äžãæ©èœããã¯ãã§ãã
firebase functions:config:set foo='{"bar":"something","faz":"other"}'
å
±æããŠããã ãããããšãããããŸãïŒ @laurenzlong
ãã¡ã€ã«ããã€ã³ããŒããããã£ãã®ã§ããã®ãããªã³ãã³ãã䜿çšããŸããã
firebase functions:config:set service_account="$(cat service-account.json)"
Firebase Admin SDKã®ãŠãŒã¶ãŒç®¡çAPIã䜿çšãããã£ãã®ã§ããµãŒãã¹ã¢ã«ãŠã³ãã®jsonãã¡ã€ã«ãFirebase CloudFunctionsã«ã€ã³ããŒãããŸããã
ã¯ãŒã«ãªãŠãŒã¹ã±ãŒã¹ïŒ å ±æããŠãããŠããããšãïŒ
ãŸããGitãä»ããŠéã·ãŒã¯ã¬ããæ§æã远跡ããããšããå§ãããŸãããã®å Žåãã³ããããããJSONã©ã³ã¿ã€ã æ§æãã¡ã€ã«ïŒè€æ°ã®ç°å¢çšïŒãä¿¡é Œã§ããCIç°å¢ã¯ç¹å®ã®ç°å¢ã«å¯Ÿå¿ãããã¡ã€ã«ããfunctions:config:set
ãé©çšããŸãïŒããã³åç°å¢ã¯åå¥ã®Firebaseãããžã§ã¯ãã«å¯Ÿå¿ããŠããŸãïŒã
æ§æãgitã«ä¿æããŠããå Žåãããããé¢æ°ã©ã³ã¿ã€ã ã«èªã¿èŸŒãã®ã¯ç°¡åã§ãã ããããconfigs/<project_id>.json
眮ãã ãã§ã次ã®ããã«ãªããŸãã
let config = {};
try {
config = require(`./configs/${process.env.GCLOUD_PROJECT}.json`);
} catch (e) {
console.log('No config found for project', process.env.GCLOUD_PROJECT);
}
Firebaseã§äœ¿çšãããã©ã³ã¿ã€ã èšå®ã¯ãèšå®ãgitã«ãã§ãã¯ã€ã³ãããªãããã«ç¹å¥ã«èšèšãããŠããŸããããã¯ãïŒç¹ã«ã·ãŒã¯ã¬ããã®å ŽåïŒè§£æ±ºãããããå€ãã®åé¡ãåŒãèµ·ãããã¿ãŒã³ã§ããããšãããã£ãããã§ãã
ããã¯æ¬åœã§ããããã®å Žåããã®ç®çã®ããã«ConfigAPIããŸã£ãã䜿çšããªããªããŸãã æ©å¯æ§ã®é«ãå€ãä¿åããããã«ConfigAPIãå®è¡ãïŒFirebaseããã¥ã¡ã³ãã«åºã¥ããšãé©åãªãŠãŒã¹ã±ãŒã¹ã®ããã§ãïŒããœãŒã¹å¶åŸ¡å€ãšè¿œè·¡ãããŠããªãå€ã®äž¡æ¹ããŸã£ããåãæ¹æ³ã§ïŒã€ãŸãã config()
ä»ããŠïŒããŒãããããšãæçãªå ŽåããããŸãfirebase-functions
ã«ãã£ãŠæäŸãããŸãïŒã
ãšããããã次ã®ã¯ã³ã©ã€ããŒã䜿çšããŠã .runtimeconfig
å
šäœãfunctions:config:set
ã«ãã£ãŒãããŸãã
firebase functions:config:set $(jq -r 'to_entries[] | [.key, (.value | tojson)] | join("=")' < .runtimeconfig/${FIREBASE_ENV}.json)
ããã§ã FIREBASE_ENV
ã¯ããããã€ã¡ã³ãã§äœ¿çšãããç°å¢ã®ååã§ãïŒäŸïŒ dev
ïŒã ãããããã«ççž®ã§ãããšäŸ¿å©ã§ãã
firebase functions:config:set -f .runtimeconfig/${FIREBASE_ENV}.json
ãã ããæçµçã«ã¯ãConfig APIã§ãã¹ãŠã®å€æŽã®äœ¿ããããç£æ»èšŒè·¡ãæå¹ã«ãªã£ãŠããå Žåã¯ãããã¯å¿ èŠãªãå ŽåããããŸãïŒãã§ã«åœãŠã¯ãŸãå Žåã¯ãä¿®æ£ããŠãã ããã調æ»ããããšæããŸãïŒã
ã§ã¯ãããã¯ã©ã®ããã«èµ·ãã£ãŠããã®ã§ããããïŒ ð
@mbleighã®ææ¡ããŸã å®è£ ãããŠããã®ãèŠããã§ãïŒ éçºè 以å€ã®ã¿ãŒã²ããã«èšå®ãèšå®ããã®ãå¿ãããšããåé¡ãåžžã«çºçããŠããŸã
ã¹ã¬ãããã³ããããããšãã ãŸã å ±åããããšã¯ãããŸããããèšç»äŒè°ã§ãããå床åãäžããŠãé²å±ãèŠããããã©ããã確èªããŸãã
JSONã¹ããŒããã¡ã€ã«ã䜿çšããŠæ§æãæ€èšŒããæåŸ ãããã¹ãŠã®å€ãå«ãŸããŠããããšã確èªããŸãã ãã®æ€èšŒã¯ç§ã®CIãã€ãã©ã€ã³ã®äžéšã§ããã倱æããå Žåã®å±éãé²ããŸãã ç§ã®ããã«TypeScriptã䜿çšããŠé¢æ°ãäœæããå Žåã¯ãåããJSONã¹ããŒããçæã§ããŸãã
é¢æ°configã¯æååã®ã¿ãåãå
¥ãããšããå¶éããããããã¹ããŒãã¯configå€ãæ°å€ã§ããããšãæ€èšŒã§ããŸããã ããŒã«å€ã®å Žåãæå¹ãªå€ãšããŠ"true"
ãš"false"
ã®ã¿ã®åæåã䜿çšã§ãããããåé¡ãããŸããã
ç§ã®CircleCIèšå®ãšãã®ããã°æçš¿ãåç §ããŠãã ããã
@hgwoodå ±æããŠãããŠããããšãïŒ ããã¯ééããªãCIã«ãè¿œå ããŸãã
ãã®ãåé¡ãã«å¯Ÿããç§ã®è§£æ±ºçãšãè°è«ã«ã€ããŠã®ç§ã®èããæ®ãããã£ãã ãã§ãã
ã«ã¹ã±ãŒãyamlæ§æãã¡ã€ã«ã䜿çšããŸããããã¯ãããã©ã«ãå€ãšããããã€ã¡ã³ãç°å¢ã«é¢ä¿ãªããã¹ãŠã®æ§æã«é©çšãããå€ã«åœ¹ç«ã¡ãŸãã
./config/default.yml
app:
name: My App
featureFlags:
someFeature:
enabled: false
./config/dev.yml ïŒä»ã®ãããã€ã¡ã³ãç°å¢çšã®åæ§ã®æ§æãã¡ã€ã«ïŒ
imports:
- {resource: default.yml}
app:
environmentName: Development
services:
someOtherService:
baseUrl: https://dev.someotherservice.com/api
featureFlags:
someFeature:
enabled: true
次ã«ã解決ãããæ§æãããŒãããkey = valãã¢ã®ã¹ããŒã¹åºåãã®ãªã¹ããè¿ãå°ããªããŒãã¹ã¯ãªãããäœæããŸãã
yaml_to_keyval.ts
import * as configYaml from "config-yaml"
import * as flat from "flat"
const yamlFile = process.argv[2]
const config = configYaml(yamlFile)
const flatConfig = flat(config)
const key_val_list = Object.keys(flatConfig).map(function(key){
return `${key}=${flatConfig[key]}`
})
console.log(key_val_list.join(' '))
CIã®ãããã€äžã«ããã®bashã·ã§ã«ã¹ã¯ãªããã䜿çšããŠkey = valãã¢ãååŸãã functionsïŒconfig ïŒsetã§èšå®ã
# env is set to the desired deployment environment (eg "dev"), which is passed as an argument to the CI script command
config_in="$(readlink -f ./config/$env.yml)"
key_vals="$(ts-node ./scripts/node/yaml_to_keyval.ts $config_in)"
firebase functions:config:set $key_vals
@kanemotos cat
ãœãªã¥ãŒã·ã§ã³ã奜ãã§ããã蚌ææžãã¡ã€ã«ãã¢ããããŒãããããšãããšãã«Precondition check failed
ãšã©ãŒãçºçããŸããã§ãããïŒ
ãããã®çç±ã«ãããDeploymentManagerã䜿çšããããšã«ãªããŸããã
DMã®ãconfigYamlãã䜿çšããŠãã¹ãŠã®æ§æãèšå®ããŸãã 次ã«ãDMã¯é©åãªã©ã³ã¿ã€ã æ§æãšå€æ°ãäœæãã firebase deploy
ã¯ã firebase config:set
ããŸã£ãã䜿çšããã«ããããã€æã«ãããã®å€ãååŸããŠèšå®ããŸãã ããã«ãããä»ã®ãªãœãŒã¹ïŒãã±ãããšãã®ã¢ã¯ã»ã¹å¶åŸ¡ãªã©ïŒãã»ããã¢ãããããã³ãã¬ãŒãã®å€éšã«æäŸããªããŠããRCã§ãããã®å€ãèšå®ããããšãã§ããŸãã ããã«ãããã«ããã camelCase
åãšå€æ°åã䜿çšã§ããŸãã
DMã¯å€ãå®å
šã«æå·åã§ããªããããå€éšã§å€ãèšå®ããã®ã¯ãã©ã³ã¿ã€ã æ§æãä»ããŠïŒæå·åãããïŒãµãŒãã¹ã¢ã«ãŠã³ãããŒãæž¡ãå¿
èŠãããå Žåã®ã¿ã§ãã ãã ããåè
ã¯KMSããã®stdoutãåãå
¥ããããã firebase config:set
ã§ã¯ãªãgcloud beta runtime-config configs variables set
ã䜿çšããŸãïŒDMå±éåŸããã³firebase deploy
ïŒã
è¿œå ãããã£ãã®ã§ããããããèªããšãæ··ä¹±ãæãéèŠãªãã€ã³ããèŠéããŠãã人ãããããã§ãã ãããããã¥ã¡ã³ããŒã·ã§ã³ã§ãæããã«ãããŠããã°ãããã¯æ¬åœã«åœ¹ã«ç«ã¡ãŸãã
åºæ¬çã«ã functions.config()
ã¯_deployments_ã®éã§åç¶ããŸãããç°ãªãFirebaseãããžã§ã¯ãéã§åå¥ã«èšå®ããããšãã§ããŸãã
ã€ãŸããéçºç°å¢ãã¹ããŒãžã³ã°ç°å¢ãæ¬çªç°å¢ã§ã¯ãïŒãã«ããµã€ããã¹ãã£ã³ã°ã䜿çšããããåããããžã§ã¯ãã«ãããã€ãããããã®ã§ã¯ãªãïŒè€æ°ã®åäžã®Firebaseãããžã§ã¯ããèšå®ããå¿ èŠããããŸãã ã
ãšã€ãªã¢ã¹ãèšå®ãããïŒãŸãã¯firebase use
ãããžã§ã¯ããåãæ¿ãããïŒãåããªããžããªãè€æ°ã®åå¥ã®Firebaseãããžã§ã¯ãã«ãããã€ã§ããŸãã ããã¯ãéçºç°å¢ãã¹ããŒãžã³ã°ãæ¬çªç°å¢ãåå¥ã®Firebaseãããžã§ã¯ããšããŠèšå®ããæ¹æ³ã§ãã
次ã«ã次ã®ããã«ãããããã«åå¥ã®ç°å¢æ§æãèšå®ã§ããŸãã
firebase -P dev config:set
-éçºç°å¢ã®å€æ°ãèšå®ããŸã
firebase -P prod config:set
-æ¬çªç°å¢ã®å€æ°ãèšå®ããŸã...
次ã«ã次ã®ããã«ãåããªããžããªã2åãããã€ã§ããŸãã
firebase deploy -P dev
firebase deploy -P prod
ãŸããäž¡æ¹ãšãããããã®Firebaseãããžã§ã¯ãã«ãããã€ããããããã€éã§ä¿æãããç¬èªã®åå¥ã®ç°å¢æ§æãå«ãŸããŸãã
ããããããåãã¡ã®ããæ¹ã§ãããã dev / test / prodçšã®åå¥ã®ãããžã§ã¯ãã
ã©ã®ãã©ãããã©ãŒã ïŒWindowsãMacOSãLinuxïŒã§éçºãããã«é¢ããŠæ©èœããç§ã®ããã©JSãœãªã¥ãŒã·ã§ã³ãå ±æããã ãã§ãïŒ
dev / test / prodã«å¥ã ã®ãããžã§ã¯ãã䜿çšããã
{
"projects": {
"dev": "my-project-name-dev",
"test": "my-project-name-test",
"prod": "my-project-name-prod"
}
}
/functions/config
ãã©ã«ããŒå
ã®JSONãã¡ã€ã«ïŒ
/functions/config/config.dev.json
/functions/config/config.test.json
/functions/config/config.prod.json
/functions/config/config.SAMPLE.json <-- only file tracked in git
Example content:
{
"google": {
"key": "my-api-key",
"storage_bucket": "firebase-storage-bucket"
},
"another_vendor": {
"my_prop": "my value"
},
...
}
const fs = require('fs');
const env = process.argv[2];
const configPath = `./config/config.${env}.json`;
if (!(configPath && fs.existsSync(configPath))) {
return;
}
const collectConfigLines = (o, propPath, configLines) => {
propPath = propPath || '';
configLines = configLines || [];
for (const key of Object.keys(o)) {
const newPropPath = propPath + key;
if (typeof o[key] === 'object') {
collectConfigLines(o[key], newPropPath + '.', configLines);
} else if (o[key] != null && o[key] !== '') {
configLines.push(`${newPropPath}=${JSON.stringify(o[key])}`);
}
}
}
const config = require(configPath);
const configLines = [];
collectConfigLines(config, '', configLines);
const cp = require('child_process');
cp.execSync(`firebase -P ${env} functions:config:set ${configLines.join(' ')}`);
...
"scripts": {
"config:set:dev": "node set-config dev",
"config:set:test": "node set-config test",
"config:set:prod": "node set-config prod",
...
},
...
誰ãããŸã æ¢ããŠãããªãããã®äžçšåºŠã®èšäºhttps://medium.com/indielayer/deploying-environment-variables-with-firebase-cloud-functions-680779413484ã§äœ¿çšãããŠããæ¹æ³ããã
ç§ãå人çã«æ¬ ããŠããã®ã¯ããããã€ãè¡ããã«æ§æå€æ°ãèšå®ããæ©èœã§ãã ããŸããŸãªç°å¢ã«ãããã€ããCICDãã€ãã©ã€ã³ããããéçºè ãã³ãŒããããŒã«ã«ã§ãã«ãããŠãç¹ã«æ¬çªç°å¢ã«ãããã€ããããšã¯æãŸãããããŸããã ãããç©äºãå£ããæ¹æ³ã§ãã
ãŸããããã€ãã®æ©èœãéçºãããŠããç¶æ ã§æ¢åã®å€æ°ãåŸã§å€æŽãããå Žåã¯ãçŸåšãæåŸã«ãªãªãŒã¹ãããã¿ã°ããã§ãã¯ã¢ãŠããããã«ããããããã€ããæ©èœãã©ã³ãã«ãã§ãã¯ã¢ãŠãããŠç¶è¡ããŸãã ããã¯æ¬åœã«ããã䜿çšäžå¯èœã«ããŸãã
åºæ¬çã«ãã¯ã©ãŠãæ©èœã®ãªã¢ãŒãæ§æãå¿ èŠã«ãªããŸã
@bezysoftware ïŒç°å¢æ§æã®ä»£ããã«ïŒç°å¢å€æ°ã䜿çšããå¿ èŠããããšæããŸããhttpsïŒ//cloud.google.com/functions/docs/env-ã確èªããŠãã ããã var
å ±æããŠããã ãããããšãããããŸãïŒ @laurenzlong
ãã¡ã€ã«ããã€ã³ããŒããããã£ãã®ã§ããã®ãããªã³ãã³ãã䜿çšããŸãããfirebase functions:config:set service_account="$(cat service-account.json)"
Firebase Admin SDKã®ãŠãŒã¶ãŒç®¡çAPIã䜿çšãããã£ãã®ã§ããµãŒãã¹ã¢ã«ãŠã³ãã®jsonãã¡ã€ã«ãFirebase CloudFunctionsã«ã€ã³ããŒãããŸããã
ããŸããããŸããã§ãã
@ Md-ã¢ããã¥ã«-ããªã -ã©ãã£
Firebase FunctionsïŒconfig ïŒset service_account = "$ïŒcat service-account.jsonïŒ"
ç§ã®ããã«åãããç§ã¯firebase functions:config:get
èšå®å€æ°ãèŠãããšãã§ããŸãã
ãããžã§ã¯ããã©ã«ãã«ãªããèšå®å€æ°ãèšå®ããFirebaseãããžã§ã¯ããéžæããªãã£ããããæåã¯æ©èœããŸããã§ãããFirebaseãããžã§ã¯ããéžæããã«ã¯ã firebase use --add
ã䜿çšããŸããCLIã§ããã³ããã衚瀺ãããŸãã Firebaseã³ã³ãœãŒã«äžã®ãããžã§ã¯ãã®ãªã¹ãïŒCLIã«firebase login
ãã°ã€ã³ããŠãããšä»®å®ïŒ
@dnhyde
Firebase FunctionsïŒconfig ïŒset service_account = "$ïŒcat service-account.jsonïŒ"
jsonãã¡ã€ã«ã§æåå以å€ã®ä»ã®å€ã¿ã€ãïŒããŒã«å€ãæ°å€ãªã©ïŒã䜿çšããŠããéã¯ãããã¯æ©èœããªãããã§ãã
{
"test": {
"hmm": true
}
}
倱æããïŒ
Error: HTTP Error: 400, Invalid value at 'variable.text' (TYPE_STRING), true
ç§ã«ã¯æ¬¡ã®ããšãã§ããã¯ãã ãšç§ã«ã¯åççã«æããŸãã
firebase functions:config:get > config.json
ãããŠåŸã§ïŒ
firebase functions:config:set < config.json
ãããã®2ã€ã®ã³ãã³ããè£å®ããããšã¯çã«ããªã£ãŠããŸãã
ãã¡ã€ã«ã«æ§æãå«ããããšã§ãããŒãžã§ã³ç®¡çãè¡ããæéã®çµéãšãšãã«ã©ã®ããã«å€åãããã確èªã§ããŸãã
æ®å¿µãªããããããä»ããéæããªããã°ãªããªãå¯äžã®æ¹æ³ïŒ env=$(cat config.json)
ïŒã§ããconfig.jsonãå®éã®å€ã«ããèœåãæãªãããŸããããã¯ã { env: ... }
ã©ããã§ããªãããã§ãã
ç§èªèº«ãžã®æ³šæïŒããã¯ãæ©èœã®ãã«ãªã¯ãšã¹ããéå§ããå¿ èŠãããå Žæã§ãïŒ https ïŒ
ã©ã®ãã©ãããã©ãŒã ïŒWindowsãMacOSãLinuxïŒã§éçºãããã«é¢ããŠæ©èœããç§ã®ããã©JSãœãªã¥ãŒã·ã§ã³ãå ±æããã ãã§ãïŒ
dev / test / prodã«å¥ã ã®ãããžã§ã¯ãã䜿çšããã
/.firebaserc
{ "projects": { "dev": "my-project-name-dev", "test": "my-project-name-test", "prod": "my-project-name-prod" } }
èšå®ãã¡ã€ã«
/functions/config
ãã©ã«ããŒå ã®JSONãã¡ã€ã«ïŒ/functions/config/config.dev.json /functions/config/config.test.json /functions/config/config.prod.json /functions/config/config.SAMPLE.json <-- only file tracked in git Example content: { "google": { "key": "my-api-key", "storage_bucket": "firebase-storage-bucket" }, "another_vendor": { "my_prop": "my value" }, ... }
/functions/set-config.js
const fs = require('fs'); const env = process.argv[2]; const configPath = `./config/config.${env}.json`; if (!(configPath && fs.existsSync(configPath))) { return; } const collectConfigLines = (o, propPath, configLines) => { propPath = propPath || ''; configLines = configLines || []; for (const key of Object.keys(o)) { const newPropPath = propPath + key; if (typeof o[key] === 'object') { collectConfigLines(o[key], newPropPath + '.', configLines); } else if (o[key] != null && o[key] !== '') { configLines.push(`${newPropPath}=${JSON.stringify(o[key])}`); } } } const config = require(configPath); const configLines = []; collectConfigLines(config, '', configLines); const cp = require('child_process'); cp.execSync(`firebase -P ${env} functions:config:set ${configLines.join(' ')}`);
/functions/package.json
... "scripts": { "config:set:dev": "node set-config dev", "config:set:test": "node set-config test", "config:set:prod": "node set-config prod", ... }, ...
ã©ã®ãã©ãããã©ãŒã ïŒWindowsãMacOSãLinuxïŒã§éçºãããã«é¢ããŠæ©èœããç§ã®ããã©JSãœãªã¥ãŒã·ã§ã³ãå ±æããã ãã§ãïŒ
dev / test / prodã«å¥ã ã®ãããžã§ã¯ãã䜿çšããã
/.firebaserc
{ "projects": { "dev": "my-project-name-dev", "test": "my-project-name-test", "prod": "my-project-name-prod" } }
èšå®ãã¡ã€ã«
/functions/config
ãã©ã«ããŒå ã®JSONãã¡ã€ã«ïŒ/functions/config/config.dev.json /functions/config/config.test.json /functions/config/config.prod.json /functions/config/config.SAMPLE.json <-- only file tracked in git Example content: { "google": { "key": "my-api-key", "storage_bucket": "firebase-storage-bucket" }, "another_vendor": { "my_prop": "my value" }, ... }
/functions/set-config.js
const fs = require('fs'); const env = process.argv[2]; const configPath = `./config/config.${env}.json`; if (!(configPath && fs.existsSync(configPath))) { return; } const collectConfigLines = (o, propPath, configLines) => { propPath = propPath || ''; configLines = configLines || []; for (const key of Object.keys(o)) { const newPropPath = propPath + key; if (typeof o[key] === 'object') { collectConfigLines(o[key], newPropPath + '.', configLines); } else if (o[key] != null && o[key] !== '') { configLines.push(`${newPropPath}=${JSON.stringify(o[key])}`); } } } const config = require(configPath); const configLines = []; collectConfigLines(config, '', configLines); const cp = require('child_process'); cp.execSync(`firebase -P ${env} functions:config:set ${configLines.join(' ')}`);
/functions/package.json
... "scripts": { "config:set:dev": "node set-config dev", "config:set:test": "node set-config test", "config:set:prod": "node set-config prod", ... }, ...
ç³ãèš³ãããŸããããã¹ã¯ãªããã configïŒset ïŒdevã
æãåèã«ãªãã³ã¡ã³ã
å ±æããŠããã ãããããšãããããŸãïŒ @laurenzlong
ãã¡ã€ã«ããã€ã³ããŒããããã£ãã®ã§ããã®ãããªã³ãã³ãã䜿çšããŸããã
Firebase Admin SDKã®ãŠãŒã¶ãŒç®¡çAPIã䜿çšãããã£ãã®ã§ããµãŒãã¹ã¢ã«ãŠã³ãã®jsonãã¡ã€ã«ãFirebase CloudFunctionsã«ã€ã³ããŒãããŸããã