iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
DevOps

我獨自升級:從水管工走向 DataOps系列 第 29

【Day 29】Data Pipeline MVP CI/CD 實戰 - fabric、Makefile 和 buildspec.yml

  • 分享至 

  • xImage
  •  

前言

今天就繼續 MVP 實戰吧~ CI/CD,我來了~

不清楚目前進度的可以先回到昨天的專案架構,也會包含今天要詳細說明的三個檔案

本日專案程式碼

fabric 模組部署正式站

fabric 是 Python 的一個模組,可以方便我們連線到遠端的 server,並將測試完的程式更新同步到 server,其實就是在 server 當中進到資料夾執行 git pull,以概念上可以直接用 shell script 撰寫,但是fabric可以讓我們方便的將內容變成函數,直接執行 fab {函數名稱} 就可以達成了

另外,有一些系統更新後可能會需要重啟,但是 airflow 只需要將程式碼 pull 下來後就可以直接同步更新了

安裝模組

$ pip install fabric

專案架構有建立起來之後,就只需要將模組名稱或特定版本放到 requirements.txt 當中,不論是用 Dockerfile 建立正式環境或是 venv 建立測試環境,只需要重新執行就能同步所有模組安裝。

fabric 程式範例

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、執行測試等等
可以看到在 linttest 後面都有加上 venv,像這樣 lint: venvtest: venv,意思就是要先確定執行過 venv 才能繼續

buildspec.yml 測試與部署自動化

前面提到的 AWS CodeBuild 就是會使用到這個buildspec.yml檔案,會有兩種檔案buildspec_test.ymlbuildspec_deploy.yml,是因為有兩種 stage,分別是測試和部署,分開來可以確保各自獨立,才不會發生測試沒過卻直接部署的慘案,當然可以透過 on-failure: ABORT 或是有嘟個環境,就算部署也只是測試站等等避免,但是各自獨立還是比較保險。

buildspec_test.yml

用在測試專案,會測試 linttest,具體執行方法和指令可以看上方的 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

上一篇
【Day 28】Data Pipeline MVP 環境實戰 - .env 和 docker-compose.override.yml
下一篇
【Day 30】完賽結語:一個人可以走很快,但一群人可以走很遠
系列文
我獨自升級:從水管工走向 DataOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言