今天就繼續 MVP 實戰吧~ CI/CD,我來了~
不清楚目前進度的可以先回到昨天的專案架構,也會包含今天要詳細說明的三個檔案
fabric
模組部署正式站fabric
是 Python 的一個模組,可以方便我們連線到遠端的 server,並將測試完的程式更新同步到 server,其實就是在 server 當中進到資料夾執行 git pull
,以概念上可以直接用 shell script 撰寫,但是fabric
可以讓我們方便的將內容變成函數,直接執行 fab {函數名稱}
就可以達成了
另外,有一些系統更新後可能會需要重啟,但是 airflow 只需要將程式碼 pull 下來後就可以直接同步更新了
$ pip install fabric
專案架構有建立起來之後,就只需要將模組名稱或特定版本放到 requirements.txt
當中,不論是用 Dockerfile
建立正式環境或是 venv
建立測試環境,只需要重新執行就能同步所有模組安裝。
import os
from fabric import Connection, task
@task
def staging(ctx):
with Connection(
"YOUR SERVER IP",
user="YOUR USER NAEM",
connect_kwargs={"key_filename":os.environ['KEY_PATH']}
) as conn:
with conn.cd("/airflow"):
conn.run("git pull origin main --rebase")
其實上方就超級白話文,建立連接之後,就可以 cd
到專案目錄,然後直接執行 git pull origin main --rebase
,當然也可以針對每一次的 commit 做更細部的部署,例如發現 commit 有修改 docker-compose.yml
,就需要在 pull 完之後重新建立環境等等
Makefile
方便管理指令集最早接觸Makefile
應該都是寫 C 語言的時候,覺得對大部分專案都很適合管理指令集,統整在一個檔案,後續不管是測試或部署都會更方便
基本上就是將需要執行的 terminal 指令放在縮排內,基本範例像這樣:
create_test_folder:
mkdir test_folder
當執行 create_test_folder
時,就執行下方指令,就會順利 create 出新的資料夾
執行 Makefile 的方式就是 make create_test_folder
VENV=venv/bin
.PHONY: venv
venv: venv/bin/activate
venv/bin/activate: requirements.txt
@test -d venv || python3 -m venv venv
@$(VENV)/python -m pip install --upgrade pip
@$(VENV)/pip install -Ur requirements.txt
.PHONY: lint
lint: venv
@$(VENV)/python -m ruff check dags/*.py
@$(VENV)/python -m ruff check plugins
@$(VENV)/python -m ruff check tests
@$(VENV)/sqlfluff fix dbt/*/models/*/*.sql
.PHONY: test
test: venv
@$(VENV)/python -m pytest tests/dags/test_*.py
這裡面就分成建立虛擬環境、和檢查 lint、執行測試等等
可以看到在 lint
和 test
後面都有加上 venv
,像這樣 lint: venv
和 test: venv
,意思就是要先確定執行過 venv
才能繼續
buildspec.yml
測試與部署自動化前面提到的 AWS CodeBuild 就是會使用到這個buildspec.yml
檔案,會有兩種檔案buildspec_test.yml
和 buildspec_deploy.yml
,是因為有兩種 stage,分別是測試和部署,分開來可以確保各自獨立,才不會發生測試沒過卻直接部署的慘案,當然可以透過 on-failure: ABORT
或是有嘟個環境,就算部署也只是測試站等等避免,但是各自獨立還是比較保險。
buildspec_test.yml
用在測試專案,會測試 lint
和 test
,具體執行方法和指令可以看上方的 Makefile,基本上就是建立虛擬環境
➡️執行 code lint 測試
➡️執行 code quality 測試
,其中的 on-failure: ABORT
就是代表一但失敗了,整個 codebuild 就會暫停。
version: 0.2
phases:
install:
runtime-versions:
python: 3.9
commands:
- make venv
pre_build:
on-failure: ABORT
commands:
- make lint
build:
on-failure: ABORT
commands:
- make test
buildspec_deploy.yml
用於部署專案,最上方的 env:
是為了將 SSH KEY
從 AWS 的 secrets-manager 載入到環境當中,並對應到 pre_build
區塊,載入SSH KEY
之後會再 decode 存到環境變數,後續 fab staging
才能使用並連接到遠端的 server 更新程式部署。
version: 0.2
env:
secrets-manager:
SSH_KEY: {YOUR SECRET ARN}
phases:
install:
runtime-versions:
python: 3.9
commands:
- pip install fabric
pre_build:
on-failure: ABORT
commands:
- echo "$SSH_KEY" | base64 -d > "$KEY_PATH"
build:
on-failure: ABORT
commands:
- fab staging