GitHub Actions 自動 CI 測試 WorkFlow工作流搭建

大家好,我是此林。

代碼托管平臺 Github 我們應該比較熟悉。每次我們提交代碼到 GitHub 倉庫時,特別是開源項目,一般都會自動觸發測試腳本運行,幫你驗證代碼沒有引入新的錯誤。

這個其實就是?GitHub Actions,一般我們把 YAML 腳本定義在?.github/workflows 目錄下。

1.?什么是 GitHub Actions 自動 CI 測試?

GitHub Actions 是 GitHub 官方提供的一套自動化工作流服務,可以用來自動化代碼構建、測試、部署等流程。CI(持續集成,Continuous Integration)測試 是指在代碼每次提交或者合并請求時,自動運行項目的測試代碼,保證代碼的正確性和穩定性。

那為什么要用 GitHub Actions 自動 CI 測試?原因也很簡單:

  • 自動化:減少人工手動測試的工作,省時省力。

  • 快速反饋:提交代碼后馬上知道測試結果,發現問題及時修復。

  • 保障質量:避免有問題的代碼被合并進主分支,提升代碼質量。

  • 多平臺支持:可以在不同操作系統和環境下自動測試,比如 Windows、Linux、macOS。

  • 免費且無縫集成:直接集成在 GitHub 倉庫,無需額外配置第三方服務。

常見的 CI 測試比如:Node.js 項目跑 npm test、Python 項目跑 pytest、Java 項目跑 mvn test,還有Docker 鏡像構建和測試等等。

我們以 Seata 開源項目的 workflow s為例,作為講解。?

2. 整體結構

會看這個目錄結構:

1. build.yml

Seata 是個 Java 項目,這是 CI 主流程,主要的話包括:

  • 監聽分支和PR:當代碼被推送到 2.x, develop, master 分支,或者針對這幾個分支發起 Pull Request 時,會自動觸發這套構建和測試流程。

  • 自動運行多版本 Java 測試:針對 Java 8、17、21 三個版本分別跑測試,保證代碼兼容多個 JDK 版本。

  • 做代碼質量檢查:在 Java 8 環境下執行 Checkstyle、PMD、License 檢查。

  • 上傳代碼覆蓋率數據:通過 Codecov 上傳測試覆蓋率報告。

  • 支持 ARM 架構構建:額外有一個任務在 ARM64 架構的 Ubuntu 容器里構建項目(跳過測試),用于生成 ARM 平臺的二進制或包。

2. rerun-build.yml

這個配置是用來 自動重跑失敗的 workflow 構建 的,只有當 build?workflow 失敗,并且重試次數還沒達到 2 次時才執行。

3.?publish-docker.yml

自動構建并發布 Docker 鏡像到 DockerHub,針對三個不同版本的 Java(8、17、21)分別構建 Docker 鏡像。

4.?publish-ossrh.yml

將構建好的 Maven 包自動發布到 Maven Central(OSSRH 倉庫)。

5.?codeql-analysis.yml

CodeQL 是 GitHub 提供的代碼靜態分析工具,能夠掃描代碼中的安全漏洞、潛在缺陷和代碼質量問題。它在每周六的 19:36(UTC 時間)定時觸發一次全量掃描。

6. license-checker.yaml

簡單點說,這個腳本配置是用來檢查依賴 License 許可的,每個文件頭部都必須加上這段注釋。

5. test.yml、test-druid.yml、test-ubuntu.yml?

這個就不多說,只有在真正 Seata 發版的時候才會觸發,主要為多版本 Spring Boot 、多版本 Druid 測試專用,用于版本兼容性測試。

3. build.yml 詳解

下面,我們來細看 build.yml。

3.1?觸發條件

name: "build"

整個工作流的名稱,在 GitHub Actions 的界面上顯示。

on:push:branches: [ 2.x, develop, master ]

配置觸發條件,當 push2.xdevelopmaster 分支時觸發。

  pull_request:branches: [ 2.x, develop, master ]types: [opened, reopened, synchronize]

