《Python實戰進階》No26: CI/CD 流水線:GitHub Actions 與 Jenkins 集成

No26: CI/CD 流水線:GitHub Actions 與 Jenkins 集成


摘要

持續集成(CI)和持續部署(CD)是現代軟件開發中不可或缺的實踐,能夠顯著提升開發效率、減少錯誤并加速交付流程。本文將探討如何利用 GitHub Actions 和 Jenkins 構建高效的 CI/CD 流水線,并通過實戰案例展示如何自動化構建、測試和部署 Python 應用程序。無論你是個人開發者還是團隊成員,本文都將幫助你掌握 CI/CD 的核心技能,并優化開發工作流。


在這里插入圖片描述

核心概念和知識點

1. CI/CD 的基本概念與工作原理

  • 持續集成(CI):開發人員頻繁地將代碼提交到共享倉庫,每次提交都會觸發自動化構建和測試,以盡早發現集成問題。
  • 持續部署(CD):在 CI 的基礎上,進一步將通過測試的代碼自動部署到生產環境或測試環境。
  • 關鍵組件
    • 版本控制系統(如 Git)
    • 構建工具(如 Docker、Makefile)
    • 自動化測試框架(如 pytest)
    • 部署工具(如 Ansible、Kubernetes)

2. GitHub Actions 的 YAML 配置文件

GitHub Actions 是一個內置于 GitHub 的 CI/CD 工具,使用 .github/workflows 目錄下的 YAML 文件定義流水線。其主要特點包括:

  • 支持多種事件觸發(如 pushpull_request)。
  • 提供豐富的預定義操作(Actions),可快速實現復雜功能。
  • 易于與 GitHub 倉庫集成。

3. Jenkins 的安裝、配置與 Pipeline 構建

Jenkins 是一個開源的 CI/CD 工具,支持高度自定義的流水線構建。其主要特性包括:

  • 基于插件的擴展性(如 Git、Docker 插件)。
  • 使用 Groovy 腳本定義 Pipeline。
  • 支持分布式構建環境。

4. 自動化構建、測試與部署

  • 構建:將源代碼編譯為可執行文件或容器鏡像。
  • 測試:運行單元測試、集成測試等,確保代碼質量。
  • 部署:將應用發布到目標環境(如云服務器、Kubernetes 集群)。
    在這里插入圖片描述

實戰案例

1. 使用 GitHub Actions 自動運行單元測試

以下是一個使用 GitHub Actions 自動運行 pytest 單元測試的示例。

項目結構
my_project/
├── src/
│   ├── math_operations.py
├── tests/
│   ├── test_math_operations.py
├── .github/
│   └── workflows/
│       └── ci.yml
被測函數
# src/math_operations.py
def add(a, b):return a + bdef subtract(a, b):return a - b
測試代碼
# tests/test_math_operations.py
import pytest
from src.math_operations import add, subtract@pytest.mark.parametrize("a, b, expected", [(2, 3, 5),(-1, 1, 0),(0, 0, 0)
])
def test_add(a, b, expected):assert add(a, b) == expected@pytest.mark.parametrize("a, b, expected", [(5, 3, 2),(0, 0, 0),(10, 5, 5)
])
def test_subtract(a, b, expected):assert subtract(a, b) == expected
GitHub Actions 配置
# .github/workflows/ci.yml
name: CI Pipelineon:push:branches:- mainpull_request:branches:- mainjobs:test:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v3- name: Set up Pythonuses: actions/setup-python@v4with:python-version: '3.9'- name: Install dependenciesrun: |python -m pip install --upgrade pippip install pytest- name: Run testsrun: pytest tests/
運行結果

當代碼推送到 main 分支時,GitHub Actions 將自動運行測試并生成報告:

============================= test session starts =============================
collected 6 itemstests/test_math_operations.py ......                                    [100%]============================== 6 passed in 0.03s ==============================

2. 使用 Jenkins 部署 Flask 應用到云服務器

Flask 應用
# app.py
from flask import Flaskapp = Flask(__name__)@app.route('/')
def home():return "Hello, CI/CD!"if __name__ == "__main__":app.run(host="0.0.0.0", port=5000)
Jenkins Pipeline
pipeline {agent anystages {stage('Checkout') {steps {git 'https://github.com/your-repo/flask-app.git'}}stage('Build') {steps {sh 'docker build -t flask-app .'}}stage('Test') {steps {sh 'docker run --rm flask-app pytest'}}stage('Deploy') {steps {sh '''docker stop flask-app || truedocker rm flask-app || truedocker run -d --name flask-app -p 5000:5000 flask-app'''}}}
}
運行結果
  • Jenkins 將拉取代碼、構建 Docker 鏡像、運行測試并部署應用。
  • 訪問 http://<server-ip>:5000 可看到 “Hello, CI/CD!”。

