在 CI/CD Pipeline中,程式碼的編譯與驗證是確保軟體品質的關鍵步驟。編譯型語言如 Java 和 C,需要先將原始碼編譯成可執行檔,而直譯型語言如 Python 則可以直接執行。因此,CI/CD Pipeline的組態會根據所使用的程式語言而有所不同。本文以 GitLab CI/CD 為例,示範如何建置 Java 和 C 語言專案的Pipeline,並說明如何使用 Maven 和 GCC 等工具進行編譯和驗證。此外,我們也會探討如何儲存編譯後的檔案,以便在後續的佈署階段使用。在 Java 專案中,我們使用 Maven 進行編譯,並將生成的 class 檔案儲存到 target 目錄。在 C 語言專案中,我們使用 GCC 進行編譯,並將生成的可執行檔儲存下來。透過這些步驟,我們可以確保在 CI/CD Pipeline中自動化地編譯、驗證和儲存程式碼,從而提高軟體開發的效率和品質。

在 CI/CD 管道中編譯與驗證程式碼

在現代軟體開發中,持續整合與持續佈署(CI/CD)已成為不可或缺的流程。CI/CD 管道不僅能加速開發週期,還能提升程式碼品質。本文將探討如何在 GitLab CI/CD 管道中編譯與驗證程式碼,特別是針對不同型別的程式語言。無論是編譯型語言還是解釋型語言,玄貓都會提供具體的實務案例及詳細解說。

編譯型與解釋型語言的差異

首先,我們需要理解編譯型與解釋型語言之間的差異。解釋型語言如 Python 或 Ruby,會直接執行原始程式碼。而編譯型語言如 Java、C 或 C#,則需要先將原始程式碼編譯成可執行的形式,然後再進行執行。

這一點在組態 CI/CD 管道時非常重要,因為如果你的專案包含任何編譯型語言的程式碼(即使只是部分),你通常需要在管道中加入編譯步驟。當然,有些驗證作業(如 Code Quality)可以直接檢查原始程式碼,這時編譯步驟就可以省略。

使用 javac 編譯 Java 程式碼

接下來,我們以 Java 為例,展示如何在 GitLab CI/CD 管道中編譯 Java 程式碼。Java 通常使用 javac 編譯器將 .java 檔案轉換為 .class 檔案。

建立 Java 應用程式

我們先建立一個簡單的 Java 應用程式。假設我們有一個包名為 com.hatsforcats 的單一檔案應用程式,並且我們使用 GitLab 的 Web IDE 編輯器來建立目錄和檔案。

package com.hatsforcats;
class Login {
    public static void main(String[] args) {
        System.out.println("歡迎來到 Hats for Cats!");
    }
}

組態管道

接下來,我們需要組態 GitLab CI/CD 管道來編譯這個 Java 應用程式。首先,在專案的根目錄中建立一個空的 .gitlab-ci.yml 檔案,並定義建構階段:

stages:
  - build

接著,定義一個建構階段中的工作(job),並指定使用 OpenJDK Docker 映像:

compile-java-with-javac:
  stage: build
  image: openjdk:latest

最後,在工作中指定編譯命令:

