iT邦幫忙

2025 iThome 鐵人賽

DAY 29
0

這一年在開發專案的過程中,我越來越常碰到跟「部署」有關的事。

有時是在幫公司調整伺服器設定,有時是在自己專案裡測試 Docker、Nginx。

後來我才意識到,這些工作其實都有個共通的名字 —— DevOps

今天這篇是我這個菜雞瞭解 DevOps 的學習筆記,


一、什麼是 DevOps?

最簡單的說法:

DevOps 是讓服務能持續、穩定、自動化地運作與交付的一整套文化與實踐。

「寫完」程式只是開始。

真正的挑戰是——怎麼讓它一直跑、能更新、不中斷、能回滾

而這些事正是 DevOps 的範圍,包括:

  • 環境與基礎建設管理(Infrastructure as Code)
  • 自動化部署流程(CI/CD)
  • 系統監控與日誌收集(Monitoring & Logging)
  • 部署策略與流量切換(Deployment Strategy)

這幾天因為連假,環境與基礎建設做到一半(把專案丟到 EC2 上並且跑起來)

其實那只是 DevOps 的第一步驟。


二、CI / CD 是什麼?

CI/CD 是 DevOps 的基礎與起點,為 CI 持續整合 及 CD 持續佈署的組合。

CI(Continuous Integration,持續整合)

CI 的核心思想是:越早發現錯誤越好。

每當開發者 push 新程式碼時,CI 會自動執行一系列檢查:

  • 拉取最新程式碼(例如從 GitHub main 分支)
  • 建置專案(compile、打包)
  • 執行測試(單元測試 / 整合測試)
  • 靜態分析(程式碼品質、格式)
  • 通知結果(測試失敗會自動發通知)

CI 的目的不是上線,而是確保程式碼能安全地整合到主分支

這樣能減少「我電腦可以跑,伺服器不能跑」的情況。


CD(Continuous Delivery / Deployment,持續交付 / 部署)

當 CI 通過後,接下來要做的事就是:讓它自動上線

這就是 CD 要負責的部分。

它會:

  • 自動打包成 Docker image
  • 上傳到伺服器或容器平台(例如 EC2、ECS、Kubernetes)
  • 自動更新服務
  • 發布成功或失敗的通知

用一句話說,CD 就是:

讓上線變成「日常的一部分」,而不是「一場大冒險,出錯就爆開」。


三、實作例子:一條理想的 CI/CD 流程

假設這裡有一個 Spring Boot API 服務,放在 GitHub,部署在 EC2 上,

使用 Docker Compose 管理容器。

🧠 流程設計

  1. 開發者提交程式碼

    push 到 GitHub 的 main 分支。

  2. GitHub Actions 啟動 CI

    • 自動建置(mvn clean package
    • 執行測試
    • 打包成 Docker image
  3. CD 階段:自動部署

    • 推送 image 到 Docker Hub

    • SSH 到 EC2,自動執行:

      docker-compose pull
      docker-compose up -d
      
    • 幾分鐘內更新線上版本。


⚙️ Pipeline 範例(GitHub Actions)

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 即使是一人開發的專案也能使用。

你只要:

  • 建好 Dockerfile
  • 把伺服器設定好(EC2 + Docker Compose)
  • 設定 GitHub Secrets

就能讓每次 push 變成一次完整的「測試+部署」。


✅ 帶來的好處

  • 自動化測試,防止錯誤被上線
  • 節省重複工作,減少人為操作
  • 建立部署紀錄,方便追蹤版本
  • 最重要的:部署不再是壓力,而是日常

四、學 DevOps 的感覺

我覺得 DevOps 是一個充滿新錯誤、新問題的領域,雖然在我知道它的名字之前我就在做DevOps工作。

但實際上眉角很多,真的不是一個可以簡單上手的工作。

然後比起單純打 Code,DevOps 的工作內容感覺更接近產品的「真實世界」,我們可以茶餘飯後討論一下某段 Code 的效能如何如何,有空再來修還是怎樣,但 DevOps 在看相關的問題時是更嚴肅的,其工作會直接影響系統的運作。


結語

本來 DevOps 相關的工作/測試可以在公司的測試環境玩,但現在有 MyMomentum 這個東東,DevOps 做得好不好會直接影響到我自己,是個很好的時機來好好的學一下 DevOps 的東西

今天連假第二天,還是以學習筆記為主,專案沒有推進,祝大家連假快樂。


上一篇
Day28:搞懂那些我看不懂的部署名詞
下一篇
Day30:鐵人賽的最後一天——從寫不懂的開始
系列文
我的時間到底去哪裡了!? – 個人時間數據系統開發挑戰30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言