Jenkins 最佳實踐

1.?在Jenkins中避免調度過載

過載Jenkins以同時運行多個作業可能導致資源競爭、構建速度變慢和系統性能問題。分配作業啟動時間可以防止瓶頸,并確保更順暢的執行。如何實現?

  1. 在Cron表達式中使用H:引入抖動(jitter),使用H來錯開作業啟動時間,避免同時執行多個作業。

? ? ? ?H/3 * * * * // 每隔3分鐘運行

? ? ?2. 在cron表達式中正確使用時區。

? ?驗證:

?Jenkins 還有一組別名,可以使使用常見的時間間隔更容易。

2. 使用環境變量來配置管道

硬編碼像API密鑰或部署URL這樣的值會使管道的靈活性降低,并且更難維護。環境變量允許你將這些值外部化,使你的管道能夠適應不同的環境(開發、測試、生產)。

如何實現?

在Jenkinsfile中定義環境變量:

environment {ENV_NAME = 'production'API_KEY = credentials('api-key-id')}

這使得你的管道在不同環境中更加動態和易于管理。?

3.?設置構建保留策略以管理磁盤空間

隨著Jenkins構建的積累,它們會占用大量的磁盤空間。設置保留策略可以幫助您丟棄舊的、不必要的構建,防止Jenkins變慢。

如何實施?

在每個作業的配置中,啟用丟棄舊構建,并指定要保留的構建數量或構建的天數。這樣可以確保Jenkins僅保留相關構建,減少存儲開銷。?

4.? 參數化構建

有時,擁有多個“參數”的構建是有用的/必要的。考慮以下使用情況:

  • 您在Jenkins上設置了一個測試作業,它接受一個分發包作為參數并對其進行測試。您希望開發人員進行本地構建,并讓他們提交構建以在Jenkins上執行測試。在這種情況下,您的參數是一個包含分發的zip文件。
  • 您的測試套件運行時間很長,以至于在正常執行中您無法承受運行整個測試周期的費用。因此,您希望控制要執行的測試部分。

在這種情況下,您的參數可能是一個字符串令牌,指示要運行的測試套件。這些參數可作為環境變量使用。因此,例如,shell($FOO,%FOO%)或Ant(${env.FOO})可以訪問這些值。

定義參數:env和jdk_version:?

?在pipeline中使用該參數

驗證:

5. 使用共享庫來簡化流水線

?創建共享庫:要在Jenkins中創建共享庫,請按照以下步驟操作:

1. 創建一個Git倉庫:首先創建一個Git倉庫來托管您的共享庫代碼。該倉庫應具有Jenkins能理解的特定結構。

2. 創建‘vars’目錄:在您的倉庫中創建一個‘vars’目錄。該目錄將包含您的可重用函數。

3. 定義函數:在‘vars’目錄中,將您的函數定義為Groovy文件。每個文件應包含一個函數,文件名將作為函數名。例如,如果您有一個名為‘sayHello’的函數,請創建一個名為`sayHello.groovy`的文件,其中包含該函數。

#!/usr/bin/env groovydef call(String name = 'human') {echo "Hello, ${name}."
}

4. 提交并推送:將您的更改提交到Git倉庫并推送到遠程倉庫。在Jenkins Pipeline中使用共享庫:現在您已創建了一個共享庫,可以在您的Jenkins Pipeline腳本中使用它。以下是一個示例:

@Library('pipeline-library-demo')_stage('Demo') {echo 'Hello world'sayHello 'Alex'}

?構建管道并檢查控制臺輸出表明共享庫正確加載并與用戶輸入交互。

在上面的例子中,我們使用 `@Library` 加載共享庫,并導入我們想用的函數。然后,我們可以在我們的流水線腳本中調用這些函數。

現實世界示例:使用共享庫進行 Kubernetes 部署假設你有一個簡化 Kubernetes 部署的共享庫。以下是你如何在 Jenkins 流水線中使用它的示例:

