這一年在開發專案的過程中,我越來越常碰到跟「部署」有關的事。
有時是在幫公司調整伺服器設定,有時是在自己專案裡測試 Docker、Nginx。
後來我才意識到,這些工作其實都有個共通的名字 —— DevOps。
今天這篇是我這個菜雞瞭解 DevOps 的學習筆記,
最簡單的說法:
DevOps 是讓服務能持續、穩定、自動化地運作與交付的一整套文化與實踐。
「寫完」程式只是開始。
真正的挑戰是——怎麼讓它一直跑、能更新、不中斷、能回滾。
而這些事正是 DevOps 的範圍,包括:
這幾天因為連假,環境與基礎建設做到一半(把專案丟到 EC2 上並且跑起來)
其實那只是 DevOps 的第一步驟。
CI/CD 是 DevOps 的基礎與起點,為 CI 持續整合 及 CD 持續佈署的組合。
CI 的核心思想是:越早發現錯誤越好。
每當開發者 push 新程式碼時,CI 會自動執行一系列檢查:
CI 的目的不是上線,而是確保程式碼能安全地整合到主分支。
這樣能減少「我電腦可以跑,伺服器不能跑」的情況。
當 CI 通過後,接下來要做的事就是:讓它自動上線。
這就是 CD 要負責的部分。
它會:
用一句話說,CD 就是:
讓上線變成「日常的一部分」,而不是「一場大冒險,出錯就爆開」。
假設這裡有一個 Spring Boot API 服務,放在 GitHub,部署在 EC2 上,
使用 Docker Compose 管理容器。
開發者提交程式碼
push 到 GitHub 的 main 分支。
GitHub Actions 啟動 CI
mvn clean package)CD 階段:自動部署
推送 image 到 Docker Hub
SSH 到 EC2,自動執行:
docker-compose pull
docker-compose up -d
幾分鐘內更新線上版本。
name: Simple CI/CD Pipeline
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build project
run: mvn clean package -DskipTests
- name: Build Docker image
run: docker build -t example/api:latest .
- name: Push to Docker Hub
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker push example/api:latest
- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd /home/ubuntu/api
docker-compose pull
docker-compose up -d
這樣的 pipeline 即使是一人開發的專案也能使用。
你只要:
就能讓每次 push 變成一次完整的「測試+部署」。
我覺得 DevOps 是一個充滿新錯誤、新問題的領域,雖然在我知道它的名字之前我就在做DevOps工作。
但實際上眉角很多,真的不是一個可以簡單上手的工作。
然後比起單純打 Code,DevOps 的工作內容感覺更接近產品的「真實世界」,我們可以茶餘飯後討論一下某段 Code 的效能如何如何,有空再來修還是怎樣,但 DevOps 在看相關的問題時是更嚴肅的,其工作會直接影響系統的運作。
本來 DevOps 相關的工作/測試可以在公司的測試環境玩,但現在有 MyMomentum 這個東東,DevOps 做得好不好會直接影響到我自己,是個很好的時機來好好的學一下 DevOps 的東西
今天連假第二天,還是以學習筆記為主,專案沒有推進,祝大家連假快樂。