介紹

該系列的目標是通過解決一個具體問題:在線課程的評分系統,探索和演示現代后端的不同模式、問題和架構。選擇這個問題是因為它涉及多種關系類型,而且復雜度足夠,能夠很好地反映現實世界的應用場景。

上面提供了實時流的錄制內容,其內容與本文相同。

該系列將涵蓋哪些內容

該系列將重點關注數據庫在后端開發各個方面的作用,包括:

話題部分
數據建模第 1 部分
增刪改查第 1 部分
聚合第 1 部分
REST API 層第2部分
驗證第2部分
測試第2部分
無密碼認證第三部分
授權第三部分
與外部 API 集成第三部分
持續集成第 4 部分(當前)
部署第 4 部分(當前)

在第一篇文章中,您為問題域設計了一個數據模型,并編寫了一個使用Prisma Client將數據保存到數據庫的種子腳本。

在本系列的第二篇文章中,您基于第一篇文章所介紹的數據模型和Prisma架構,成功構建了一個REST API。您使用Hapi構建了 REST API,它允許通過 HTTP 請求對資源執行 CRUD 操作。

在本系列的第三篇文章中,您實現了基于電子郵件的無密碼身份驗證和授權,并使用JSON Web 令牌 (JWT)和 Hapi 來保護 REST API。此外,您還實現了基于資源的授權機制,以明確用戶被允許執行的具體操作。

學到的內容

在本文中,您將通過定義運行測試并將后端部署到 Heroku(您將在其中托管后端和 PostgreSQL 數據庫)的工作流程,將 GitHub Actions 設置為 CI/CD 服務器。

Heroku 是一個平臺即服務(PaaS)提供商。與無服務器部署模型有所不同,在 Heroku 上,即使當前沒有向您的應用程序發出請求,應用程序也會保持運行狀態。雖然無服務器具有許多優勢,例如更低的成本和更少的運營開銷,但這種方法避免了無服務器方法常見的數據庫連接擾動和冷啟動的挑戰。

注意:在整個指南中,您將找到各種檢查點,使您能夠驗證是否正確執行了這些步驟。

先決條件

要將帶有 GitHub Action 的后端部署到 Heroku,您將需要以下內容:

持續集成和持續部署

持續集成(CI)是一種技術手段,旨在將單個開發人員的工作成果整合到主代碼庫中,以便及時發現集成過程中可能出現的錯誤,并促進開發團隊之間的協作與效率提升。通常,CI 服務器連接到 Git 存儲庫,每次將提交推送到存儲庫時,CI 服務器都會運行。

持續部署 (CD) 是一種涉及自動化部署過程的方法,以便可以快速、一致地部署更改。

盡管CI和CD各自承擔著不同的職責,但它們之間是相互關聯的,并且通常我們會利用相同的工具來執行這兩個過程。在本文中,您將使用 GitHub Actions 來處理 CI 和 CD。

持續集成管道

通過持續集成,主要構建塊是管道。管道是您定義的一組步驟,用于確保您的更改不會引入錯誤或回歸。例如,管道可能包含運行測試、代碼檢查和 TypeScript 編譯器的步驟。如果其中一個步驟失敗,CI 服務器將停止并向 GitHub 報告失敗的步驟。

在團隊協作中,若采用拉取請求來引入代碼更改,那么CI(持續集成)服務器通常會被設定為對每個拉取請求自動執行相應的管道流程。

您在前面的步驟中編寫的測試通過模擬對 API 端點的請求來工作。由于這些端點的處理程序與數據庫交互,因此在測試期間您將需要一個具有后端架構的 PostgreSQL 數據庫。在接下來的步驟中,您需要配置GitHub Actions,以便在運行CI時能夠啟動測試數據庫并執行遷移操作,從而確保測試數據庫的結構與您的Prisma架構保持一致。

注意: CI 的好壞取決于您編寫的測試。如果您的測試覆蓋率較低,通過測試可能會產生錯誤的自信感。

使用 GitHub Actions 定義工作流程

GitHub Actions 是一個可用于持續集成的自動化平臺。它提供了一個 API,用于根據 GitHub 中的事件編排工作流程,并可用于從 GitHub 構建、測試和部署代碼。

要配置 GitHub Actions,您可以使用 yaml 定義工作流程。工作流可以配置為在不同的存儲庫事件上運行,例如,當提交被推送到存儲庫時或當創建拉取請求時。

每個工作流可以包含多個作業,而每個作業又由多個步驟所組成。在這些作業中,每一個步驟都代表著一個命令,并且這些命令能夠訪問到正在進行測試的特定提交所對應的源代碼。

