在現今軟體開發流程中,CI/CD 已成為不可或缺的一環,能有效提升程式碼品質和佈署效率。本文將著重於 GitLab CI/CD 環境下,如何編譯和驗證 Java 與 C 語言程式碼。首先,針對編譯型語言(如 Java、C)與直譯式語言(如 Python、Ruby)的特性差異進行說明,並解釋其在 CI/CD 組態上的影響。接著,以 Java 為例,示範使用 javac 和 Maven 兩種方式進行編譯,並比較其優劣。對於 C 語言,則會說明如何使用 GCC 編譯器進行編譯和執行。最後,文章還會介紹如何在 GitLab CI/CD 中使用 artifacts 儲存建置產物,方便後續流程使用。這些步驟將搭配實際程式碼範例和 .gitlab-ci.yml 組態說明,讓讀者能快速上手,並應用於實際專案中。

使用 CI/CD 管道來編譯與驗證程式碼

在現代軟體開發中,CI/CD(持續整合與持續佈署)管道是一個關鍵的工具,用來自動化編譯、測試和佈署程式碼。無論你的專案是使用解釋型語言還是編譯型語言,CI/CD 管道都能幫助你確保程式碼的品質和穩定性。本文將探討如何在 GitLab 中組態 CI/CD 管道來編譯和驗證 Java 程式碼。

編譯型語言與解釋型語言的區別

首先,玄貓想要強調的是,瞭解編譯型語言和解釋型語言之間的區別對於組態 CI/CD 管道至關重要。解釋型語言如 Python 或 Ruby,直接執行原始碼;而編譯型語言如 Java、C 或 C#,則需要將原始碼編譯成可執行的形式後才能執行。這意味著,如果你的專案中包含任何編譯型語言的程式碼,你可能需要在管道中新增一個建構作業來生成可執行的二進位制檔案。

Java 編譯器 javac 的使用

讓我們從最基本的方法開始,使用 Java 編譯器 javac 來編譯 Java 原始碼。以下是一個簡單的範例,展示如何在 GitLab CI/CD 管道中組態 javac

建立 Java 應用程式

首先,我們建立一個簡單的 Java 應用程式。這個應用程式包含一個名為 Login.java 的檔案,內容如下:

package com.hatsforcats;

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

將這段程式碼儲存到 src/com/hatsforcats/ 目錄下。

組態 GitLab CI/CD 管道

接下來,我們需要組態 .gitlab-ci.yml 檔案來定義建構階段和作業。以下是完整的組態:

stages:
  - build

