首發於 Jenkins 中文社群
本文分上下兩篇,上篇介紹了從產生 idea 到外掛開發完成的過程; 下篇將介紹將外掛託管到 Jenkins 外掛更新中心的一系列過程。
託管外掛
託管外掛包括一系列流程步驟。 筆者完成了它所有步驟(包括非必須的步驟),其中主要有兩個具有標誌性的任務:
- 外掛程式碼被託管在 jenkinsci GitHub 組織的一個倉庫,然後作者擁有它的管理許可權。
筆者外掛的程式碼倉庫為:jenkinsci/maven-snapshot-check-plugin 。 - 你可以將外掛釋出到 Jenkins 專案的 Maven 倉庫,它是 Jenkins 專案所使用的更新站點的資料來源。
準備工作
在請求外掛託管之前,需要完成以下幾個步驟。
查詢類似的外掛
Jenkins 社群歡迎任何人的貢獻,但為了讓 Jenkins 使用者受益,它要求查詢解決相同或類似問題的外掛,看看是否可以與現有的維護人員聯手。可以在 plugins.jenkins.io 檢視所有的外掛,以確認是否已有類似的外掛實現了你計劃實現的功能。
筆者在之前已進行過查詢,並沒有找到可以實現筆者計劃實現的功能的類似外掛。
命名規約
Jenkins 制定了一些與外掛相關的命名規約。外掛開發者要確保遵循這些命名規約。
artifactId
外掛的 artifactId 被用於檔案基本名稱,是 Jenkins 外掛和更新站點的唯一標識。
它需要遵循一些釋出規約:
- 使用小寫 ID ,並根據需要使用連字元分隔術語。
- 除非名稱有任何意義,否則不要在 ID 中包含 jenkins 或 plugin 。
外掛名稱
外掛的名稱在 Jenkins UI 和其它地方(如:外掛站點)展示給使用者。
如果可以,建議使用簡短的描述性名稱,如 Subversion 。
筆者所寫的外掛的名稱為:Maven SNAPSHOT Check 。
groupId
推薦使用 io.jenkins.plugins
或 org.jenkins-ci.plugins
作為 groupId 。
但是不禁止其他組織 ID ,除非它們是惡意的(例如引用與你沒有關係的組織)。
筆者所寫的外掛使用的 groupId 為: org.jenkins-ci.plugins
。
Java 原始碼
Jenkins 專案一般遵循 Oracle Java 程式碼規約,但是並沒有很好的強制甚至在核心元件中。個別的外掛維護者有時會選擇使用不同的風格指南作為外掛。 筆者日常使用 IDEA 進行開發,之前安裝了「阿里 Java 規約外掛」, 因而使用它作為編碼規約。
提交訊息
Git 提交訊息應該從引用與之相關的 JIRA 問題開始(如果適用), 然後在第一行進行簡短的總結,並在隨後的行中提供更多詳細資訊。例如:
[JENKINS-00000] Frobnicate the widget
複製程式碼
如果給定的提交修復了指定的問題, 那麼使用以下字首中的任何一個將會自動化解決相關的 JIRA 問題。
[FIX JENKINS-00000] Frobnicate the widget
[FIXED JENKINS-00000] Frobnicate the widget
[FIXES JENKINS-00000] Frobnicate the widget
複製程式碼
由於還沒過將外掛託管,筆者並沒有遵循該規約,等外掛釋出後,筆者將考慮遵循該規約。
License
Jenkins 專案分發的所有外掛都需要是免費的開源軟體。
這適用於外掛原始碼及其所有依賴項。
要確保在 pom.xml
檔案和倉庫中的 LICENSE
檔案指定協議。
官方建議使用 MIT license ,它用於 Jenkins 核心和大多數外掛和庫,
但是任何 OSI 批准的開源 license 都可以。
筆者這裡使用了 MIT license 。
要求註冊的賬號
通過 Jenkins 專案更新站點分發的外掛需要託管在 jenkinsci GitHub 組織中,因此需要在 GitHub 上有一個賬號,並且需要有一個公共倉庫來存放外掛原始碼。
為了完整地釋出你的外掛,需要註冊一個 Jenkins 社群帳號, 它可以讓你訪問 JIRA,wiki 和 Maven 倉庫 。
發起託管請求
注意:Jenkins 官方自動化流程使用更容易實現的 fork + 刪除的方式(見下文),而不是轉移倉庫所有者。
登入到 JIRA 然後在 HOSTING 專案建立一個問題。 請確保按照描述填寫所有欄位。Jenkins 專案成員將在幾天內審查你的請求。如果審查人員要求你更改,那麼請按照要求進行更改。
筆者提交的申請為:HOSTING-750, 比較幸運的是當天凌晨(北京時間)筆者的請求就被審查, 正巧那時筆者未眠,於是隨後按要求進行了更改並在不久後該申請被審批通過。
一旦滿足了所有的需求,你的倉庫將被 fork 到 jenkinsci 組織中,並且你將被邀請加入該組織,並且將為你在 JENKINS 專案中建立 JIRA 元件。
此時,將要求你刪除 Jenkins 從中 fork 的倉庫。之後你可以通過再次從 jenkinsci
那裡 fork 來重新建立它。這將確保 jenkinsci
倉庫是 Github 上網路圖的根。
這意味著:
- 不會混淆哪個倉庫是權威倉庫。
- 即使在 GitHub 上沒有大量的關注者,原始碼搜尋也會成功。
- 其他人更可能在
jenkinsci
倉庫中提交 pull request(這是協作的理想選擇)。
建立 wiki 頁面
儘管這對釋出外掛來說這不是嚴格要求的,但最好為外掛建立一個 wiki 頁面來儲存文件。關於如何執行此操作的詳細資訊,請參閱外掛 wiki 頁面指南。
筆者所寫的外掛的 wiki 頁面為:Maven SNAPSHOT Check Plugin 。 其間除了官方文件,筆者還參考了其它外掛 wiki 頁面的排版。
開啟 CI 構建
Jenkins 專案託管了一個 Jenkins 例項來執行外掛的持續整合構建。 官方推薦通過在外掛的 Github 倉庫根目錄建立一個 Jenkinsfile,為在 Jenkinsci Github 組織中的外掛設定 CI 構建。
典型的外掛構建( Maven 或 Gradle )只需在 Jenkinsfile 中包含以下語句即可執行:
buildPlugin()
複製程式碼
申請上傳許可權
在原始碼被 fork 到 jenkinsci
組織後,需要提交一個上傳許可權請求。
按照 jenkins-infra/repository-permissions-updater/ 倉庫的 README 檔案中所說的來做就可以。
Jenkins 專案在 Artifactory 上託管 Maven 製品,例如核心和外掛釋出。
它的許可權系統與 Github 是獨立的,限制了那些使用者(由 Jenkins LDAP 帳戶標識,與 wiki 和 JIRA 一樣)可以上傳。 這個倉庫包含 YAML 格式的 Artifactory 上傳許可權定義,以及將它們同步到 Artifactory 的工具。
先決條件:在申請許可權之前,需要先用 Jenkins 社群帳號登入一次 Artifactory 。
要請求對製品(通常是外掛)的上傳許可權,需要提交一個 PR , 該 PR 需要建立與申請上傳許可權相關的 YAML 檔案。 筆者所提交的 PR 為:Plugin: Permission for maven-snapshot-check-plugin 。
通過檢視它可以看出該 PR 增加了一個檔案:permissions/plugin-maven-snapshot-check.yml ,其內容如下:
name: "maven-snapshot-check"
github: "jenkinsci/maven-snapshot-check-plugin"
paths:
- "org/jenkins-ci/plugins/maven-snapshot-check"
developers:
- "donhui"
複製程式碼
在建立 PR 後,會有幫助說明以及 checklist 讓提交人對該 PR 進行檢查確認。
等這個 PR 被審批後,外掛開發者就會擁有該外掛的釋出許可權。
釋出外掛
前提
要先確認擁有釋出該外掛的許可權。
Maven 要使用的 Artifactory 憑據
需要告訴 Maven 訪問 Artifactory 的憑據。
登入 Artifactory ,從使用者 profile 中獲取加密的密碼
。
在 ~/.m2/settings.xml
檔案配置 server 認證資訊,如下所示:
<settings xmlns="https://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>maven.jenkins-ci.org</id>
<username>your_user_name_here</username>
<password>your_encrypted_password_here</password>
</server>
</servers>
</settings>
複製程式碼
配置 GitHub 以接受你的 SSH key
當執行 release 時,Maven Release Plugin 會自動往倉庫推送程式碼, 所以需要配置 GitHub 以接受你的 SSH key 。
更多資訊可以參考:GitHub help on SSH 。
執行釋出
當 GitHub 和 Maven 憑據配置好後,執行一次釋出應該很簡單,只需要執行下面的命令:
mvn release:prepare release:perform
複製程式碼
可能在執行釋出時會遇到 "401 Unauthorized" 或 "403 Forbidden" 之類問題,這一般是 settings.xml 配置問題或是沒有上傳許可權。一些公共的問題處理方案可以檢視:HostingPlugins-Workingaroundcommonissues。
外掛釋出後,8 小時內,將可以在外掛更新中心看到它。
筆者所寫的 maven-snapshot-check 外掛, 在外掛列表頁的地址為:plugins.jenkins.io/maven-snaps… 。
Jenkins 例項的外掛管理頁面的「可選外掛」選項截圖如下:
為外掛分類
在 Jenkins 外掛列表頁面,可以對外掛進行分類顯示。
要為外掛新增一個分類,需要向 jenkins-infra/update-center2 倉庫提交一個 PR 。 筆者所提交的 PR 為:add maven-snapshot-check category 。
通過檢視它可以看出該 PR 在 src/main/resources/label-definitions.properties
檔案增加了一行,如下所示:
maven-snapshot-check=builder
複製程式碼
總結
兩天的 Jenkins 外掛開發之旅(尤其是 04.24 晚上花了很多時間), 讓筆者瞭解了外掛開發的基本知識,並在託管外掛的過程中學到一些知識。 然後在週末花了幾個小時總結回顧,並將它寫成文件。 同時也希望此文能給 Jenkins 外掛開發者入門帶來一點幫助!
參考
作者:王冬輝