今天我們將探討如何使用 GitLab CI/CD 將我們的 Spring Boot 應用打包為 Docker Image,然後將它推送到 Docker Hub,最後透過 CI/CD 步驟將 Docker Hub 的Image更新到我們自己的伺服器上。這個過程將使我們的開發和部署流程更為自動化,提高效率並確保一致性。
CI/CD 是持續集成(Continuous Integration)和持續交付(Continuous Delivery)的縮寫,它們是現代軟體開發流程中的關鍵元素。讓我們深入了解這些概念:
持續集成(CI)
持續集成是一個開發實踐,旨在確保多個開發人員可以在同一專案上協同工作,而不會造成程式碼衝突或整合問題。它的主要特點包括:
持續交付(CD)
持續交付擴展持續集成,確保軟體隨時可部署。主要特點包括:
為什麼 CI/CD 對於軟體開發專案如此重要?
CI/CD 在現代軟體開發專案中扮演了關鍵角色,具有以下重要性:
總之,CI/CD 是現代軟體開發中不可或缺的一部分,它有助於提高團隊的效率、軟體的品質,並實現更快速的交付,這對於滿足不斷變化的用戶需求至關重要。在接下來的部分,我們將深入探討如何在 GitLab 中實現 CI/CD 流程。
以下是一個 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 應用程式。GitLab CI/CD 是 GitLab 的一個功能,它允許您定義和運行自動化的測試和部署流程。以下是一些基本概念:
.gitlab-ci.yml
文件:這是 CI/CD 流程的定義文件,通常位於您的項目根目錄中。它包含了階段(stages)和任務(jobs)的定義,以及執行這些任務所需的配置。現在,讓我們來看看如何設置 GitLab CI/CD 流程。
.gitlab-ci.yml
文件在您的項目根目錄下,創建一個名為 .gitlab-ci.yml
的文件。這個文件將包含您的 CI/CD 流程的定義。
在 .gitlab-ci.yml
文件中,您可以定義多個階段和任務。每個階段可以包含一系列任務,而每個任務代表一個具體的操作。例如,一個典型的 CI/CD 流程可能包括以下階段:
以下是簡單示例
# 定義全局變數
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 是執行 CI/CD 流程的關鍵。在 GitLab 中,您可以配置 Runner 並將其與您的項目關聯。以下是配置 Runner 的一些關鍵步驟:
創建 GitLab Runner
首先,您需要在 GitLab 中創建一個 Runner。這可以通過以下步驟完成:
安裝和運行容器 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
配置 Runner
最後,您需要配置 Runner 以連接到 GitLab 並註冊自己。在終端或命令提示符中,運行以下命令:
docker exec -it my-gitlab-runner gitlab-runner register
在註冊過程中,您需要提供以下信息:
成功註冊後,您的 Runner 將準備好執行項目的 CI/CD 流程。當你將程式碼推送到Gitlab上,就可以在 GitLab 的 CI/CD 頁面中看到相關的運行記錄。