compile-java-with-javac:
  stage: build
  image: openjdk:latest
  script:
    - javac src/com/hatsforcats/*.java -d target/
    - ls target/com/hatsforcats
    - cd target
    - java com.hatsforcats.Login

這段組態做了以下幾件事:

  1. 定義階段:設定了一個名為 build 的階段。
  2. 定義作業:設定了一個名為 compile-java-with-javac 的作業,並指定其執行在 build 階段。
  3. 指定 Docker 畫素:使用 openjdk:latest 作為執行環境。
  4. 執行指令碼:使用 javac 編譯 Java 原始碼,並生成目標目錄中的類別檔案。接著列出目標目錄中的內容,並執行編譯後的類別檔案以驗證編譯成功。

內容解密:

  1. 定義階段:在 .gitlab-ci.yml 中使用 stages 鍵字定義了一個名為 build 的階段。這表示所有與建構相關的作業都會在此階段執行。
  2. 定義作業:使用 compile-java-with-javac 作為作業名稱,並將其放置在 build 階段中。這樣可以確保這個作業在建構階段執行。
  3. 指定 Docker 畫素:利用 image: openjdk:latest 指令告訴 GitLab 在 Docker 中使用最新版本的 OpenJDK 作為執行環境。這樣可以確保 javac 編譯器可用。
  4. 執行指令碼:在 script 段落中列出了要執行的命令:
    • javac src/com/hatsforcats/*.java -d target/: 編譯所有位於 src/com/hatsforcats/ 目錄中的 Java 原始碼檔案,並將生成的類別檔案放入 target/ 目錄。
    • ls target/com/hatsforcats: 列出生成的類別檔案以驗證編譯成功。
    • cd target: 切換到目標目錄。
    • java com.hatsforcats.Login: 執行編譯後的類別檔案以確認其正常執行。

Maven 編譯工具

除了直接使用 javac 編譯器外,Maven 是另一種強大的工具,可以管理依賴、編譯原始碼、執行自動化測試等。以下是如何使用 Maven 在 GitLab CI/CD 管道中進行編譯。

組態 Maven

首先,我們需要建立一個名為 pom.xml 的檔案來組態 Maven。以下是基本的內容:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.hatsforcats</groupId>
    <artifactId>login</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
</project>

組態 GitLab CI/CD 管道

接下來,我們需要修改 .gitlab-ci.yml 檔案來使用 Maven 編譯我們的 Java 應用程式。以下是完整的組態:

stages:
  - build

compile-java-with-maven:
  stage: build
  image: maven:latest
  script:
    - mvn clean package

內容解密:

  1. 定義階段:與前面相同,設定了一個名為 build 的階段。
  2. 定義作業:設定了一個名為 compile-java-with-maven 的作業,並指定其執行在 build 階段。
  3. 指定 Docker 畫素:使用 maven:latest 作為執行環境,確保 Maven 工具可用。
  4. 執行指令碼:在 script 段落中列出了要執行的命令:
    • mvn clean package: 清理之前的建構結果並封裝專案。這會根據 pom.xml 組態進行依賴管理、編譯原始碼等操作。

Maven 與 javac 的選擇

選擇何種方法取決於專案需求和團隊習慣。如果你只有一小部分程式碼需要編譯且希望簡單快速地進行建構測試時,可以選擇直接使用 javac;但如果專案較大且需要管理複雜依賴時,Maven 是更好的選擇。

特殊情況處理:

  1. 編寫邏輯及設計考量
    • 在 Mavan 中需要考慮版本相容性問題(例如:maven.compiler.source 和 maven.compiler.target),這可以避免因版本不比對導致編誤問題。
    • 在 javac 中如果專案增加複雜度時則可能需要參考 Maven 的封裝功能而非直接呼叫 javac 編譯命令。

技術選型分析及未來趨勢預測

玄貓認為,GitLab CI/CD 是目前最流行且功能強大的一套自動化工具之一。它不僅支援多種語言和工具,還可以靈活地組態各種自動化任務。未來趨勢可能會向更多根據雲端技術以及更智慧化的一站式自動化方向發展。例如:AI機器學習 技術將可能被更廣泛地應用於自動化測試和程式碼分析之中。

使用 GitLab CI/CD 編譯與測試 Java 和 C 語言的程式碼

在現代軟體開發中,持續整合與持續佈署(CI/CD)已成為不可或缺的部分。本文將探討如何使用 GitLab CI/CD 來編譯和測試 Java 和 C 語言的程式碼,並提供具體的範例和詳細解說。

編譯與測試 Java 程式碼

首先,我們從編譯和測試 Java 程式碼開始。假設你已經有一個 GitLab 專案,並且你希望將一個簡單的 Java 應用程式加入到這個專案中。

加入 Java 應用程式

在你的專案目錄中,建立一個新的目錄 src/com/hatsforcats/,並在其中新增一個名為 Login.java 的檔案。以下是這個檔案的內容:

package com.hatsforcats;

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

組態 CI/CD Pipeline

接下來,你需要組態 .gitlab-ci.yml 檔案來定義你的 CI/CD Pipeline。如果你已經有一個現有的 .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

這段組態定義了一個名為 compile-java-with-maven 的工作階段,該階段使用 Maven 的 Docker 構建環境來編譯 Java 程式碼。以下是這些步驟的詳細解說:

  1. image: maven:latest:這行指定了 Docker 構建環境為最新的 Maven。
  2. script:這段指令碼包含了一系列命令:
    • mvn compile:使用 Maven 編譯 Java 原始碼。
    • ls target/classes/com/hatsforcats:列出編譯後的類別檔案。
    • cd target/classes:切換到編譯後的類別檔案目錄。
    • java com.hatsforcats.Login:執行編譯後的 Java 類別。

完成後,提交這些更改到 GitLab,Pipelines 自動觸發並執行上述步驟。

編譯結果檢查

當編譯完成後,你應該會看到類別似以下的輸出:

[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
[INFO] 
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
$ ls target/classes/com/hatsforcats
Login.class
$ cd target/classes
$ java com.hatsforcats.Login
歡迎來到 Hats for Cats!

這些輸出顯示了編譯成功並且執行時顯示了預期的輸出。

編譯與測試 C 語言程式碼

接下來,我們來看如何使用 GCC 編譯 C 語言程式碼。與 Java 不同,C 語言通常使用 Make 或其他構建工具來構建專案,但這裡我們將直接使用 GCC 來保持範例簡單。

加入 C 應用程式

在你的專案根目錄中,新增一個名為 login.c 的檔案,並在其中新增以下內容:

#include <stdio.h>

int main(void) {
    puts("歡迎來到 Hats for Cats!");
    return 0;
}

組態 CI/CD Pipeline

接下來,組態 .gitlab-ci.yml 檔案來定義 GCC 編譯 C 語言程式碼的 Pipeline。以下是組態內容:

stages:
  - build

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

這段組態定義了一個名為 compile-c 的工作階段,該階段使用 GCC 的 Docker 構建環境來編譯 C 語言程式碼。以下是這些步驟的詳細解說:

  1. image: gcc:latest:這行指定了 Docker 構建環境為最新的 GCC。
  2. script:這段指令碼包含了一系列命令:
    • gcc login.c -o login:使用 GCC 編譯 login.c 檔案並生成可執行檔 login
    • ./login:執行生成的可執行檔。

完成後,提交這些更改到 GitLab,Pipelines 自動觸發並執行上述步驟。

編譯結果檢查

當編譯完成後,你應該會看到類別似以下的輸出:

$ gcc login.c -o login
$ ./login
歡迎來到 Hats for Cats!

這些輸出顯示了編譯成功並且執行時顯示了預期的輸出。

儲存構建產物為 Artifacts

在 CI/CD Pipeline 中,每個工作階段都在自己的獨立環境中執行。因此,如果你在一個工作階段中構建了檔案,而後續工作階段需要使用這些檔案時,就需要特別處理。這時候就需要使用 artifacts 鍵字。

例如,要儲存在 compile-c 工作階段中生成的可執行檔 login ,可以在工作階段定義中新增以下內容:

artifacts:
  paths:
    - login

或者儲存 Maven 生成的所有類別檔案目錄:

artifacts:
  paths:
    - target/classes/
  exclude:
    - target/classes/**/Test*

這樣可以確保在後續工作階段中能夠存取和使用之前構建產生的檔案。