Облако Google построено без замены переменной среды для токена firebase

#firebase #google-cloud-platform #firebase-cli #google-cloud-build

# #firebase #google-облачная платформа #firebase-cli #google-cloud-build

Вопрос:

У меня есть триггер облачной сборки, который пытается отправить мое приложение на хостинг 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=ssr-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']
 

На последнем этапе развертывания вызывается сценарий npm в моем package.json с переменной среды, используемой из расшифрованного файла .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/ssr-vue-docker-app/versions 
Step #4: i deploying hosting
Step #4: 
Step #4: === Deploying to 'ssr-vue-docker-app'...
 

Любые предложения о том, как я мог бы отлаживать, если используется переменная среды? Или есть что-то, чего мне не хватает в моих шагах сборки, которые позволяют мне использовать переменные среды из файла .env?

Я попытался следовать этому руководству: https://fireship.io/lessons/ci-cd-with-google-cloud-build /. Кажется, я не вижу, чего мне здесь не хватает, поэтому любая помощь приветствуется.

Ответ №1:

Создайте образ firebase Docker.

См.:

 $ 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
 

Установите зашифрованный токен ci в cloudbuild.yaml

См.:

 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>']
 

Дополнительная информация