實戰(zhàn):手把手編寫你的第一個自定義插件)
Vespene插件開發(fā)實戰(zhàn)手把手編寫你的第一個自定義插件【免費下載鏈接】_old_vespeneDISCONTINUED: a frozen fork will exist forever at mpdehaan/vespene項目地址: https://gitcode.com/gh_mirrors/ol/_old_vespeneVespene插件開發(fā)并不難今天這篇實戰(zhàn)教程將帶你從零開始手把手編寫并注冊你的第一個自定義插件。Vespene是一個開源的持續(xù)集成/持續(xù)交付CI/CD平臺它的插件架構(gòu)是整個系統(tǒng)最靈活的部分——從源碼拉取、構(gòu)建隔離到構(gòu)建通知幾乎所有核心行為都可以通過自定義插件來擴展或替換。無論你是想給構(gòu)建加一個釘釘/企業(yè)微信通知還是想接入公司內(nèi)部的自定義版本控制系統(tǒng)掌握 Vespene 插件開發(fā)就能讓這套平臺真正長成你想要的樣子。為什么要學習Vespene插件開發(fā)很多剛接觸 Vespene 的用戶以為它只是一個裝好就能用的工具其實它的靈魂在于可插拔設計。官方文檔在 plugins.rst 中明確指出插件可以從 PYTHON_PATH 中的任意位置加載通過配置文件即可注冊不需要修改任何核心代碼。學習 Vespene 插件開發(fā)的好處非常直接按需定制內(nèi)置的 Slack 觸發(fā)器不夠用自己寫一個企業(yè)微信觸發(fā)器即可無侵入擴展所有插件都通過配置文件注冊升級主程序也不會被覆蓋??社區(qū)共享官方非常歡迎用戶貢獻插件寫好的插件可以回饋社區(qū)認識Vespene插件家族的九大類型在動手寫代碼之前先摸清 Vespene 支持哪些插件類型。查看默認配置 plugins.py可以看到插件被劃分為以下類別插件類型作用自帶示例觸發(fā)器triggers構(gòu)建前/成功/失敗時執(zhí)行動作command、slack源碼管理scm拉取代碼git、svn、none構(gòu)建隔離isolation保護構(gòu)建環(huán)境sudo、basic_container輸出處理output處理構(gòu)建日志timestamp授權(quán)authorization權(quán)限控制邏輯ownership、group_required變量variables變量計算與模板渲染common、pipelines、snippets組織導入organizations從托管平臺自動導入配置github密鑰secrets敏感信息加解密basic自動擴縮容autoscaling按需調(diào)度資源shell、stock其中觸發(fā)器插件是絕大多數(shù)人第一個自定義插件類型也是本教程的實戰(zhàn)主角。插件加載機制一切皆Plugin類Vespene 的插件加載器位于 plugin_loader.py它的核心邏輯非常樸素用 Python 標準庫import_module動態(tài)導入你指定的模塊從模塊中取出名為Plugin的類實例化如果配置中帶了參數(shù)則把參數(shù) dict 傳入構(gòu)造函數(shù)因此編寫 Vespene 插件的唯一硬性要求就是類名必須叫Plugin否則加載器會直接報錯。開發(fā)指南 development_guide.rst 中還特別提醒構(gòu)造函數(shù)不要做昂貴操作比如網(wǎng)絡請求因為插件實例可能會被頻繁創(chuàng)建。實戰(zhàn)編寫第一個自定義觸發(fā)器插件現(xiàn)在開始正式的 Vespene 插件開發(fā)實戰(zhàn)。我們以官方自帶的 command.py 為模板寫一個構(gòu)建完成后打印項目信息的觸發(fā)器插件。第一步定義插件類新建文件myproject/myplugins/hello_vespene.py內(nèi)容如下from vespene.common.logger import Logger LOG Logger() class Plugin(object): def __init__(self, args): self.args args def execute_hook(self, build, context): LOG.info(Hello Vespene! 構(gòu)建 #%s 已完成 % build.id)這段代碼雖然只有十幾行但已經(jīng)是一個合法的 Vespene 插件。要點解讀Plugin類名是約定不能改構(gòu)造函數(shù)接收配置參數(shù)args觸發(fā)器插件必須實現(xiàn)execute_hook(self, build, context)方法build是構(gòu)建對象context里包含hook、build、project等上下文信息參見 triggers.py第二步注冊插件配置插件寫好之后在配置文件默認是/etc/vespene/settings.d/plugins.py里注冊它。注冊格式非常簡單插件名 模塊路徑如果需要傳參就寫成列表形式PLUGIN_CONFIGURATION dict( success_triggers OrderedDict( hello [ myproject.myplugins.hello_vespene, dict(modetext) ], ), )重啟 worker 進程后每次構(gòu)建成功你的第一個自定義插件就會生效。最快配置方法理解三種注冊格式從官方配置 plugins.py 中可以歸納出插件注冊的三種格式掌握它們就能舉一反三純字符串git vespene.plugins.scm.git無參數(shù)加載器直接實例化列表形式timestamp [ vespene.plugins.output.timestamp, dict(modeelapsed) ]第二項是傳給構(gòu)造函數(shù)的參數(shù) dict同名多實例同一個插件可以用不同名字注冊多份比如slack_general、slack_build分別配置不同頻道另外注意配置中的OrderedDict是有序的像觸發(fā)器這類插件會按配置順序依次執(zhí)行。其他常用插件接口速覽當你熟悉了觸發(fā)器插件的套路其他類型的插件接口也很快能上手輸出插件實現(xiàn)filter(self, build, msg)方法對每行構(gòu)建輸出做加工參考 timestamp.pySCM 插件實現(xiàn)setup、checkout、get_revision、get_last_commit_user等方法參考功能完善的 git.py變量插件實現(xiàn)compute(self, project, existing_variables)方法參與構(gòu)建變量的計算鏈參考 common.py授權(quán)插件實現(xiàn)check_can_*和filter_queryset_*系列方法控制誰能看、誰能改參考 ownership.py每種插件只需聚焦自己對應的方法核心的加載機制完全一致。Vespene插件開發(fā)避坑指南實戰(zhàn)經(jīng)驗告訴我們新手寫插件最容易踩這幾個坑??類名必須叫Plugin大小寫都不能錯??依賴庫要動態(tài)導入如果插件用到可選依賴比如某個聊天工具 SDK要用try/except ImportError的方式動態(tài)導入并給出清晰的報錯提示避免影響其他用戶??不要輕易移除核心插件官方文檔特別強調(diào)authorization權(quán)限和gitSCM這類插件承擔著核心職責刪除前請三思??插件之間不要互相調(diào)用會讓排查問題變得困難盡量保持插件獨立??錯誤處理要健壯插件應使用有意義的日志Logger和異常而不是靜默失敗更多細節(jié)可以參考開發(fā)指南 development_guide.rst 中的動態(tài)導入示例。結(jié)語通過這篇 Vespene 插件開發(fā)實戰(zhàn)你已經(jīng)掌握了插件的類型體系、加載機制、編寫步驟和注冊方法。從最簡單的觸發(fā)器插件開始逐步嘗試輸出插件、SCM 插件你會發(fā)現(xiàn) Vespene 的能力邊界完全由你的想象力決定。如果你準備上手實操可以先獲取項目代碼git clone https://gitcode.com/gh_mirrors/ol/_old_vespene對照源碼中的插件目錄逐步練習。祝你開發(fā)愉快期待你的第一個自定義插件順利跑起來【免費下載鏈接】_old_vespeneDISCONTINUED: a frozen fork will exist forever at mpdehaan/vespene項目地址: https://gitcode.com/gh_mirrors/ol/_old_vespene創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考