Jenkins 外掛開發之旅:兩天內從 idea 到釋出(下篇)

Jenkins中文社群發表於2019-05-13

首發於 Jenkins 中文社群

Jenkins 外掛開發之旅:兩天內從 idea 到釋出(下篇)

本文分上下兩篇,上篇介紹了從產生 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.pluginsorg.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 社群帳號, 它可以讓你訪問 JIRAwikiMaven 倉庫

發起託管請求

注意: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 外掛開發之旅:兩天內從 idea 到釋出(下篇)

為外掛分類

在 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 外掛開發者入門帶來一點幫助!

參考

作者:王冬輝

Jenkins 外掛開發之旅:兩天內從 idea 到釋出(下篇)

相關文章