注意: CI 服務對管道使用不同的術語;例如,GitHub Actions 使用術語“工作流程”來指代同一事物。

在本文中,您將使用存儲庫中的grading-app工作流。

讓我們看一下工作流程:

name: grading-app
on: push

jobs:
test:
runs-on: ubuntu-latest
# Service containers to run with container-job services: # Label used to access the service container postgres: # Docker Hub image image: postgres # Provide the password for postgres env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: # Maps TCP port 5432 on service container to the host - 5432:5432 env: DATABASE_URL: postgresql://postgres:postgres@localhost:5432/grading-app steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: node-version: '12.x' - run: npm ci # run the migration in the test database - run: npm run db:push - run: npm run test deploy: runs-on: ubuntu-latest if: github.event_name == 'push' && github.ref == 'refs/heads/master' # Only deploy master needs: test steps: - uses: actions/checkout@v2 - run: npm ci - name: Run production migration run: npm run migrate:deploy env: DATABASE_URL: ${{ secrets.DATABASE_URL }} - uses: akhileshns/heroku-deploy@v3.4.6 with: heroku_api_key: ${{ secrets.HEROKU_API_KEY }} heroku_app_name: ${{ secrets.HEROKU_APP_NAME }} heroku_email: ${{ secrets.HEROKU_EMAIL }}

grading-app工作流有兩個作業:testdeploy

測試作業將執行以下操作:

  1. 查看存儲庫。
  2. 配置節點。
  3. 安裝依賴項。
  4. 在使用 啟動的測試數據庫中創建數據庫架構services
  5. 運行測試。

注意: services可用于運行附加服務。在上面的測試作業中,它用于創建測試 PostgreSQL 數據庫。

部署作業將執行以下操作:

  1. 查看存儲庫
  2. 安裝依賴項
  3. 針對生產數據庫運行遷移
  4. 部署到 Heroku

注意:?on: push?會為每次代碼推送到倉庫時觸發相應的工作流程。而?if: github.event_name == 'push' && github.ref == 'refs/heads/master'?這個條件則確保了名為?deploy?的作業僅在代碼被推送到?master?分支時才會被觸發執行。

分叉存儲庫并啟用工作流程

首先分叉GitHub 存儲庫,以便您可以配置 GitHub 操作。

注意:如果您已經對倉庫進行了分叉,那么請將原始倉庫中master分支的更改合并到您的分叉倉庫中。

分叉后,轉到Github 上的操作選項卡:

單擊啟用按鈕啟用工作流程:

現在,當您將提交推送到存儲庫時,GitHub 將運行工作流程。

Heroku CLI 登錄

確保您已使用 CLI 登錄到 Heroku:

heroku login

創建 Heroku 應用程序

要將后端應用程序部署到 Heroku,您需要創建一個 Heroku 應用程序。從克隆存儲庫的文件夾中運行以下命令:

cd real-world-grading-app
heroku apps:create YOUR_APP_NAME

注意:使用您選擇的唯一名稱而不是YOUR_APP_NAME

檢查點Heroku CLI 應記錄應用程序已成功創建:

Creating ? YOUR_APP_NAME... done

在 Heroku 上配置 PostgreSQL 數據庫

使用以下命令創建數據庫:

heroku addons:create heroku-postgresql:hobby-dev

檢查點:要驗證數據庫是否已創建,您應該看到以下內容:

Creating heroku-postgresql:hobby-dev on ? YOUR_APP_NAME... free
Database has been created and is available
! This database is empty. If upgrading, you can transfer
! data from another database with pg:copy
Created postgresql-closed-86440 as DATABASE_URL

注意:?Heroku 會自動設置DATABASE_URL應用程序運行時的環境變量。Prisma 客戶端會使用與在 Prisma 架構的?DATABASE_URL?中所配置的環境變量相匹配的那個環境變量。

在 GitHub 中定義構建的機密

為了在 GitHub Actions 中執行生產數據庫的遷移操作以及將后端部署到 Heroku,您需要在 GitHub 中創建四個機密,這些機密將在工作流程中被引用。

注意:構建時機密和運行時機密之間存在區別。構建時機密將在 GitHub 中定義并在 GitHub Actions 運行期間使用。另一方面,運行時秘密將在 Heroku 中定義并由后端使用。

密語

獲取生產

要獲取DATABASE_URLHeroku 在配置數據庫時設置的 , 請使用以下 Heroku CLI 命令:

heroku config:get DATABASE_URL

檢查點:您應該在輸出中看到 URL,例如,postgres://username:password@ec2-12.eu-west-1.compute.amazonaws.com:5432/dbname

得到的HEROKU_API_KEY

您可以從自己的Heroku帳戶設置頁面中獲取Heroku API密鑰:

Heroku 賬戶設置中的 Heroku API 密鑰

在 GitHub 中創建機密

要創建四個機密,請轉到存儲庫設置并打開“機密”選項卡:

GitHub 存儲庫的秘密

單擊“新建密鑰”,使用名稱字段作為密鑰名稱,例如,HEROKU_APP_NAME并設置值:

檢查點:創建四個秘密后,您應該看到以下內容:

GitHub 存儲庫的秘密

在 Heroku 上定義環境變量

后端需要三個密鑰,這些密鑰將在運行時作為環境變量傳遞給應用程序:

注意:您可以JWT_SECRET通過在終端中運行以下命令來生成:

node -e "console.log(require('crypto').randomBytes(256).toString('base64'));"

要使用 Heroku CLI 設置它們,請使用以下命令:

heroku config:set SENDGRID_API_KEY="REPLACE_WITH_API_KEY" JWT_SECRET="REPLACE_WITH_SECRET"

檢查點:為了確認環境變量是否已經正確設置,您應該能夠看到如下內容:

Setting SENDGRID_API_KEY, JWT_SECRET and restarting ? YOUR_APP_NAME... done, v7

觸發工作流程來運行測試和部署

配置工作流程、在 Heroku 上創建應用程序以及設置所有機密后,您現在可以觸發工作流程來運行測試和部署。

為了觸發構建流程,您可以創建一個空提交并將其推送。

git commit --allow-empty -m "Trigger build"
git push

推送提交后,轉到 GitHub 存儲庫的“操作”選項卡,您應該會看到以下內容:

單擊表中包含提交消息的第一行:

查看日志

要查看作業的日志test,請單擊test相應的按鈕,您可以查看每個步驟的日志。例如,在下面的屏幕截圖中,您可以查看測試結果:

驗證 Heroku 的部署

要驗證該deploy作業已成功部署到 Heroku,請單擊deploy左側的Deploy to Heroku并展開該步驟。您應該在日志末尾看到以下行:

remote: https://***.herokuapp.com/ deployed to Heroku

若要從瀏覽器中訪問API,請在已克隆的存儲庫文件夾內執行以下Heroku CLI命令:

heroku open

這將打開指向https://YOUR_APP_NAME.herokuapp.com/的瀏覽器。

檢查點:您應該在瀏覽器中看到由狀態端點{"up":true}提供的服務。

查看后端日志

要查看后端日志,請從克隆的存儲庫文件夾中使用以下 Heroku CLI 命令:

heroku logs --tail -a YOUR_APP_NAME

測試登錄流程

要測試登錄流程,您需要對 REST API 進行兩次調用。

首先獲取 API 的 URL:

heroku apps:info

使用curl 對登錄端點進行POST 調用:

curl --header "Content-Type: application/json" --request POST --data '{"email":"your-email@prisma.io"}' https://YOUR_APP_NAME.herokuapp.com/login

檢查您電子郵件中收到的8位數令牌,并據此執行下一步操作。

curl -v --header "Content-Type: application/json" --request POST --data '{"email":"your-email@prisma.io", "emailToken": "99223388"}' https://YOUR_APP_NAME.herokuapp.com/authenticate

檢查點:響應應具有 200 成功狀態代碼并包含Authorization帶有 JWT 令牌的標頭:

< Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbklkIjo4fQ.ea2lBPMJ6mrPkwEHCgeIFqqQfkQ2uMQ4hL-GCuwtBAE

概括

您的后端已經成功部署并正在運行中。做得非常好!

您通過定義 GitHub Actions 工作流程配置持續集成和部署,創建 Heroku 應用程序,配置 PostgreSQL 數據庫,并使用 GitHub Actions 將后端部署到 Heroku。

當您向倉庫提交代碼并推送更改以引入新功能時,測試和TypeScript編譯器將會自動執行。如果一切順利,后端將會被部署。

您可以通過進入 Heroku 儀表板來查看內存使用情況、響應時間和吞吐量等指標。這對于深入了解后端如何處理不同的流量非常有用。例如,后端負載增加可能會導致響應時間變慢。

通過將TypeScript與Prisma Client結合使用,您可以在編譯階段就消除一類通常在運行時才會發現且需要調試的類型錯誤。

您可以在GitHub上找到后端的完整源代碼。

盡管Prisma的設計初衷是為了簡化關系數據庫的使用,但深入了解底層數據庫以及Heroku的具體細節仍然是非常有益的。

原文鏈接:https://www.prisma.io/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5

上一篇:

Rest API 教程 – 完整的初學者指南

下一篇:

如何獲取 truora 開放平臺 API Key 密鑰(分步指南)
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費