當有人向這些分支提交了 PR 時也會觸發 workflow,具體來說,比如這個 PR open了,或者close之后又 reopen了,synchronize 表示更新了 PR(如 rebase 后 push)。

    paths-ignore:- '**.md'

如果改動只是 Markdown 文件(例如 README.md)時?不觸發?這個工作流。

3.2 Jobs 概覽

真正 CI 的邏輯在兩個 job 里,job1 是 Java 構建和測試(多個 JDK 版本),job2 是 ARM64 編譯構建。我們重點看 job1。

services 里是啟動 Redis 和 Nacos 服務容器?,測試會用到。

然后操作系統為 Ubuntu 最新版。

strategy 里的含義:

  • 使用構建矩陣:分別用 Java 8、17、21 構建。

  • fail-fast: false 表示一個失敗不會立即取消其他并行任務。

?3.3. Steps 詳解

總共有八個 steps,我們一個一個看。

1.?拉取代碼

      - name: "Checkout"uses: actions/checkout@v3

2.?設置 Python 3.12(某些依賴或構建腳本可能用到)

      - name: "Use Python 3.x"uses: actions/setup-python@v2with:python-version: '3.12'

3.?設置 Java,版本用的就是之前 strategy 里定義的 matrx.java。

      - name: "Set up Java JDK"uses: actions/setup-java@v3.12.0with:distribution: 'zulu'java-version: ${{ matrix.java }}

4.?打印 Maven 版本

      - name: "Print maven version"run: ./mvnw -version

5.?Maven 緩存,提高構建速度,緩存 .m2 目錄。

      - name: "Restore local maven repository cache"uses: actions/cache/restore@v4id: cache-maven-repositorywith:path: ~/.m2/repositorykey: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ env.TODAY }}restore-keys: |${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}${{ runner.os }}-maven-

6.1 Java 8:完整測試 + PMD + License 代碼檢查

      - name: "Test, Check style, Check PMD, Check license with Maven and Java8"if: matrix.java == '8'run: |./mvnw -T 4C clean test \-Dcheckstyle.skip=false -Dpmd.skip=false -Dlicense.skip=false -DredisCaseEnabled=true \-e -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn;

6.2 Java 17 和 21:僅測試

      - name: "Test with Maven and Java${{ matrix.java }}"if: matrix.java != '8'run: |./mvnw -T 4C clean test \-e -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn;

7.?保存 Maven 緩存(如果前面沒命中緩存)

      - name: "Save local maven repository cache"uses: actions/cache/save@v4if: steps.cache-maven-repository.outputs.cache-hit != 'true'with:path: ~/.m2/repositorykey: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ env.TODAY }}

8.?上傳覆蓋率(只在 Java 8)

      - name: "Codecov"if: matrix.java == '8'uses: codecov/codecov-action@v4.0.1with:token: ${{ secrets.CODECOV_TOKEN }}version: v0.6.0env:CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

4. rerun-build.yml 詳解

這個在?build 的 workflow 失敗時,自動嘗試重新運行一次,最多嘗試 1 次。

on:workflow_run:workflows: ["build"]types:- completed

觸發條件:當 build 這個 workflow 執行“完成”(completed)后觸發,不管成功與否。

問:之前不是說失敗的時候才觸發嗎?

答:別急,后面 jobs 里會有 if 條件判斷。

Job 條件:

  • 只有當 build workflow 執行失敗(failure) 時才會觸發這個 job。

  • run_attempt 是執行次數,如果是第一次失敗就觸發(< 2,表示最多自動 retry 一次,防止死循環)。

操作系統還是?ubuntu-latest。

 - name: rerun ${{ github.event.workflow_run.id }}

?Step 名稱:會顯示在 Actions 的執行日志中。

        env:GH_REPO: ${{ github.repository }}GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

?設置環境變量:

  • GH_REPO:當前倉庫名

  • GH_TOKEN:自動注入的 GitHub Token,用于調用 GitHub CLI

        run: |gh run watch ${{ github.event.workflow_run.id }} > /dev/null 2>&1gh run rerun ${{ github.event.workflow_run.id }} --failed