3. 集成 Docker 容器化應用的 CI/CD 流程

Dockerfile
FROM python:3.9-slimWORKDIR /appCOPY requirements.txt .
RUN pip install -r requirements.txtCOPY . .CMD ["python", "app.py"]
完整流程
  1. GitHub Actions 運行單元測試。
  2. Jenkins 構建 Docker 鏡像并部署到云服務器。
  3. 通過 Docker 實現跨環境一致性。


部署的細節與詳細操作流程


1. Jenkins 安裝與配置

步驟 1:在云服務器安裝 Jenkins
# 更新包列表
sudo apt update# 安裝 Java 運行時環境(Jenkins 依賴)
sudo apt install openjdk-11-jdk -y# 添加 Jenkins 官方倉庫
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \/usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \https://pkg.jenkins.io/debian-stable binary/ | sudo tee \/etc/apt/sources.list.d/jenkins.list > /dev/null# 安裝 Jenkins
sudo apt update
sudo apt install jenkins -y# 啟動 Jenkins 服務
sudo systemctl start jenkins# 設置 Jenkins 開機自啟
sudo systemctl enable jenkins

訪問 http://<云服務器IP>:8080,按照提示完成初始化配置(需從服務器日志獲取初始管理員密碼)。

步驟 2:安裝必要插件

在 Jenkins 控制臺依次安裝以下插件:

  • Git:用于拉取代碼倉庫。
  • Docker:支持 Docker 構建與部署。
  • Pipeline:定義流水線任務。

2. 云服務器準備

步驟 1:安裝 Docker
# 安裝 Docker
sudo apt install docker.io -y# 啟動 Docker 服務
sudo systemctl start docker# 設置 Docker 開機自啟
sudo systemctl enable docker# 將當前用戶加入 Docker 組(避免每次使用 sudo)
sudo usermod -aG docker $USER
newgrp docker  # 立即生效
步驟 2:配置 SSH 無密碼登錄

在 Jenkins 服務器與目標云服務器之間配置 SSH 免密登錄:

# 在 Jenkins 服務器生成 SSH 密鑰(如已有可跳過)
ssh-keygen -t rsa -b 4096# 將公鑰復制到云服務器
ssh-copy-id user@<云服務器IP>

3. Jenkins 憑據管理

在 Jenkins 控制臺添加以下憑據:

  • SSH 用戶名與私鑰:用于連接云服務器。
  • Docker Hub 憑據(可選):用于推送鏡像到 Docker Hub。

4. Jenkins Pipeline 詳細配置

