目的
有機會在 GCP 上實作了兩種不同方式的靜態網站部署,
一種是透過 Artifacts Registry 與 Cloud Run,
另一種是透過 Google Cloud Storage 與 Load Balancing
特別記錄一下。
Build Web
build 建置網站, EX: flutter build web
、npm rub build
…
- flutter 建置的 web 靜態檔位置在
build/web
react-scripts build
靜態檔位置在build
底下
問題與解決方式
react build 不同環境的靜態檔
開發上會有不同環境需
預設執行 react-scripts build 會建置出 production 的靜態檔,
故需要透過套件 env-cmd 來幫我們建立不同的靜態檔,
請參考以下的 package.json > scripts
1 | "build": "react-scripts build", |
ERR_OSSL_EVP_UNSUPPORTED
截至 2021 年 12,nodejs LTS 版本為 v16.13.1
Latest Features 為 v17.3.0
如果 nodejs 的版本在 v17.*.*
以上
執行 react-scripts build 會發生以下錯誤
1 | Error: error:0308010C:digital envelope routines::unsupported |
解決方法,執行以下語法
export NODE_OPTIONS=–openssl-legacy-provider
或是將 node version 換回 v16.*.*
的版本
nvm use v16.13.1
Build Image
如果選擇 Artifacts Registry 與 Cloud Run 的 solution
必須撰寫 Dockerfile 來建立 Docker Images
問題 [Dart] no active package dhttpd
dhttpd 是 Dart 的靜態網站解決方案,
不過在部署到 Cloud Run 時會發生錯誤,
更多資訊請參考 stackoverflow 的提問與 issueTracker 的後續
20220308 已有解決方案,更新
加上 dart global activate 指令,這會在執行前啟用 dhttpd 的服務,
RUN 是建立鏡像檔的語法, CMD 才是 docker image 啟動時會執行的語法,
所以應該將 activate 指令放在啟動
1 | FROM docker.io/dart |
參考聯結
暫解是使用其它的靜態網站服務或套件 ,EX: NGINX 、 npm 的 serve 套件,或是其它你熟悉的靜態網站服務。請參考以下 Dockerfile
1 | # pull official base image |
Artifacts Registry & Cloud Run
- 登入私有的 Container Registry
- 透過 CI 建置 image
- 加上版本的 Tag
- 推上 Container Registry
參考部份的 .gitlab-ci.yml
1 | script: |
接下手動設定 Cloud Run(這部份應該也可以自動化,未實作故無記錄)
- Create Service
- Container > General > Container Image URL > SELECT > ARTIFACT REGISTRY > 選取上面部署上去的 images
- Container Port 8080
- DEPLOY
缺點是每次 CI 跑完 Image 推上 Artifact 後,仍要手動到 Cloud Run 執行 Deploy。
這個步驟應該放在 CI Server 上(即使是需要手動觸發也是),才不會有斷點。
(fin)