谷歌云构建不使用环境变量替换 Firebase 令牌

Posted

技术标签:

【中文标题】谷歌云构建不使用环境变量替换 Firebase 令牌【英文标题】:Google cloud built not substituting environment variable for firebase token 【发布时间】:2019-09-09 07:14:05 【问题描述】:

我有一个云构建触发器,它试图将我的应用程序推送到 Firebase 托管。为此,我有一个加密的 .env.enc 文件,其中包含部署所需的 firebase 令牌。在我的构建过程中,我解密了这个文件并尝试部署,但遇到了未经授权的消息。

我尝试在我的部署脚本中对令牌进行硬编码,而不是使用环境变量,它部署得很好。

这是我的 cloudbuild.yaml

steps:
- name: gcr.io/cloud-builders/gcloud
  args:
  - kms
  - decrypt
  - --ciphertext-file=.env.enc
  - --plaintext-file=.env
  - --location=global
  - --keyring=s-s-r-vue-docker-app
  - --key=cloudbuild-env
# Install
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']
# Test
- name: 'gcr.io/cloud-builders/npm'
  args: ['run', 'test']
# Build
- name: 'gcr.io/cloud-builders/npm'
  args: ['run', 'build']
# Deploy
- name: 'gcr.io/cloud-builders/npm'
  args: ['run', 'deploy']

最后的部署步骤在我的 package.json 中调用一个 npm 脚本,其中的环境变量来自解密的 .env 文件。

"deploy": "firebase deploy --debug --token \"$FIREBASE_TOKEN\"

我得到的初始输出表明令牌没有被使用,但也可以从最终日志中删除。

Step #4: [2019-04-17T21:14:48.087Z] Command: /usr/local/bin/node /workspace/node_modules/.bin/firebase deploy --debug --token= --only=hosting

这是我在尝试部署时收到的错误。

Step #4: Error: HTTP Error: 403, The caller does not have permission
Step #4: 
Step #4: [2019-04-17T21:14:48.531Z] <<< HTTP RESPONSE BODY code=403, message=The caller does not have permission, status=PERMISSION_DENIED
Step #4: [2019-04-17T21:14:48.530Z] <<< HTTP RESPONSE 403 vary=X-Origin, Referer, Origin,Accept-Encoding, content-type=application/json; charset=UTF-8, date=Wed, 17 Apr 2019 21:14:48 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, accept-ranges=none, transfer-encoding=chunked
Step #4: rewrites=[glob=**, region=us-central1, serviceId=nuxt-server], deployment-tool=cli-firebase
Step #4: [2019-04-17T21:14:48.337Z] >>> HTTP REQUEST POST https://firebasehosting.googleapis.com/v1beta1/sites/s-s-r-vue-docker-app/versions 
Step #4: i deploying hosting
Step #4: 
Step #4: === Deploying to 's-s-r-vue-docker-app'...

如果正在使用环境变量,我有什么建议可以调试吗?或者我的构建步骤中是否缺少一些允许我使用 .env 文件中的环境变量的东西?

我尝试遵循本指南: https://fireship.io/lessons/ci-cd-with-google-cloud-build/。 我似乎看不到我在这里缺少的东西,因此感谢您提供任何帮助。

【问题讨论】:

【参考方案1】:

构建 firebase Docker 映像。

见:

https://github.com/GoogleCloudPlatform/cloud-builders-community
$ git clone https://github.com/GoogleCloudPlatform/cloud-builders-community
$ cd firebase
$ gcloud builds submit --config cloudbuild.yaml .

加密 ci 令牌

$ firebase login:ci
$ gcloud kms keyrings create cloudbuilder --location global
$ gcloud kms keys create firebase-token --location global --keyring cloudbuilder --purpose encryption
$ echo -n <ciToken> | gcloud kms encrypt \
  --plaintext-file=- \
  --ciphertext-file=- \
  --location=global \
  --keyring=cloudbuilder \
  --key=firebase-token | base64

在 cloudbuild.yaml 中设置加密的 ci 令牌

见:

https://cloud.google.com/cloud-build/docs/securing-builds/use-encrypted-secrets-credentials?hl=ja#example_build_request_using_an_encrypted_variable https://github.com/GoogleCloudPlatform/cloud-builders-community/blob/master/firebase/firebase.bash#L5 https://github.com/firebase/firebase-tools#user-content-using-with-ci-systems
secrets:
- kmsKeyName: projects/<projectName>/locations/global/keyRings/cloudbuilder/cryptoKeys/firebase-token
  secretEnv:
    FIREBASE_TOKEN: <EncryptedCiToken>
steps:
- id: 'npm install'
  name: 'gcr.io/cloud-builders/npm'
  args: ['install']

- id: 'functions npm install'
  name: 'gcr.io/cloud-builders/npm'
  args: ['install']
  dir: 'functions'

- id: "deploy firebase"
  name: 'gcr.io/$PROJECT_ID/firebase'
  args: ['deploy', '--project=<projectName>']

# Deploy specific Firebase services
# (If you only want to deploy specific Firebase services or features)
#
# - id: "deploy firebase"
#   name: 'gcr.io/$PROJECT_ID/firebase'
#   args: ['deploy', '--only', 'functions', '--project=<projectName>']
# 
# - id: "deploy firebase storage"
#   name: 'gcr.io/$PROJECT_ID/firebase'
#   args: ['deploy', '--only', 'storage', '--project=<projectName>']
#   secretEnv: ['FIREBASE_TOKEN']
# 
# - id: "deploy firebase firestore"
#   name: 'gcr.io/$PROJECT_ID/firebase'
#   args: ['deploy', '--only', 'firestore', '--project=<projectName>']
#   secretEnv: ['FIREBASE_TOKEN']
# 
# - id: "deploy firebase hosting"
#   name: 'gcr.io/$PROJECT_ID/firebase'
#   args: ['deploy', '--only', 'hosting', '--project=<projectName>']

更多信息

https://github.com/zkohi/firebase-sub-guides/blob/master/content/docs/ja/cd/index.md

【讨论】:

以上是关于谷歌云构建不使用环境变量替换 Firebase 令牌的主要内容,如果未能解决你的问题,请参考以下文章

REACT APP 无法访问谷歌云运行环境变量

在 cli 上部署云函数,“Firebase 配置变量不可用。”

谷歌云 - 连接:连接被云构建触发器拒绝

谷歌云平台:“找不到模块 firebase-admin”

使用node.js中的firebase从谷歌云存储读取时,ESlint问题“每个都应该返回一个值或抛出”

谷歌云/firebase 存储错误:无法在没有“client_email”的情况下签署数据。 ...名称:'SigningError'