iT邦幫忙

2023 iThome 鐵人賽

DAY 30
0
Mobile Development

Spring Boot+Android 30天 實戰開發 系列 第 30

【Day - 30】建立餐廳後台點餐應用06:結合GitLab CI/CD

  • 分享至 

  • xImage
  •  

引言

今天我們將探討如何使用 GitLab CI/CD 將我們的 Spring Boot 應用打包為 Docker Image,然後將它推送到 Docker Hub,最後透過 CI/CD 步驟將 Docker Hub 的Image更新到我們自己的伺服器上。這個過程將使我們的開發和部署流程更為自動化,提高效率並確保一致性。

2. CI/CD 簡介

什麼是 CI/CD?

CI/CD 是持續集成(Continuous Integration)和持續交付(Continuous Delivery)的縮寫,它們是現代軟體開發流程中的關鍵元素。讓我們深入了解這些概念:

  • 持續集成(CI)
    持續集成是一個開發實踐,旨在確保多個開發人員可以在同一專案上協同工作,而不會造成程式碼衝突或整合問題。它的主要特點包括:

    • 開發人員將其程式碼頻繁地提交到共享存儲庫。
    • 自動化測試套件會對每個提交的程式碼進行測試,以確保其品質。
    • 如果測試通過,則程式碼將整合到主分支,使所有開發人員都能夠訪問最新的程式碼。
    • 如果測試失敗,問題會儘早被發現和修復。
  • 持續交付(CD)
    持續交付擴展持續集成,確保軟體隨時可部署。主要特點包括:

    • 自動化構建和部署流程,以確保能夠生成可執行的軟體版本。
    • 自動化測試和驗證,以確保每個版本都是穩定和可用的。
    • 每個成功的構建都可以視情況自動部署到測試環境或預產品環境。
    • 減少了人為錯誤,並提高了軟體的可靠性。
  • 為什麼 CI/CD 對於軟體開發專案如此重要?
    CI/CD 在現代軟體開發專案中扮演了關鍵角色,具有以下重要性:

    1. 快速反饋和修復問題:CI/CD 流程使團隊能夠快速檢測和解決程式碼中的錯誤。當開發人員提交新程式碼時,自動化測試將立即運行,並提供即時反饋。這有助於確保問題在變得更加複雜之前就被修復了。
    2. 持續集成:CI 確保多個開發人員的程式碼能夠無縫集成,減少了合併衝突和整合問題的可能性。每個提交都被視為一個潛在的版本,並接受測試。
    3. 可重複的構建和部署:CI/CD 流程確保每次構建和部署都是自動化的,這意味著它們是可重複的。這消除了人為錯誤,並確保每個版本都是相同的,無論是在測試還是生產環境。
    4. 提高生產力:CI/CD 自動化了許多重複和耗時的任務,例如測試和部署。這使開發團隊能夠專注於創建新功能,而不是手動執行這些任務。
    5. 更快的交付速度:CI/CD 支持快速且可預測的軟體交付。開發人員可以隨時準備好部署新功能,而不需要等待長時間的整合和測試過程。

總之,CI/CD 是現代軟體開發中不可或缺的一部分,它有助於提高團隊的效率、軟體的品質,並實現更快速的交付,這對於滿足不斷變化的用戶需求至關重要。在接下來的部分,我們將深入探討如何在 GitLab 中實現 CI/CD 流程。

3. Spring Boot構建成Docker image

以下是一個 Spring Boot 應用程式的 Dockerfile 簡單範例:

Copy code
# 使用基於 OpenJDK 17 的 JRE 映像作為運行環境
FROM openjdk:17-jdk-alpine

# 設置工作目錄
WORKDIR /app

# 從構建環境中複製構建生成的 JAR 文件到容器
COPY app.jar ./app.jar

# 指定容器對外暴露的埠號
EXPOSE 8080

# 設置容器啟動命令
CMD ["java", "-jar", "app.jar"]

逐步解釋上述 Dockerfile 中的每個部分:

  • FROM openjdk:17-jdk-alpine:這是基礎映像的選擇,我們使用的是基於 OpenJDK 17 的 Alpine Linux 映像。Alpine Linux 是一個輕量級的 Linux 發行版,適合用於 Docker 容器。
  • WORKDIR /app:這個指令設置容器的工作目錄,即我們後續命令的執行目錄。
  • COPY app.jar ./app.jar:此指令複製在構建環境中生成的 Spring Boot JAR 文件(通常稱為 app.jar)到容器中的/app目錄。這是將應用程式程式碼複製到容器內的步驟。
  • EXPOSE 8080:這個指令宣告容器將監聽的埠號。在這種情況下,我們宣告 Spring Boot 應用程式在容器內監聽 8080 埠號。
  • CMD ["java", "-jar", "app.jar"]:最後,這是容器啟動命令。它告訴容器在運行時執行java -jar app.jar,這將啟動我們的 Spring Boot 應用程式。

4. 運行Gitlab CI/CD