script:
  - javac src/com/hatsforcats/*.java -d target/

這樣就完成了基本的 Java 編譯組態。

內容解密:

  • stages: 定義管道的各個階段。
  • compile-java-with-javac: 一個名為 compile-java-with-javac 的工作。
  • stage: build: 指定這個工作屬於 build 階段。
  • image: openjdk:latest: 指定使用最新版本的 OpenJDK Docker 映像。
  • script: 在這個工作中執行的命令。
  • javac src/com/hatsforcats/*.java -d target/: 命令將所有 src/com/hatsforcats/ 資料夾中的 .java 檔案編譯到 target/ 資料夾。

驗證編譯結果

為了確保編譯成功,我們可以在 .gitlab-ci.yml 中新增一些額外的命令來檢查目標資料夾中的內容以及執行編譯後的程式碼:

script:
  - javac src/com/hatsforcats/*.java -d target/
  - ls target/com/hatsforcats
  - cd target
  - java com.hatsforcats.Login

內容解密:

  • ls target/com/hatsforcats: 輸出目標資料夾中的內容。
  • cd target: 轉換到目標資料夾。
  • java com.hatsforcats.Login: 執行編譯後的類別。

這樣,當你提交程式碼後,GitLab CI/CD 管道會自動執行這些命令來驗證編譯結果。

驗證結果

完成上述組態後,提交 .gitlab-ci.yml 檔案並觀察管道執行情況。成功執行後應該會看到類別似以下的輸出:

$ javac src/com/hatsforcats/*.java -d target/
$ ls target/com/hatsforcats
Login.class
$ cd target
$ java com.hatsforcats.Login
歡迎來到 Hats for Cats!

這表示 javac 命令成功執行、生成了 .class 檔案並且執行時產生了預期的輸出。

其他語言與工具

除了使用 javac 編譯 Java 外,還有許多其他方式和工具可以用來編譯不同語言的程式碼。例如,可以使用 Maven、Gradle 或 Ant。每種工具都有其特定的組態檔案和命令列引數。

@startuml
skinparam backgroundColor #FEFEFE

title CI/CD Pipeline中程式碼編譯與驗證技術

|開發者|
start
:提交程式碼;
:推送到 Git;

|CI 系統|
:觸發建置;
:執行單元測試;
:程式碼品質檢查;

if (測試通過?) then (是)
    :建置容器映像;
    :推送到 Registry;
else (否)
    :通知開發者;
    stop
endif

|CD 系統|
:部署到測試環境;
:執行整合測試;

if (驗證通過?) then (是)
    :部署到生產環境;
    :健康檢查;
    :完成部署;
else (否)
    :回滾變更;
endif

stop

@enduml

次段落標題:

此圖示展示了使用 Maven 編譯 Java 原始碼的流程。

提升技術深度及未來趨勢

在現代軟體開發中,CI/CD 不僅僅是自動化流程,更是提升程式碼品質和開發效率的關鍵。隨著技術的不斷進步,未來可能會出現更多新工具和方法來簡化和強化 CI/CD 流程。

Java 專案在 CI/CD Pipeline中的建置與驗證

在現代軟體開發中,CI/CD(持續整合與持續佈署)Pipeline已成為必不可少的工具,能夠大幅提升開發效率與程式碼品質。以 Java 為例,我們可以透過 GitLab CI/CD 的功能來自動化建置與驗證 Java 專案。以下是詳細的步驟與技術選型分析。

新增 Java 程式碼

首先,我們需要在 GitLab 專案中新增一個 Java 檔案。假設我們要新增一個簡單的 Login.java 檔案,內容如下:

package com.hatsforcats;

class Login {
    public static void main(String[] args) {
        System.out.println("Welcome to Hats for Cats!");
    }
}

內容解密:

這段程式碼定義了一個簡單的 Java 類別 Login,並包含一個 main 方法。當這個方法執行時,會輸出 “Welcome to Hats for Cats!” 的訊息。

組態 CI/CD Pipeline

接下來,我們需要組態 GitLab 的 CI/CD Pipeline。這裡我們使用 Maven 作為建置工具。在專案根目錄下新增或更新 .gitlab-ci.yml 檔案,內容如下:

stages:
  - build

compile-java-with-maven:
  stage: build
  image: maven:latest
  script:
    - mvn compile
    - ls target/classes/com/hatsforcats
    - cd target/classes
    - java com.hatsforcats.Login

內容解密:

  • stages:定義了Pipeline的階段,這裡只有 build 一個階段。
  • compile-java-with-maven:定義了一個名為 compile-java-with-maven 的工作。
  • image: maven:latest:指定了使用最新的 Maven Docker 映像來執行這個工作。
  • script:包含了一系列命令,用於編譯 Java 程式碼並執行編譯後的類別。

驗證建置結果

在提交這些組態後,GitLab 會自動觸發Pipeline並執行編譯工作。我們可以在 GitLab 的管道頁面中檢視建置結果。以下是成功建置後的輸出片段:

[INFO] Compiling 1 source file to /builds/cwcowell/hats-for-cats/target/classes
[INFO] 
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
[INFO] BUILD SUCCESS
[INFO] 
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
[INFO] Total time: 4.069 s
[INFO] Finished at: 2022-04-11T21:22:28Z
$ ls target/classes/com/hatsforcats
Login.class
$ cd target/classes
$ java com.hatsforcats.Login
Welcome to Hats for Cats!

內容解密:

  • [INFO] Compiling...:顯示 Maven 在編譯程式碼。
  • [INFO] BUILD SUCCESS:表示編譯成功。
  • $ ls target/classes/com/hatsforcats:列出編譯後的類別檔案。
  • $ java com.hatsforcats.Login:執行編譯後的類別檔案並輸出 “Welcome to Hats for Cats!"。

C 語言專案的建置與驗證

除了 Java 外,C 語言也是常見的開發語言。以下是如何使用 GCC(GNU 編譯器集合)來在 CI/CD Pipeline中建置與驗證 C 語言專案。

新增 C 應用程式

首先,我們在專案根目錄下新增一個 login.c 檔案,內容如下:

#include <stdio.h>

int main(void) {
    puts("Welcome to Hats for Cats!");
    return 0;
}

內容解密:

這段程式碼定義了一個簡單的 C 函式 main,當這個函式執行時,會輸出 “Welcome to Hats for Cats!” 的訊息。

組態 CI/CD Pipeline

接下來,我們需要組態 GitLab 的 CI/CD Pipeline來編譯 C 語言程式碼。在 .gitlab-ci.yml 檔案中新增以下組態:

stages:
  - build

compile-c:
  stage: build
  image: gcc:latest
  script:
    - gcc login.c -o login
    - ./login

內容解密:

  • compile-c:定義了一個名為 compile-c 的工作。
  • image: gcc:latest:指定了使用最新的 GCC Docker 映像來執行這個工作。
  • script:包含了一系列命令,用於編譯 C 原始碼並執行編譯後的可執行檔。

驗證建置結果

在提交這些組態後,GitLab 會自動觸發Pipeline並執行編譯工作。以下是成功建置後的輸出片段:

$ gcc login.c -o login
$ ./login
Welcome to Hats for Cats!

內容解密:

  • $ gcc login.c -o login:使用 GCC 編譯 login.c 檔案並生成可執行檔 login
  • $ ./login:執行編譯後的可執行檔並輸出 “Welcome to Hats for Cats!"。

儲存構建後的檔案作為藝品

在 CI/CD Pipeline中,每個工作都在自己的獨立環境中執行。為了讓後續工作能夠使用前一步所生成的檔案,我們可以使用 artifacts 命令來儲存這些檔案。例如,要儲存 compile-c 工作生成的可執行檔 login,可以在 .gitlab-ci.yml 中新增以下組態:

artifacts:
  paths:
    - login

若是要儲存 Maven 編譯後的類別檔案目錄內容時:

artifacts:
 paths:
   - target/classes/
 exclude:
   - target/classes/**/Test*
