Я относительно новичок в Google Cloud с точки зрения разработчика. Я настроил базовый веб-сайт и настроил Google Cloud Build для запуска каждый раз, когда я добавляю изменения в GitHub. Это работало хорошо, пока я не решил интегрировать базу данных Firebase. При запуске Cloud Build я получаю следующую ошибку.
Your build failed to run: generic::invalid_argument: invalid value for 'build.substitutions': key in the template "FIREBASE_API_KEY" is not a valid built-in substitution
Ниже копия моего текущего cloudbuild.yaml
.
steps:
- name: "gcr.io/cloud-builders/npm"
dir: "dev"
entrypoint: "bash"
args:
- "-c"
- |
set -e
# Install dependencies
npm install
- name: "gcr.io/cloud-builders/npm"
dir: "dev"
entrypoint: "bash"
env:
- "FIREBASE_API_KEY=${_FIREBASE_API_KEY}"
- "FIREBASE_AUTH_DOMAIN=${_FIREBASE_AUTH_DOMAIN}"
- "FIREBASE_PROJECT_ID=${_FIREBASE_PROJECT_ID}"
- "FIREBASE_STORAGE_BUCKET=${_FIREBASE_STORAGE_BUCKET}"
- "FIREBASE_MESSAGING_SENDER_ID=${_FIREBASE_MESSAGING_SENDER_ID}"
- "FIREBASE_APP_ID=${_FIREBASE_APP_ID}"
args:
- "-c"
- |
set -e
# Create .env file with environment variables
echo "FIREBASE_API_KEY=${FIREBASE_API_KEY}" > .env
echo "FIREBASE_AUTH_DOMAIN=${FIREBASE_AUTH_DOMAIN}" >> .env
echo "FIREBASE_PROJECT_ID=${FIREBASE_PROJECT_ID}" >> .env
echo "FIREBASE_STORAGE_BUCKET=${FIREBASE_STORAGE_BUCKET}" >> .env
echo "FIREBASE_MESSAGING_SENDER_ID=${FIREBASE_MESSAGING_SENDER_ID}" >> .env
echo "FIREBASE_APP_ID=${FIREBASE_APP_ID}" >> .env
# Source environment variables
source .env
# Build the project
npm run build
- name: "gcr.io/cloud-builders/gcloud"
dir: "dev"
entrypoint: "bash"
args:
- "-c"
- |
set -e
# Source environment variables
source .env
# Deploy the app
gcloud app deploy --project=my-project --appyaml=app.yaml
timeout: "1200s"
options:
logging: CLOUD_LOGGING_ONLY
substitutions:
_FIREBASE_API_KEY: ""
_FIREBASE_AUTH_DOMAIN: ""
_FIREBASE_PROJECT_ID: ""
_FIREBASE_STORAGE_BUCKET: ""
_FIREBASE_MESSAGING_SENDER_ID: ""
_FIREBASE_APP_ID: ""
Я попробовал итерации нумерации изменения моего файла cloudbuild.yaml, чтобы заставить это работать. Первоначально секреты от DB находились в Google Secret Manager, и я пытался извлечь их оттуда, но не смог заставить это работать. Теперь я устанавливаю секреты как переменные подстановки в триггере сборки облака.
В приведенном ниже фрагменте я использую переменные. Файл .env все еще используется, но я открыт для лучших и более чистых решений.
import { initializeApp } from "firebase/app"
import { getFirestore, doc, getDoc, setDoc, updateDoc } from "firebase/firestore"
// Initialize Firebase with environment variables
const firebaseConfig = {
apiKey: process.env.FIREBASE_API_KEY,
authDomain: process.env.FIREBASE_AUTH_DOMAIN,
projectId: process.env.FIREBASE_PROJECT_ID,
storageBucket: process.env.FIREBASE_STORAGE_BUCKET,
messagingSenderId: process.env.FIREBASE_MESSAGING_SENDER_ID,
appId: process.env.FIREBASE_APP_ID
}
// Initialize Firebase
const app = initializeApp(firebaseConfig)
const db = getFirestore(app)
Я не уверен, где что-то идет не так. Я попробовал использовать Заранее спасибо за любые подсказки!!!
10 лет в ИТ/разработке и это мой первый пост на StackExchange!! уууу!
Не стыдно опубликовать свой первый вопрос спустя 10 лет! Все новое сложно, и ответ вы увидите довольно «странным»!
На своем этапе вы определяете ENV VARS, которые принимают значения переменных подстановки. Эта часть в порядке
Затем на своем этапе вы вызываете свою переменную окружения, и это неправильно. Если в Cloud Build вы используете один $
, вы вызываете переменные подстановки. Если вы используете двойной $
, на этот раз вы вызовете переменные окружения! Подробности здесь, в документе
Попробуйте это вместо этого
...
- name: "gcr.io/cloud-builders/npm"
dir: "dev"
entrypoint: "bash"
env:
- "FIREBASE_API_KEY=${_FIREBASE_API_KEY}"
- "FIREBASE_AUTH_DOMAIN=${_FIREBASE_AUTH_DOMAIN}"
- "FIREBASE_PROJECT_ID=${_FIREBASE_PROJECT_ID}"
- "FIREBASE_STORAGE_BUCKET=${_FIREBASE_STORAGE_BUCKET}"
- "FIREBASE_MESSAGING_SENDER_ID=${_FIREBASE_MESSAGING_SENDER_ID}"
- "FIREBASE_APP_ID=${_FIREBASE_APP_ID}"
args:
- "-c"
- |
set -e
# Create .env file with environment variables
echo "FIREBASE_API_KEY=$${FIREBASE_API_KEY}" > .env
echo "FIREBASE_AUTH_DOMAIN=$${FIREBASE_AUTH_DOMAIN}" >> .env
echo "FIREBASE_PROJECT_ID=$${FIREBASE_PROJECT_ID}" >> .env
echo "FIREBASE_STORAGE_BUCKET=$${FIREBASE_STORAGE_BUCKET}" >> .env
echo "FIREBASE_MESSAGING_SENDER_ID=$${FIREBASE_MESSAGING_SENDER_ID}" >> .env
echo "FIREBASE_APP_ID=$${FIREBASE_APP_ID}" >> .env
# Source environment variables
source .env
# Build the project
npm run build
...
При этом, какова цель создания файла .env
? Просто чтобы source
это сразу после? На этом этапе переменная env уже существует.
На этапе развертывания AppEngine знак source
перед gcloud app deploy
бесполезен; команда не учитывает переменные окружения. Ваш файл .env
полезен только в том случае, если он необходим для развертывания движка приложения.
Вот в чем была моя проблема. Спасибо за быстрый ответ. Теперь о моем следующем выпуске!
Удачи! Мы здесь, чтобы помочь ;)
Изначально .env предназначался для локального тестирования, и я сохранил его при переходе на Cloud Build. Я добавил код, который используется в моем исходном сообщении. Я открыт для рефакторинга, но не знаю, как лучше всего это сделать.