Pipeline 腳本優化
pipeline {agent anyenvironment {SERVER_IP = 'your-server-ip'DOCKER_HUB_REPO = 'your-dockerhub-username/flask-app'}stages {stage('Checkout') {steps {git branch: 'main', url: 'https://github.com/your-repo/flask-app.git'}}stage('Build Docker Image') {steps {script {docker.build("${DOCKER_HUB_REPO}:${env.BUILD_ID}")}}}stage('Push Docker Image') {steps {script {docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-credentials-id') {docker.image("${DOCKER_HUB_REPO}:${env.BUILD_ID}").push()}}}}stage('Deploy to Server') {steps {sshagent(['ssh-credentials-id']) {sh """ssh -o StrictHostKeyChecking=no user@${SERVER_IP} 'docker pull ${DOCKER_HUB_REPO}:${env.BUILD_ID} && \docker stop flask-app || true && \docker rm flask-app || true && \docker run -d --name flask-app -p 5000:5000 ${DOCKER_HUB_REPO}:${env.BUILD_ID}'"""}}}}
}

5. 部署驗證

  1. 訪問應用
    在瀏覽器輸入 http://<云服務器IP>:5000,應顯示 “Hello, CI/CD!”。

  2. 查看容器日志

    docker logs flask-app
    

6. 常見問題與解決

問題 1:權限不足
  • 現象:Jenkins 無法執行 Docker 命令。
  • 解決:確保 Jenkins 用戶已加入 docker 組:
    sudo usermod -aG docker jenkins
    sudo systemctl restart jenkins
    
問題 2:SSH 連接失敗
  • 現象:Jenkins 無法連接到云服務器。
  • 解決
    1. 檢查云服務器安全組是否開放 SSH 端口(默認 22)。
    2. 檢查 SSH 密鑰是否正確配置。

7. 安全加固建議

  • 限制 Jenkins 訪問權限:通過 Nginx 反向代理并啟用 HTTPS。
  • 定期更新鏡像:在 Pipeline 中加入漏洞掃描步驟(如使用 trivy)。
  • 清理舊鏡像:定期刪除無用的 Docker 鏡像以釋放空間。

通過以上步驟,您可以實現從代碼提交到部署的全自動化流程。如果需要更高級的配置(如藍綠部署、回滾機制),可進一步探索 Jenkins 的高級特性!

總結

本文通過實戰案例展示了如何使用 GitHub Actions 和 Jenkins 構建 CI/CD 流水線。GitHub Actions 適合輕量級的自動化任務,而 Jenkins 提供了更高的靈活性和可擴展性。結合 Docker 容器化技術,可以進一步簡化部署流程并提高應用的一致性。
在這里插入圖片描述


擴展思考

1. 如何優化 CI/CD 流程以減少資源消耗?

  • 使用緩存機制(如 GitHub Actions 的 cache 功能)避免重復安裝依賴。
  • 并行化測試任務以縮短構建時間。
  • 定期清理過期的 Docker 鏡像和 Jenkins 構建記錄。

2. 探討多團隊協作中的 CI/CD 最佳實踐

  • 統一代碼風格和測試標準。
  • 使用分支策略(如 GitFlow)管理代碼合并。
  • 定期審查 CI/CD 配置文件,確保其適應團隊需求。

附錄:相關資源

  • GitHub Actions 官方文檔
  • Jenkins 官方文檔
  • Docker 官方文檔

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

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

相關文章

2025.3.22總結

今天去了光谷書店&#xff0c;看了下&#xff0c;書店里女生比較多&#xff0c;也不知道是不是上班族&#xff0c;發現有本類似馬克思的書籍&#xff0c;也不知道是不是再考研或者考其他證書的。 圖書館很安靜&#xff0c;安靜的讓我的內心也平靜了下來&#xff0c;我也再一旁…

HR人員和組織信息同步AD域服務器實戰方法JAVA

HR人員和組織信息同步AD域服務器 前期準備AD域基礎知識整理HR同步AD的邏輯代碼結構配置文件設置啟動類HR組織的BeanHR人員Bean獲取HR人員和組織信息的類AD中處理組織和人員的類日志配置 POM.xml文件生成EXE文件服務器定時任務異常問題注意事項 前期準備 1、開發語言&#xff1…

修改服務器windows遠程桌面默認端口號

修改服務器windows遠程桌面默認端口號 在Windows服務器上修改遠程桌面協議&#xff08;RDP&#xff09;的默認端口&#xff08;3389&#xff09;可以增強服務器的安全性&#xff0c;減少被惡意掃描和攻擊的風險。以下是修改遠程端口的詳細步驟&#xff1a; 按 Win R 打開運行…

MuJoCo 仿真 Panda 機械臂!末端位置實時追蹤 + 可視化(含縮放交互)

視頻講解&#xff1a; MuJoCo 仿真 Panda 機械臂&#xff01;末端位置實時追蹤 可視化&#xff08;含縮放交互&#xff09; 倉庫地址&#xff1a;GitHub - LitchiCheng/mujoco-learning 本期介紹下&#xff0c;mujoco_py這個庫很老了&#xff0c;最新的版本可以通過mujoco的p…

vue-splice方法

一、代碼解析 語法結構 splice(index, deleteCount, newElement) 是 JavaScript 數組的變異方法&#xff0c;其參數含義為&#xff1a; ? index&#xff1a;操作的起始位置&#xff08;索引&#xff09;。 ? 1&#xff1a;刪除的元素數量&#xff08;此處刪除 1 個元素&#…

在Mac M1/M2芯片上完美安裝DeepCTR庫:避坑指南與實戰驗證

讓推薦算法在Apple Silicon上全速運行 概述 作為推薦系統領域的最經常用的明星庫&#xff0c;DeepCTR集成了CTR預估、多任務學習等前沿模型實現。但在Apple Silicon架構的Mac設備上&#xff0c;安裝過程常因ARM架構適配、依賴庫版本沖突等問題受阻。本文通過20次環境搭建實測…

spring boot 攔截器

1、創建ServletConfig配置類 package com.pn.config;import com.pn.filter.LoginFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.web.servlet.Fil…

論文閱讀筆記:Denoising Diffusion Probabilistic Models (2)

接論文閱讀筆記&#xff1a;Denoising Diffusion Probabilistic Models (1) 3、論文推理過程 擴散模型的流程如下圖所示&#xff0c;可以看出 q ( x 0 , 1 , 2 ? , T ? 1 , T ) q(x^{0,1,2\cdots ,T-1, T}) q(x0,1,2?,T?1,T)為正向加噪音過程&#xff0c; p ( x 0 , 1 , …

【大模型基礎_毛玉仁】3.5 Prompt相關應用

目錄 3.5 相關應用3.5.1 基于大語言模型的Agent3.5.2 數據合成3.5.3 Text-to-SQL3.5.4 GPTs 3.5 相關應用 Prompt工程應用廣泛&#xff0c;能提升大語言模型處理基礎及復雜任務的能力&#xff0c;在構建Agent、數據合成、Text-to-SQL轉換和設計個性化GPTs等方面不可或缺。 . …

Deepseek訓練成AI圖片生成機器人

目錄 內容安全層 語義理解層 提示詞工程層 圖像生成層 交付系統 訓練好的指令(復制就可以) 內容安全層 理論支撐:基于深度語義理解的混合過濾系統 敏感詞檢測:采用BERT+CRF混合模型,建立三級敏感詞庫(顯性/隱性/文化禁忌),通過注意力機制捕捉上下文關聯風險 倫…

深入理解 Linux ALSA 音頻架構:從入門到驅動開發

文章目錄 一、什么是 ALSA?二、ALSA 系統架構全景圖核心組件詳解:三、用戶空間開發實戰1. PCM 音頻流操作流程2. 高級配置(asound.conf)四、內核驅動開發指南1. 驅動初始化模板2. DMA 緩沖區管理五、高級主題1. 插件系統原理2. 調試技巧3. 實時音頻優化六、現代 ALSA 發展七…

探秘海螺 AI 視頻與計算機視覺算法的奇妙融合

目錄 開篇&#xff1a;數字浪潮下的視頻新變革 藍耘 Maas 平臺與海螺 AI 視頻&#xff1a;嶄露頭角的視頻創作利器 圖片生成視頻&#xff1a;化靜為動的魔法 文本生成視頻&#xff1a;文字到畫面的奇妙轉換 注冊與登錄 計算機視覺算法&#xff1a;海螺 AI 視頻的核心驅動力…

SOFABoot-10-聊一聊 sofatboot 的十個問題

前言 大家好&#xff0c;我是老馬。 sofastack 其實出來很久了&#xff0c;第一次應該是在 2022 年左右開始關注&#xff0c;但是一直沒有深入研究。 最近想學習一下 SOFA 對于生態的設計和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概覽 SOFABoot-01-螞蟻金服開源的 s…

【數據分享】我國鄉鎮(街道)行政區劃數據(免費獲取/Shp格式)

行政區劃邊界矢量數據是我們在各項研究中最常用的數據。之前我們分享過2024年我國省市縣行政區劃矢量數據&#xff08;可查看之前的文章獲悉詳情&#xff09;&#xff0c;很多小伙伴拿到數據后咨詢有沒有精細到鄉鎮&#xff08;街道&#xff09;的行政區劃矢量數據&#xff01;…

同一個局域網的話 如何訪問另一臺電腦的ip

在局域網內訪問另一臺電腦&#xff0c;可以通過以下幾種常見的方法來實現&#xff1a; ?直接通過IP地址訪問?&#xff1a; 首先&#xff0c;確保兩臺電腦都連接在同一個局域網內。獲取目標電腦的IP地址&#xff0c;這可以通過在目標電腦上打開命令提示符&#xff08;Windows系…

2、基本操作-

學習之前–查看docker服務的狀態 sudo systemctl status docker sudo systemctl start docker restart 配置國內鏡像加速【重要】 選擇阿里云鏡像加速&#xff1a; https://help.aliyun.com/zh/acr/user-guide/accelerate-the-pulls-of-docker-official-images sudo mkdir …

LINUX基礎 [二] - 進程概念

目錄 前言 什么是進程 如何管理進程 描述進程 組織進程 如何查看進程 通過 ps 命令查看進程 通過 ls / proc 命令查看進程 通過系統調用 獲取進程標示符 前言 在學習了【Linux系統編程】中的 ? 操作系統 和 馮諾依曼體系結構 之后&#xff0c;我們已經對系統應該有…

什么是PHP偽協議

PHP偽協議是一種特殊的URL格式&#xff0c;允許開發者以不同于傳統文件路徑訪問和操作資源。以下是一些常見的PHP偽協議及其詳細介紹&#xff1a; 常見的PHP偽協議 1. **file://** - **用途**&#xff1a;訪問本地文件系統。 - **示例**&#xff1a;file:///path/to/file.txt。…

股指期貨貼水波動,影響哪些投資策略?

先來說說“貼水”。簡單來說&#xff0c;貼水就是股指期貨的價格比現貨價格低。比如&#xff0c;滬深300指數現在是4000點&#xff0c;但股指期貨合約的價格只有3950點&#xff0c;這就叫貼水。貼水的大小會影響很多投資策略的收益&#xff0c;接下來我們就來看看具體的影響。 …

算法·動態規劃·入門

動態規劃的概念 狀態&#xff1a;也就是DP數組的定義 狀態轉移 dp五部曲的理解 見&#xff1a;代碼隨想錄 優先確定&#xff1a;狀態的定義&#xff0c;狀態轉移的房產 根據狀態轉移方程確定&#xff1a;遍歷順序&#xff0c;初始化 狀態壓縮 本質上就是變量個數減少&am…