1. 程式人生 > >這樣來輕鬆自定義 Jenkins 發行版!

這樣來輕鬆自定義 Jenkins 發行版!

今天,我打算給 Jenkins 管理員和開發者們介紹一個新的工具 Custom WAR Packager。該工具可以打包 Jenkins 的自定義 WAR 發行版、 Docker 映象以及 Jenkinsfile Runner 包。它可以打包 Jenkins、外掛以及配置為開箱即用的發行版。 Custom WAR Packager 是我們曾在一篇部落格-- A Cloud Native Jenkins --中介紹過的無狀態 Jenkins master 工具鏈的一部分。這個工具鏈已在 Jenkins X 中被用於構建 serverless 映象。

 

在這篇文章中,我將會介紹幾種 Custom WAR Packager 常見的使用場景。

 

歷史

 

正如 Jenkins 本身一樣,Custom WAR Packager 開始於一個小的開發工具。在 Jenkins 內執行整合測試很長時間以來都是一個難題。對此,我們有三個主要的框架: Jenkins Test Harness, Acceptance Test Harness, 和 Plugin Compatibility Tester。這些框架都需要一個 Jenkins WAR 檔案來執行測試。但是,假如你想在類似 AWS 一樣的自定義環境中進行 Jenkins 測試呢? 或者,你希望基於 Pluggable Storage 的環境也可以複用 Jenkins 流水線測試,來確保沒有迴歸缺陷,又如何呢?

 

這並不是沒有意義的問題。雲原生 Jenkins、Jenkins Evergreen 以及 Jenkins X, 這些 Jenkins 專案中正在進行的主要活動,都需要大量的整合測試來實現持續交付流程。為了複用已有的框架,我們需要打包一個自帶配置的 WAR 檔案,以便可以在現有的框架中執行整合測試。這正是 Custom WAR Packager 於 2018年4月 建立的原因。到 2018年9月,它相繼支援了 Docker 映象和 Jenkinsfile Runner,後者由 Kohsuke Kawaguchi 建立並由 Nicolas de Loof 完善。

 

揭開面紗

 

Custom WAR Packager 是一個工具,可以作為命令列、Maven 外掛或者 Docker 程式包來用。該工具可以從使用者處獲取配置,並根據使用者請求進行打包。所有內容都由一個 YAML 配置檔案管理:

 

 

該工具支援多種輸入型別。外掛列表可以來自 YAML,pom.xml 或一個 BOM(jep:309[] 提出的 Bill of Materials) 檔案。Custom WAR Packager 不僅支援釋出版本,還可以構建部署到 增量倉庫 (Jenkins 核心及外掛的 CD 流程 - jep:305[]),甚至直接從 Git 或指定目錄中構建。它允許從任何來源構建包,而無需等待官方版本。由於外掛已經通過 Commit ID 快取到了本地的 Maven 倉庫中,因此其構建過程也非常快。

 

自定義Custom WAR Packager 還支援下面的配置選項:

 

  • Jenkins 配置即程式碼 的 YAMl 檔案

  • Groovy Hooks (例如:預配置的 init hooks)

  • 系統屬性

 

WAR打包

 

每當這個庫構建時會打包出來一個 WAR 檔案。通常,Custom WAR Packager 會根據下面對 Jenkins 核心和 JCasC 的配置把所有內容打包的一個 WAR 檔案中。

 

樣例配置:

 

bundle:  groupId: "io.jenkins.tools.war-packager.demo"
  artifactId: "blogpost-demo"
  vendor: "Jenkins project"
  description: "Just a demo for the blogpost"war:  groupId: "org.jenkins-ci.main"
  artifactId: "jenkins-war"
  source:    version: 2.138.2plugins:
  - groupId: "io.jenkins"
    artifactId: "configuration-as-code"
    source:      # Common release
      version: 1.0-rc2
  - groupId: "io.jenkins"
    artifactId: "artifact-manager-s3"
    source:      # Incrementals
      version: 1.2-rc259.c9d60bf2f88c
  - groupId: "org.jenkins-ci.plugins.workflow"
    artifactId: "workflow-job"
    source:      # Git
      git: https://github.com/jglick/workflow-job-plugin.git
      commit: 18d78f305a4526af9cdf3a7b68eb9caf97c7cfbc
  # etc.systemProperties:    jenkins.model.Jenkins.slaveAgentPort: "9000"
    jenkins.model.Jenkins.slaveAgentPortEnforce: "true"groovyHooks:
  - type: "init"
    id: "initScripts"
    source:      dir: src/main/groovycasc:
  - id: "jcasc"
    source:      dir: casc.yml

 

