我正在尝试将我的 Angular Universal Web 应用程序同时部署到 Cloud Run(用于 SSR)和 Firebase Hosting(用于缓存)。 Cloud Run 的部署工作正常,我遵循了本指南(https://cloud.google.com/build/docs/deploying-builds/deploy-firebase#using_the_firebase_community_builder https://cloud.google.com/build/docs/deploying-builds/deploy-firebase#using_the_firebase_community_builder)以通过 Google Cloud Build 启用 Firebase 部署。
然而,每当我跑步时gcloud builds submit --config=cloudbuild.yaml
错误:public directory 'dist/browser' does not exist, can't deploy hosting to site PROJECT-ID
在 Firebase 部署步骤中抛出cloudbuild.yaml
.
cloudbuild.yaml
:
steps:
# build image
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'gcr.io/PROJECT-ID/SERVICE-ID', '.' ]
# push image
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/PROJECT-ID/SERVICE-ID']
# deploy to Cloud Run
- name: "gcr.io/cloud-builders/gcloud"
args: [ "run", "deploy", "SERVICE-ID", "--image", "gcr.io/PROJECT-ID/SERVICE-ID", "--region", "us-central1", "--platform", "managed", "--allow-unauthenticated" ]
# deploy to Firebase (ERROR HAPPENS HERE Specified public directory 'xx' does not exist, can't deploy hosting to site PROJECT-ID)
- name: gcr.io/PROJECT-ID/firebase
args: ['deploy', '--project=PROJECT-ID', '--only=hosting']
images:
- 'gcr.io/PROJECT-ID/SERVICE-ID'
timeout: 1800s
substitutions:
_ENV_VARIABLE: development
Dockerfile
FROM node:14
# set work directory
WORKDIR usr/src/app
# copy package.json and package-lock
COPY package*.json ./
# install dependencies
RUN npm install
# copy local code to container
COPY . .
# build app
RUN npm run build:ssr
# serve app
CMD ["npm", "run", "serve:ssr"]
firebase.json
{
...
"hosting": [
{
"public": "dist/browser",
"ignore": [
"**/.*"
],
...
}
]
...
}
error-log
DEBUG: https://storage.googleapis.com:443 "GET /987290120943.cloudbuild-logs.googleusercontent.com/log-93082fbf-1b87-499a-9132-fed5f1c06aad.txt HTTP/1.1" 206 290
DEBUG: Reading GCS logfile: 206 (read 290 bytes)
Step #3:
Step #3: ←[1m←[37m===←[39m Deploying to 'PROJECT-ID'...←[22m
Step #3:
Step #3: ←[1m←[36mi ←[39m←[22m deploying ←[1mhosting←[22m
Step #3:
Step #3: ←[1m←[31mError:←[39m←[22m Specified public directory 'dist/browser' does not exist, can't deploy hosting to site PROJECT-ID
DEBUG: https://cloudbuild.googleapis.com:443 "GET /v1/projects/PROJECT-ID/locations/global/builds/93082fbf-1b87-499a-9132-fed5f1c06aad?alt=json HTTP/1.1" 200 None
DEBUG: https://storage.googleapis.com:443 "GET /987290120943.cloudbuild-logs.googleusercontent.com/log-93082fbf-1b87-499a-9132-fed5f1c06aad.txt HTTP/1.1" 206 120
DEBUG: Reading GCS logfile: 206 (read 120 bytes)
Finished Step #3
ERROR
ERROR: build step 3 "gcr.io/PROJECT-ID/firebase" failed: step exited with non-zero status: 1
DEBUG: https://storage.googleapis.com:443 "GET /987290120943.cloudbuild-logs.googleusercontent.com/log-93082fbf-1b87-499a-9132-fed5f1c06aad.txt HTTP/1.1" 416 168
DEBUG: Reading GCS logfile: 416 (no new content; keep polling)
由于本地一切正常,我认为它可能与gcr.io/PROJECT-ID/firebase
与服务位于不同的容器中gcr.io/PROJECT-ID/SERVICE-ID
那里也许是dist
文件夹已创建。
Edit #1:
我测试了在项目的根目录中创建一个名为“static”的文件夹,并更改了public
财产在firebase.json
到“静态”。它起作用了,这让我相信出于某种原因dist/browser
在“部署到 Firebase”步骤中,目录不存在cloudbuild.yaml
即使它是在期间创建的RUN npm run build:ssr
of the Dockerfile
.
Edit #2:
我发现有些东西不太足够(https://stackoverflow.com/a/64215324/8581106 https://stackoverflow.com/a/64215324/8581106)关于类似的问题。但是,建议似乎还运行构建命令npm run build:ssr
在 Firebase 部署之前cloudbuild.yaml
以确保dist/browser
目录存在。但我真的很想避免在 Cloud Run 上提供一个版本并将新版本部署到 Firebase,因为 Angular 使用独特的哈希值.js
and .css
每次都会文件,我觉得这可能会导致缓存问题。
Edit #3:
我创建了一个图像来更好地可视化我的问题(见下图)。我是 docker 和 Cloud Build 的新手,但我觉得这就是我运行时的过程gcloud builds submit --config=cloudbuild.yaml
。我不明白为什么dist/browser
存在于Dockerfile
但不在范围内cloudbuild.yaml
scope.