从开发者的角度来看,我对 Google Cloud 还比较陌生。我已经设置了一个基本网站,并将 Google Cloud Build 配置为在我将更改推送到 GitHub 时运行。在我决定集成 Firebase DB 之前,这种方法一直运行良好。 当 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 Secrets 在 Google Secret Manager 中,我试图从那里提取,但我无法让它发挥作用。现在我将秘密设置为云构建触发器中的替换变量。
我不确定哪里出了问题。我尝试使用 ChatGPT,但这使事情变得更加复杂(并且非常没有帮助)。预先感谢您的指点!!!
从事 IT/开发 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
之后吗?此步骤中环境变量已存在。
对于 AppEngine 部署步骤,
source
之前的 gcloud app deploy
没有用;该命令不考虑环境变量。您的 .env
文件仅在应用程序引擎部署需要时才有用。