Docker 打包

 

為了打包 Docker,Custom WAR Packager 使用官方的 Docker 映象 jenkins/jenkins 或同樣格式的其他映象。在構建期間,WAR 檔案會被該工具構建的檔案所替換。這也就意味著映象的 所有 特色在該自定義構建中都可用: plugins.txt, Java 選項, Groovy hooks 等等。

 

## ...## WAR configuration from above## ...buildSettings:  docker:    build: true
    # Base image
    base: "jenkins/jenkins:2.138.2"
    # Tag to set for the produced image
    tag: "jenkins/custom-war-packager-casc-demo"

 

例如:示例 展示了打包帶有將構建日誌儲存到 Elasticsearch 的 Docker 映象。 儘管這些已經作為了 jep:207 和 jep:210 的一部分,你還是可以檢視這個示例,瞭解該 Docker 映象是如何配置、連線到 Elasicsearch、然後啟動外部的日誌儲存,而不需要改變日誌的介面。一個 Docker Compose 檔案對於執行整個叢集是必要的。

 

Jenkinsfile Runner 打包

 

這可能是 Jenkinsfile Runner 最微妙的模式。三月,在開發者列表中 宣佈了一個新的專案 Jenkinsfile Runner。大體的思路是,支援在單一 master 上只執行一次並列印輸出到控制檯的 Jenkins 流水線。 Jenkinsfile Runner 作為命令或一個 Docker 映象來執行。雖然只推薦 Docker 的形式,但是 Custom WAR Packager 都能夠生成。使用 Jenkinsfile Runner ,你可以像下面的方式來執行流水線:

 

docker run --rm -v $PWD/Jenkinsfile:/workspace/Jenkinsfile acmeorg/jenkinsfile-runner

 

當我們開始在雲原生特別興趣小組(Cloud Native SIG)中研究無狀態(也就是“一次”)時,有一個想法就是使用 Custom WAR Packager 和其他已有的工具(Jenkinsfile Runner, Jenkins Configuration as Code 等)來實現。也許只是替換 Jenkinsfile Runner 中的 Jenkins 核心的 JAR 以及外掛,但這還不夠。為了高效,Jenkinsfile Runner 映象應該啟動得 很快。在構建流程實現中,我們使用了 Jenkins 和 Jenkinsfile Runner 一些實驗性的選項,包括:類載入預快取、外掛解壓等等。有了這些後,Jenkins 使用 configuration-as-code 和幾十個外掛可以在幾秒鐘內啟動。

 

那麼,如何構建自定義 Jenkinsfile Runner 映象呢?儘管目前還沒有釋出,但這不會影響我們繼續實現上文提到的內容。

 

##...## WAR Configuration from above##...buildSettings:  jenkinsfileRunner:    source:      groupId: "io.jenkins"
      artifactId: "jenkinsfile-runner"
      build:        noCache: true
      source:        git: https://github.com/jenkinsci/jenkinsfile-runner.git
        commit: 8ff9b1e9a097e629c5fbffca9a3d69750097ecc4
    docker:      base: "jenkins/jenkins:2.138.2"
      tag: "onenashev/cwp-jenkinsfile-runner-demo"
      build: true

 

你可以從 這裡 找到用 Custom WAR Packager 打包 Jenkinsfile Runner 的例子。

 

更多資訊

 

還有很多其他的特色沒有在本文中提到。例如:它還可以修改 Maven 構建配置或增加、替換 Jenkins 核心中的庫(例如:Remoting)。請檢視 Custom WAR Packager 文件 獲取更多資訊和示例。

 

如果你有興趣對這個庫做貢獻,請建立 PR 並抄送 @oleg-nenashev 和 Raul Arabaolaza。(編者注:Raul Arabaolaza 是第二位正在研究 Jenkins 自動化測試流程的維護者。)

下一步

 

還有很多值得改進的地方可以使這個工具更加高效:

 

  • 增加對外掛依賴傳遞的檢查以便在構建過程中發現衝突

  • 允許在 YAML 配置檔案中設定各種系統屬性和 Java 選項

  • 改進 Jenkinsfile Runner 的效能

  • 整合到 Jenkins 整合測試流程中,(檢視 Jenkins 流水線庫中的 essentialsTest())

 

即使目前,該工具已經能夠讓 Jenkins 使用者構建他們自己的發行版,從理論上來講,仍有許多其他任務可以在 Custom WAR Packager 中實現。