GitLab CI/CD 是 GitLab 的一個功能,它允許您定義和運行自動化的測試和部署流程。以下是一些基本概念:

  • .gitlab-ci.yml文件:這是 CI/CD 流程的定義文件,通常位於您的項目根目錄中。它包含了階段(stages)和任務(jobs)的定義,以及執行這些任務所需的配置。
  • Gitlab Runner:Runner 是實際執行 CI/CD 流程的實例。Runner 可以是共享的 GitLab Runner,也可以是您自己的私有 Runner。Runner 可以運行在不同的執行者(Executors)上,例如 PowerShell 或 Docker。

4.1 設置 GitLab CI/CD 流程

現在,讓我們來看看如何設置 GitLab CI/CD 流程。

步驟一:創建 .gitlab-ci.yml 文件

在您的項目根目錄下,創建一個名為 .gitlab-ci.yml 的文件。這個文件將包含您的 CI/CD 流程的定義。

.gitlab-ci.yml 文件中,您可以定義多個階段和任務。每個階段可以包含一系列任務,而每個任務代表一個具體的操作。例如,一個典型的 CI/CD 流程可能包括以下階段:

  • 構建(build):編譯程式碼、打包應用程式等。
  • 測試(test):運行單元測試、集成測試等。
  • 部署(deploy):將應用程式部署到目標環境、配置伺服器等。
    每個階段中的任務由一個或多個 jobs 定義,每個 job 都描述了要執行的命令和操作。

以下是簡單示例

# 定義全局變數
variables:
  DOCKER_HUB_REPO: ian2022che/ros-1  # Docker Hub 倉庫名稱
  IMAGE_TAG: latest  # Docker Image標籤

stages: # 定義階段
  - build
  - test
  - deploy

# 構建階段
build:
  stage: build
  image: maven:3.8.5-openjdk-17  # 使用 Maven image作為構建環境
  script:
    - mvn clean package -DskipTests # 打包應用程式為JAR檔
    - mkdir -p /app/target  # 創建目標目錄
    - cp target/*.jar /app/target  # 複製 JAR 文件到目標目錄
  artifacts:
    paths:
      - target/*.jar

# 單元測試階段
test:
  stage: test
  image: maven:3.8.5-openjdk-17   # 使用 Maven image作為構建環境
  script:
    - echo "Running test script" # 執行單元測試,這裡只是簡單打印沒有實際運行單元測試  

# 部屬階段
deploy:
  stage: deploy
  image: docker:latest
  services:
    - docker:dind  # 使用 Docker-in-Docker 服務
  before_script:
    - echo $DOCKER_HUB_PASSWORD | docker login -u $DOCKER_HUB_USERNAME --password-stdin  # 登入到 Docker Hub
  script:
    - cp target/*.jar app.jar  # 複製構建階段生成的 .jar 文件到部屬階段的工作目錄
    - docker build -t $DOCKER_HUB_REPO:$IMAGE_TAG .  # 構建 Docker Image
    - docker push $DOCKER_HUB_REPO:$IMAGE_TAG  # 上傳Image到 Docker Hub

步驟二:配置 Runner

Runner 是執行 CI/CD 流程的關鍵。在 GitLab 中,您可以配置 Runner 並將其與您的項目關聯。以下是配置 Runner 的一些關鍵步驟:

  1. 創建 GitLab Runner
    首先,您需要在 GitLab 中創建一個 Runner。這可以通過以下步驟完成:

    • 登入到 GitLab,並導航到您的項目
    • 在左側菜單中,選擇 "Settings"。
    • 在頁面上方的選項卡中,選擇 "CI/CD"。
    • 在 "Runners" 部分,單擊 "Set up a specific Runner manually"。
    • 在 "Runner setup" 頁面中,複製 "Registration token",這將在後續步驟中使用。
      圖片無法顯示
  2. 安裝和運行容器 Runner
    GitLab Runner 可以運行在不同的執行者上,例如 Docker。以下是安裝和運行容器 Runner 的步驟:
    (1) 下載 GitLab Runner 映像:

    docker pull gitlab/gitlab-runner:latest
    

    (2) 運行容器作為 Runner。在下面的命令中,我們將配置容器 Runner 使用 Docker-in-Docker 服務。

    docker run -d --name my-gitlab-runner --restart always 
      -v /var/run/docker.sock:/var/run/docker.sock 
      -v /path/to/config:/etc/gitlab-runner 
      gitlab/gitlab-runner:latest 
    
  3. 配置 Runner
    最後,您需要配置 Runner 以連接到 GitLab 並註冊自己。在終端或命令提示符中,運行以下命令:

    docker exec -it my-gitlab-runner gitlab-runner register
    

    在註冊過程中,您需要提供以下信息:

    • "URL":GitLab 的 URL。
    • "Registration token":剛才複製的註冊令牌。
    • "Description":為 Runner 提供一個描述,以便在 GitLab 中識別它。
      根據需要配置其他選項,例如標籤和執行器類型。

成功註冊後,您的 Runner 將準備好執行項目的 CI/CD 流程。當你將程式碼推送到Gitlab上,就可以在 GitLab 的 CI/CD 頁面中看到相關的運行記錄。
圖片無法顯示


上一篇
【Day - 29】建立餐廳後台點餐應用05:結合Google Charts實作營業分析功能
系列文
Spring Boot+Android 30天 實戰開發 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言