執行腳本:

  • gh run watch:??等待 build workflow 的狀態穩定

  • gh run rerun:?只重跑失敗的 job(節省資源)

今天的分享就到這里了。

我是此林,關注我吧,帶你看不一樣的世界!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87998.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87998.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87998.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

0-機器學習簡介

有監督學習 目標&#xff1a;建立一個模型(函數)&#xff0c;來描述輸入(x)和輸出(y)之間的映射關系。 價值&#xff1a;模型訓練完成后&#xff0c;新的輸入&#xff0c;模型會給出預測值輸出。 注意點&#xff1a; 1.要有足夠的訓練樣本 2.輸入和輸出之間有關聯關系 3.輸入…

前端跨域解決方案(6):Nginx

1 Nginx 核心 Nginx 是一個開源的高性能 HTTP 和反向代理服務器&#xff0c;以輕量級、高并發處理能力和低資源消耗著稱。除作為 Web 服務器外&#xff0c;還可充當郵件代理服務器和通用的 TCP/UDP 代理服務器&#xff0c;廣泛應用于現代 Web 架構中。 在 Windows 系統中使用…

C++智能指針編程實例

智能指針是C11引入的重要特性&#xff0c;用于自動管理動態分配的內存&#xff0c;防止內存泄漏。下面介紹幾種高級智能指針編程實例。 1. 共享所有權模式 (shared_ptr) 循環引用問題及解決方案 #include <memory> #include <iostream>class B; // 前向聲明clas…

單元測試總結

一、測試方案: 單元測試方案應包括以下步驟: 1.理解代碼結構:仔細閱讀代碼,理解程序的結構、邏輯和算法。 2.制定測試目標:明確你想要測試的功能和輸出結果; 3.撰寫測試用例:編寫涵蓋所有測試目標的測試用例; 4.執行測試:運行測試用例以驗證功能的正確性; 5.編寫報告:根據測試…

Spring面向切面編程AOP(2)

前置通知&#xff08;Before Advice&#xff09; 前置通知在目標方法執行之前被調用&#xff0c;常用于執行一些預處理邏輯&#xff0c;例如權限驗證、參數校驗等。在 Spring 配置文件中&#xff0c;前置通知通過<aop:before>標簽進行配置&#xff0c;以下是一個典型的示…

設備故障預測與健康管理技術:從數據到決策的工業智能進化之路?

在工業 4.0 與智能制造浪潮的推動下&#xff0c;設備故障預測與健康管理&#xff08;Prognostics and Health Management, PHM&#xff09;技術已成為企業實現數字化轉型的核心驅動力。據統計&#xff0c;制造業中設備非計劃停機 1 小時的平均損失高達 25 萬美元&#xff0c;而…

RabbitMQ從入門到實踐:消息隊列核心原理與典型應用場景

在現代應用開發中&#xff0c;系統各部分之間的通信至關重要。這就是像RabbitMQ這樣的消息代理發揮作用的地方。無論您是在構建微服務架構、實現任務隊列&#xff0c;還是開發實時聊天應用程序&#xff0c;RabbitMQ都可能成為改變游戲規則的工具。本文將深入探討RabbitMQ是什么…

基于Spring Boot和Vue的網上軍事論壇設計與實現

目錄 一.&#x1f981;前言二.&#x1f981;開源代碼與組件使用情況說明三.&#x1f981;核心功能1. ?算法設計2. ?Java開發語言3. ?Redis數據庫4. ?部署項目 四.&#x1f981;演示效果1. 管理員模塊1.1 用戶管理1.2 內容審核1.3 權限分配1.4 菜單管理1.5 字典管理 2. 用戶…

LLMs基礎學習(八)強化學習專題(6)

LLMs基礎學習&#xff08;八&#xff09;強化學習專題&#xff08;6&#xff09; 文章目錄 LLMs基礎學習&#xff08;八&#xff09;強化學習專題&#xff08;6&#xff09;深度強化學習&#xff08;DQN&#xff09;DQN 起源&#xff1a;《Playing Atari with Deep Reinforceme…

