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
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工作流有兩個作業:test和deploy。
測試作業將執行以下操作:
services。注意:
services可用于運行附加服務。在上面的測試作業中,它用于創建測試 PostgreSQL 數據庫。
部署作業將執行以下操作:
注意:
on: push會為每次代碼推送到倉庫時觸發相應的工作流程。而if: github.event_name == 'push' && github.ref == 'refs/heads/master'這個條件則確保了名為deploy的作業僅在代碼被推送到master分支時才會被觸發執行。
首先分叉GitHub 存儲庫,以便您可以配置 GitHub 操作。
分叉后,轉到Github 上的操作選項卡:
單擊啟用按鈕啟用工作流程:
現在,當您將提交推送到存儲庫時,GitHub 將運行工作流程。
確保您已使用 CLI 登錄到 Heroku:
heroku login
要將后端應用程序部署到 Heroku,您需要創建一個 Heroku 應用程序。從克隆存儲庫的文件夾中運行以下命令:
cd real-world-grading-app
heroku apps:create YOUR_APP_NAME
注意:使用您選擇的唯一名稱而不是
YOUR_APP_NAME。
檢查點Heroku CLI 應記錄應用程序已成功創建:
Creating ? YOUR_APP_NAME... done
使用以下命令創建數據庫:
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 Actions 中執行生產數據庫的遷移操作以及將后端部署到 Heroku,您需要在 GitHub 中創建四個機密,這些機密將在工作流程中被引用。
注意:構建時機密和運行時機密之間存在區別。構建時機密將在 GitHub 中定義并在 GitHub Actions 運行期間使用。另一方面,運行時秘密將在 Heroku 中定義并由后端使用。
HEROKU_APP_NAME:您在上一步中選擇的應用程序的名稱。HEROKU_EMAIL:您注冊 Heroku 時使用的電子郵件。HEROKU_API_KEY:Heroku API 密鑰DATABASE_URL:Heroku 上的生產 PostgreSQL URL,需要在部署之前運行生產數據庫遷移。要獲取DATABASE_URLHeroku 在配置數據庫時設置的 , 請使用以下 Heroku CLI 命令:
heroku config:get DATABASE_URL
檢查點:您應該在輸出中看到 URL,例如,postgres://username:password@ec2-12.eu-west-1.compute.amazonaws.com:5432/dbname
您可以從自己的Heroku帳戶設置頁面中獲取Heroku API密鑰:

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

單擊“新建密鑰”,使用名稱字段作為密鑰名稱,例如,HEROKU_APP_NAME并設置值:
檢查點:創建四個秘密后,您應該看到以下內容:

后端需要三個密鑰,這些密鑰將在運行時作為環境變量傳遞給應用程序:
SENDGRID_API_KEY:SendGrid API 密鑰。JWT_SECRET:用于簽署 JWT 令牌的秘密。DATABASE_URL:Heroku 自動設置的數據庫連接 URL。注意:您可以
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相應的按鈕,您可以查看每個步驟的日志。例如,在下面的屏幕截圖中,您可以查看測試結果:

要驗證該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