小段落標題之「儲存之目的」

儘管此處僅展示基本應用情境、藝品之設定及基本之排除條件標準。

點選「此圖示」進一步觀察其原理圖示(僅供參考):該圖示代表不同職位與相關藝品資源之間連結情況(僅供參考):
graph TD;
A[Compile-Java-with-Maven Job] --> B[Build-Success];
B --> C[Artifacts];
C --> D[Preserve Compiled Classes];
D --> E[Test-Java Job];
E --> F[Test-Success];

G[Compile-C Job] --> H[Compile-Success];
H --> I[Artifacts];
I --> J[Preserve Executable File];
J --> K[Run Executable];
K --> L[Run-Success];
接續觀察「此圖示」展示其原理圖示(僅供參考):該圖示代表不同職位與相關藝品資源之間連結情況(僅供參考):
graph TD;
A["Java Application"]
B["Maven Docker Image"]
C["Compile-Java Job"]
D["Compiled Classes"]
E["Preserve Artifacts"]
F["Test-Java Job"]

A -.-> |Code Addition| C;
B -.-> |Image Usage| C;
C -.-> |Output| D;
D -.-> |Artifact Preservation| E;
E -.-> |Artifact Availability| F;

G["C Application"]
H["GCC Docker Image"]
I["Compile-C Job"]
J["Executable File"]
K["Preserve Artifacts"]
L["Run Executable"]

G -.-> |Code Addition| I;
H -.-> |Image Usage| I;
I -.-> |Output| J;
J -.-> |Artifact Preservation| K;
K -.-> |Artifact Availability| L;

接續上方圖示觀察,「此圖示」以其他方式展示連結情況(僅供參考):

graph TD;
A["GitLab Pipeline"] --> B["Java Build"];
A --> C["C Build"];

B --> D["Maven Compile"];
B --> E["Test Java"];

C --> F["GCC Compile"];
C --> G["Run Executable"];

D --> H["Artifact Preservation"];
E --> I["Test Success"];

F --> J["Artifact Preservation"];
G --> K["Run Success"];

玄貓以「此圖示」分別展示其過程中的各節點與其相關之依賴性連結及流程概要(僅供參考)。

玄貓以「此圖示」展示各節點之間連結所產生之影響(僅供參考)。