@Library('k8s-deploy-library') // Load the Kubernetes deployment library
import com.example.kubernetes.*pipeline {agent anyenvironment {DOCKER_IMAGE = 'myapp:latest'}stages {stage('Build and Push Docker Image') {steps {script {buildAndPushDockerImage(image: DOCKER_IMAGE)}}}stage('Deploy to Kubernetes') {steps {script {// Deploy to Kubernetes using the shared library functiondeployToKubernetes(deploymentName: 'myapp', image: DOCKER_IMAGE)}}}}
}

在這個例子中,我們使用共享庫來構建并推送 Docker 鏡像,然后將其部署到 Kubernetes 集群中。共享庫抽象了這些任務的復雜性,使管道腳本更具可讀性和可維護性。

6.?在流水線中執行安全掃描

將安全檢查融入您的流水線可以盡早發現漏洞,確保在代碼進入生產環境之前是更安全的。自動化的安全掃描將減少漏洞被引入代碼庫的風險。如何實施?

將安全工具,如SonarQube或OWASP依賴檢查,集成到您的流水線中:

stage('SonarCloud') {environment {SCANNER_HOME = tool 'SonarQubeScanner'ORGANIZATION = "rock-github"PROJECT_NAME = "java_jenkins-pipeline-as-code"}steps {withSonarQubeEnv('SonarCloudOne') {sh '''$SCANNER_HOME/bin/sonar-scanner -Dsonar.organization=$ORGANIZATION \-Dsonar.java.binaries=build/classes/java/ \-Dsonar.projectKey=$PROJECT_NAME \-Dsonar.sources=.'''}}
}

7. 使用角色來管理用戶的權限

企業有這樣的需求,開發部門的員工不能訪問生產環境的release pipeline。只能看到測試環境的CI pipeline,要實現這樣的需求,需要用到基于角色的權限管理。

首先需要安裝下面的plug-in。

創建用戶,在系統管理-安全-管理用戶?

?點擊創建用戶

然后創建角色,并指定權限,使用表達式來匹配jenkins-ci開頭的job。

然后分配角色給用戶

使用該用戶登錄后,發現只能看到jenkins-ci開頭的pipeline。

7.?將您的流水線作為代碼

建議使用該功能將Jenkinsfile存儲在源代碼管理(SCM)中,然后進行版本控制和測試。將您的流水線視為代碼可以打開一系列新的功能和能力,如多分支、拉取請求檢測以及對GitHub和BitBucket的組織掃描。使用Jenkinsfile調用流水線作為代碼使用其默認名稱Jenkinsfile調用流水線腳本,并開始遵循腳本頭部。這有助于您的IDE、GitHub和其他工具將其識別為Groovy,并啟用所需的代碼高亮顯示。?

8.?不要使用 Maven 作業類型

Jenkins 多年來一直提供 Maven 集成插件,允許用戶通過 Jenkins 的“新建項目”菜單選擇“Maven 項目”來創建 Maven 項目。雖然 Maven 作業類型提供了與 Maven 構建的更高水平集成,但有時由于這種深度集成,可能會引入不必要的復雜性。

考慮使用組織文件夾、多分支管道或管道作業,而不是 Maven 作業類型。這些替代方案在管理您的 Jenkins 作業和工作流程時提供了更多靈活性和簡便性。

Jenkins 項目使用組織文件夾在 ci.jenkins.io 上構建 Jenkins 核心和 Jenkins 插件。Jenkins 管道可以輕松構建 Maven 項目,并為 Maven 用戶提供更好的控制。?

9.?避免資源沖突

可鎖定資源

這個插件允許定義可鎖定的資源(例如打印機、電話、計算機等),這些資源可以被構建使用。如果一個構建需要一個已經被鎖定的資源,它將等待該資源釋放。

當多個作業同時運行時,特別是當它們需要對某些資源或設置服務進行獨占訪問時,可能會發生沖突。為了防止干擾并確保順利執行,有效管理資源訪問至關重要。對于涉及數據庫或網絡服務的構建,實施防止沖突的措施是至關重要的。可鎖定資源插件為Jenkins作業提供了細粒度的資源鎖定功能。通過使用此插件,您可以確保在任何時候只有一個作業能夠訪問特定資源,從而避免沖突并確保正確的同步。在可鎖定資源插件的資源鎖定不足以解決問題的情況下,您可以使用限制并發構建插件進一步控制并發構建。該插件允許您限制可以同時運行的構建數量,提供額外的控制并防止對共享資源的過載。

通過利用這些插件,您可以有效管理資源沖突和并發性,確保Jenkins作業的順利和可靠執行。?

?下面是一個使用資源鎖的pipeline?

echo 'Starting'
lock('SH_Printer_ColorA3_2342') {echo 'Do something here that requires unique access to the resource'// any other build will wait until the one locking the resource leaves this block
}
echo 'Finish'

?10.?報告構建結果

圖表和圖形為項目狀態和進展提供了有價值的見解,展示了趨勢和模式。自動化測試結果,包括單元測試、集成測試和端到端測試,可以揭示脆弱性或不穩定性。覆蓋率報告幫助識別沒有執行自動化測試的領域。編譯器警告消息通常是問題的第一指示。靜態分析工具在報告有風險的代碼或潛在安全風險的代碼方面非常有效。性能測試結果幫助識別延遲或關注區域。

下一代警告插件提供了方便訪問許多報告的途徑,包括:

  • 編譯器警告和錯誤(如gcc、clang、javac或golang)
  • 靜態分析警告和錯誤(如spotbugs、checkstyle、pmd、lint、cpd或Simian)
  • 代碼覆蓋報告

?

?

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

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

相關文章

pytest框架 - 第二集 allure報告

一、斷言assert 二、Pytest 結合 allure-pytest 插件生成美觀的 Allure 報告 (1) 安裝 allure 環境 安裝 allure-pytest 插件:pip install allure-pytest在 github 下載 allure 報告文件 地址:Releases allure-framework/allure2 GitHub下載&#x…

人工智能時代:解鎖職業新身份,從“認證師”到“工程師”的進階之路

在人工智能技術浪潮席卷全球的今天,技術的飛速迭代正在重塑職業版圖。從算法優化到倫理決策,從系統測試到應用開發,AI技術不再只是程序員的專屬領域,而是成為各行各業從業者必須掌握的“生存技能”。當企業爭相布局AI賽道,個人如何在這場變革中搶占先機?答案或許藏在兩個…

【帶文檔】網上點餐系統 springboot + vue 全棧項目實戰(源碼+數據庫+萬字說明文檔)

📌 一、項目概括 本系統共包含三個角色: 管理員:系統運營管理者 用戶:點餐消費用戶 美食店:上傳菜品與處理訂單的店鋪賬號 通過對這三類角色的權限與業務分工設計,系統實現了點餐流程的全鏈路數字化&a…

window nvidia-smi命令 Failed to initialize NVML: Unknown Error

如果驅動目錄下的可以執行,那可能版本原因 "C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"復制"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"替換 C:\Windows\System32\nvidia-smi.exe 或者 把C:\Windows\System3…

接觸感知 鉗位電路分析

以下是NG板接觸感知電路的原理圖。兩極分別為P3和P4S&#xff0c;電壓值P4S < P3。 電路結構分兩部分&#xff0c;第一部分對輸入電壓進行分壓鉗位。后級電路使用LM113比較器芯片進行電壓比較&#xff0c;輸出ST接觸感知信號。 鉗位電路輸出特性分析 輸出電壓變化趨勢&a…

70、微服務保姆教程(十三)Docker容器詳細講義

一、關于Docker 1.1為什么要用docker? 隨著開發的項目越來越復雜,軟件越來越多,服務器越來越多,我們在開發和部署的時候會遇到很多問題,比如: 1.不同的應用程序可能會有不同的應用環境,比如Java開發的網站和php開發的網站依賴的軟件就不一樣,如果把他們依賴的軟件都…

Python 中的 typing.ClassVar 詳解

一、ClassVar 的定義和基本用途 ClassVar 是 typing 模塊中提供的一種特殊類型&#xff0c;用于在類型注解中標記類變量&#xff08;靜態變量&#xff09;。根據官方文檔&#xff0c;使用 ClassVar[…] 注釋的屬性表示該屬性只在類層面使用&#xff0c;不應在實例上賦值 例如&…

架構與UML4+1視圖

簡單對比分析 架構41視圖 架構41視圖是由Philippe Kruchten提出的&#xff0c;用于描述軟件系統的架構。它包括以下五個視圖&#xff1a; 邏輯視圖&#xff1a;描述系統的功能需求&#xff0c;展示系統的靜態結構&#xff0c;通常使用類圖、對象圖等。開發視圖&#xff1a;…

Redis 八股

目錄 數據類型 字符串&#xff1a; List&#xff1a; HASH&#xff1a; Set&#xff1a; Zset&#xff1a; BitMap&#xff1a;&#xff08;這個及以下是后來新增的數據結構&#xff09; HyperLogLog&#xff1a; GEO&#xff1a; Stream&#xff1a; 主要數據結構 …

基于協同過濾的文學推薦系統設計【源碼+文檔+部署】

基于協同過濾的文學推薦系統設計 摘要 隨著信息技術的飛速發展和文學閱讀需求的日益多樣化&#xff0c;構建一個高效、精準的文學推薦系統變得尤為重要。本文采用Spring Boot框架&#xff0c;結合協同過濾算法&#xff0c;設計并實現了一個基于用戶借閱行為和社交論壇互動的文學…

鴻蒙電腦:五年鑄劍開新篇,國產操作系統新引擎

出品 | 何璽 排版 | 葉媛 前不久&#xff0c;璽哥發布的《鴻蒙電腦&#xff0c;刺向壟斷的利刃&#xff0c;將重塑全球PC市場格局》發布后&#xff0c;獲得了讀者朋友的積極反饋&#xff0c;不少都期望鴻蒙電腦早日發布。 如今&#xff0c;它真來了&#xff01; 5月8日&…

EWOMAIL

1、錯誤 Problem: problem with installed package selinux-policy-targeted-3.14.3-41.el8.noarch package fail2ban-server-1.0.2-3.el8.noarch requires (fail2ban-selinux if selinux-policy-targeted), but none of the providers can be installed - package fail2ban-…

qt5.14.2 opencv調用攝像頭顯示在label

ui界面添加一個Qlabel名字是默認的label 還有一個button名字是pushButton mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <opencv2/opencv.hpp> // 添加OpenCV頭文件 #include <QTimer> // 添加定…

Spring三級緩存的作用與原理詳解

在Spring框架中&#xff0c;Bean的創建過程涉及到了三級緩存機制。這個機制主要是為了提高單例模式下bean實例化和依賴注入的效率。本文將深入探討Spring中的三級緩存&#xff0c;以及其在bean生命周期中的重要作用。 首先&#xff0c;讓我們理解什么是三級緩存。Spring中的三…

IoTDB集群的一鍵啟停功能詳解

IoTDB&#xff08;Internet of Things Database&#xff09;作為一種專為物聯網設計的高性能時序數據庫&#xff0c;支持單機與分布式等多種部署模式。隨著節點數量的增加&#xff0c;手動管理集群的啟動與停止過程變得繁瑣。為了提升部署效率&#xff0c;IoTDB 提供了一鍵啟停…

Oracle學習日記--Oracle中使用單個inert語句實現插入多行記錄

目錄 前言&#xff1a; 問題現象&#xff1a; 問題分析&#xff1a; 解決方法&#xff1a; 1、insert into ... union all句式 2、insert all into ...select 1 from dual句式 總結&#xff1a; 前言&#xff1a; 最近項目中使用到了Oracle數據庫&#xff0c;由于Oracle數…

LabVIEW 程序運行時內存不足報錯原因

在 LabVIEW 程序開發與運行過程中&#xff0c;內存不足報錯并退出是常見且棘手的問題。這不僅影響程序穩定性&#xff0c;還可能導致數據丟失與系統崩潰。以下從程序設計、硬件資源、系統環境等多維度深入剖析其成因&#xff0c;幫助開發者準確定位并解決問題。 ? 一、程序設…

【GAN網絡入門系列】一,手寫字MINST圖片生成

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 博主簡介&#xff1a;努力學習的22級本科生一枚 &#x1f31f;?&#xff1b;探索AI算法&#xff0c;C&#xff0c;go語言的世界&#xff1b;在迷茫中尋找光芒…

Baklib加速企業AI數據智理轉型

Baklib智理AI數據資產 在AI技術深度滲透業務場景的背景下&#xff0c;Baklib通過構建企業級知識中臺架構&#xff0c;重塑了數據資產的治理范式。該平臺采用智能分類引擎與語義分析模型&#xff0c;將分散在郵件、文檔、數據庫中的非結構化數據轉化為標準化的知識單元&#xf…

如何在Windows右鍵新建菜單中添加自定義項,將notepad添加到新建菜單

一、簡介 Windows 右鍵新建菜單的核心管理機制隱藏在注冊表的 HKEY_CLASSES_ROOT 根鍵中。這里存在兩種關鍵注冊表項&#xff1a;文件擴展名項和文件類型項&#xff0c;它們共同構成了新建菜單的完整控制體系。 以常見的.txt文件為例&#xff0c;系統通過以下機制實現新建菜單…