JVM(10)——詳解Parallel垃圾回收器

Parallel 垃圾回收器&#xff08;也稱為 吞吐量優先收集器&#xff09;。它是 Java 早期&#xff08;特別是 JDK 8 及之前&#xff09;在多核處理器上的默認垃圾回收器&#xff0c;其核心設計目標是最大化應用程序的吞吐量。 一、Parallel 回收器的定位與設計目標 核心目標&am…

MySQL(91)什么是分布式數據庫?

分布式數據庫是一種將數據存儲在多個物理位置的數據庫系統。這些位置可能分布在不同的服務器、數據中心甚至地理位置。分布式數據庫系統允許數據的存儲、處理和訪問分布在多個節點上&#xff0c;以提高數據的可用性、可靠性、可擴展性和性能。 1. 分布式數據庫的特點 1.1 數據…

Java事務失效(面試題)的常見場景

1. 方法非public修飾 原理&#xff1a; Spring AOP代理&#xff08;CGLIB或JDK動態代理&#xff09;默認無法攔截非public方法。 示例&#xff1a; Service public class UserService {Transactionalvoid updateUser() { // 非public方法// 事務不會生效&#xff01;} } 修…

GitHub 趨勢日報 (2025年06月20日)

&#x1f4ca; 由 TrendForge 系統生成* | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 1810 data-engineer-handbook 373 n8n 295 anthropic-cookbook 291 automatisch…

qt常用控件--01

文章目錄 qt常用控件--01上一篇文章的補充windowTitle屬性windowIcon屬性windowOpaCity屬性cursor屬性font屬性結語 很高興和大家見面&#xff0c;給生活加點impetus&#xff01;&#xff01;開啟今天的編程之路&#xff01;&#xff01; 今天我們進一步c11中常見的新增表達 作…

C++ 中 string 類的解析及簡易自我實現

目錄 引言 標準庫中的 string 類 功能概述 常見操作示例 自我實現簡易 string 類 代碼結構概述 1. String11.h 頭文件 類的成員變量 迭代器相關 構造函數和析構函數 基本訪問和修改方法 賦值運算符重載 內存管理和擴容 以下代碼在.cpp文件中解析: 2. String11.…

計算機的性能指標(選擇題0~1題無大題)

存儲器的性能指標 總容量存儲單元個數*存儲字長 bit 例&#xff1a;MAR16位&#xff0c;MDR16位 總容量2的16次方*16bit 補充&#xff1a; n個二進制位就有2的n次方不同的狀態 一般描述文件大小容量單位 2的10次方&#xff1a;K 2的20次方&#xff1a;M 2的…

React 核心原理與Fiber架構

目錄 一、虛擬 DOM 二、Diffing 算法 三、Fiber 架構 四、渲染流程 1. Render 階段&#xff08;可中斷異步過程&#xff09; 2. Commit 階段&#xff08;同步不可中斷&#xff09; 五、時間切片&#xff08;Time Slicing&#xff09; 六、核心流程步驟總結 1. 狀態更新…

【破局痛點,賦能未來】領碼 SPARK:鑄就企業業務永續進化的智慧引擎—— 深度剖析持續演進之道,引領數字化新范式

摘要 在瞬息萬變的數字時代&#xff0c;企業對業務連續性、敏捷創新及高效運營的需求日益迫切。領碼 SPARK 融合平臺&#xff0c;秉持“持續演進”這一核心理念&#xff0c;以 iPaaS 與 aPaaS 為雙擎驅動&#xff0c;深度融合元數據驅動、智能端口調度、自動化灰度切換、AI 智…

掌握C++核心特性

目標&#xff1a; 掌握C核心特性&#xff0c;為嵌入式開發打基礎 好的&#xff0c;我來為你詳細梳理一下 繼承與多態、虛函數 相關的知識點&#xff0c;包括單繼承、多繼承、虛函數表機制、純虛函數與抽象類、動態綁定。以下內容適合中等難度層次的理解&#xff0c;便于考試復…

python的高校教師資源管理系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…