通過這份 Jenkins 分步教學,構建持續整合和持續交付(CI/CD)流水線。
在我的文章《》中,我分享了一個從頭開始構建 DevOps 流水線的故事。推動該計劃的核心技術是 Jenkins,這是一個用於建立持續整合和持續交付(CI/CD)流水線的開源工具。
在花旗,有一個單獨的團隊為專用的 Jenkins 流水線提供穩定的主從節點環境,但是該環境僅用於品質保證(QA)、構建階段和生產環境。開發環境仍然是非常手動的,我們的團隊需要對其進行自動化以在加快開發工作的同時獲得盡可能多的靈活性。這就是我們決定為 DevOps 建立 CI/CD 流水線的原因。Jenkins 的開源版本由於其靈活性、開放性、強大的外掛功能和易用性而成為顯而易見的選擇。
在本文中,我將分步演示如何使用 Jenkins 構建 CI/CD 流水線。
在進入本教學之前,了解有關 CI/CD 流水線的知識會很有幫助。
首先,了解 Jenkins 本身並不是流水線這一點很有幫助。只是建立一個新的 Jenkins 作業並不能構建一條流水線。可以把 Jenkins 看做一個遙控器,在這裡點選按鈕即可。當你點選按鈕時會發生什麼取決於遙控器要控制的內容。Jenkins 為其他應用程式 API、軟體庫、構建工具等提供了一種插入 Jenkins 的方法,它可以執行並自動化任務。Jenkins 本身不執行任何功能,但是隨著其它工具的插入而變得越來越強大。
流水線是一個單獨的概念,指的是按順序連線在一起的事件或作業組:
“流水線”是可以執行的一系列事件或作業。
理解流水線的最簡單方法是視覺化一系列階段,如下所示:
在這裡,你應該看到兩個熟悉的概念:階段和步驟。
在上面的範例圖中,階段 1 可以命名為 “構建”、“收集資訊”或其它名稱,其它階段塊也可以採用類似的思路。“步驟”只是簡單地說放上要執行的內容,它可以是簡單的列印命令(例如,echo "Hello, World"
)、程式執行命令(例如,java HelloWorld
)、shell 執行命令( 例如,chmod 755 Hello
)或任何其他命令,只要通過 Jenkins 環境將其識別為可執行命令即可。
Jenkins 流水線以編碼指令碼的形式提供,通常稱為 “Jenkinsfile”,儘管可以用不同的檔名。下面這是一個簡單的 Jenkins 流水線檔案的範例:
// Example of Jenkins pipeline scriptpipeline { stages { stage("Build") { steps { // Just print a Hello, Pipeline to the console echo "Hello, Pipeline!" // Compile a Java file. This requires JDKconfiguration from Jenkins javac HelloWorld.java // Execute the compiled Java binary called HelloWorld. This requires JDK configuration from Jenkins java HelloWorld // Executes the Apache Maven commands, clean then package. This requires Apache Maven configuration from Jenkins mvn clean package ./HelloPackage // List the files in current directory path by executing a default shell command sh "ls -ltr" } } // And next stages if you want to define further... } // End of stages} // End of pipeline
從此範例指令碼很容易看到 Jenkins 流水線的結構。請注意,預設情況下某些命令(如 java
、javac
和 mvn
)不可用,需要通過 Jenkins 進行安裝和設定。 因此:
Jenkins 流水線是一種以定義的方式依次執行 Jenkins 作業的方法,方法是將其編碼並在多個塊中進行結構化,這些塊可以包含多個任務的步驟。
好。既然你已經了解了 Jenkins 流水線是什麼,我將向你展示如何建立和執行 Jenkins 流水線。在本教學的最後,你將建立一個 Jenkins 流水線,如下所示:
為了便於遵循本教學的步驟,我建立了一個範例 GitHub 儲存庫和一個視訊教學。
開始本教學之前,你需要:
java jar
)。這是利用本教學中使用的 Java Web Archive(WAR)版本的 Jenkins 所必需的(儘管你可以使用任何其他發行版)。讓我們開始吧。
導航到 Jenkins 下載頁面。向下捲動到 “Generic Java package (.war)”,然後單擊下載檔案;將其儲存在易於找到的位置。(如果你選擇其他 Jenkins 發行版,除了步驟二之外,本教學的其餘步驟應該幾乎相同。)使用 WAR 檔案的原因是它是個一次性可執行檔案,可以輕鬆地執行和刪除。
開啟一個終端視窗,並使用 cd <your path>
進入下載 Jenkins 的目錄。(在繼續之前,請確保已安裝 JDK 並將其新增到環境路徑。)執行以下命令,該命令將 WAR 檔案作為可執行二進位制檔案執行:
java -jar ./jenkins.war
如果一切順利,Jenkins 應該在預設埠 8080 上啟動並執行。
開啟一個 Web 瀏覽器並導航到 localhost:8080
。除非你有以前安裝的 Jenkins,否則應直接轉到 Jenkins 儀表板。點選 “Create New Jobs”。你也可以點選左側的 “New Item”。
在此步驟中,你可以選擇並定義要建立的 Jenkins 作業型別。選擇 “Pipeline” 並為其命名(例如,“TestPipeline”)。單擊 “OK” 建立流水線作業。
你將看到一個 Jenkins 作業設定頁面。向下捲動以找到 “Pipeline” 部分。有兩種執行 Jenkins 流水線的方法。一種方法是在 Jenkins 上直接編寫流水線指令碼,另一種方法是從 SCM(原始碼管理)中檢索 Jenkins 檔案。在接下來的兩個步驟中,我們將體驗這兩種方式。
要使用直接指令碼執行流水線,請首先從 GitHub 複製該 Jenkinsfile 範例的內容。選擇 “Pipeline script” 作為 “Destination”,然後將該 Jenkinsfile 的內容貼上到 “Script” 中。花一些時間研究一下 Jenkins 檔案的結構。注意,共有三個階段:Build、Test 和 Deploy,它們是任意的,可以是任何一個。每個階段中都有一些步驟;在此範例中,它們只是列印一些隨機訊息。
單擊 “Save” 以保留更改,這將自動將你帶回到 “Job Overview” 頁面。
要開始構建流水線的過程,請單擊 “Build Now”。如果一切正常,你將看到第一個流水線(如下面的這個)。
要檢視流水線指令碼構建的輸出,請單擊任何階段,然後單擊 “Log”。你會看到這樣的訊息。
現在,換個方式:在此步驟中,你將通過從原始碼控制的 GitHub 中複製 Jenkinsfile 來部署相同的 Jenkins 作業。在同一個 GitHub 儲存庫中,通過單擊 “Clone or download” 並複製其 URL 來找到其儲存庫 URL。
單擊 “Configure” 以修改現有作業。捲動到 “Advanced Project Options” 設定,但這一次,從 “Destination” 下拉選單中選擇 “Pipeline script from SCM” 選項。將 GitHub 儲存庫的 URL 貼上到 “Repository URL” 中,然後在 “Script Path” 中鍵入 “Jenkinsfile”。 單擊 “Save” 按鈕儲存。
要構建流水線,回到 “Task Overview” 頁面後,單擊 “Build Now” 以再次執行作業。結果與之前相同,除了多了一個稱為 “Declaration: Checkout SCM” 的階段。
要檢視來自 SCM 構建的流水線的輸出,請單擊該階段並檢視 “Log” 以檢查原始碼控制克隆過程的進行情況。
恭喜你!你已經建立了第一個 Jenkins 流水線!
“但是等等”,你說,“這太有限了。除了列印無用的訊息外,我什麼都做不了。”那沒問題。到目前為止,本教學僅簡要介紹了 Jenkins 流水線可以做什麼,但是你可以通過將其與其他工具整合來擴充套件其功能。以下是給你的下一個專案的一些思路:
學習本文結尾處的任何教學,以了解這些更高階的案例。
在 Jenkins 主面板,點選 “Manage Jenkins”。
有許多可用工具,包括管理外掛、檢視系統紀錄檔等。單擊 “Global Tool Configuration”。
在這裡,你可以新增 JDK 路徑、Git、Gradle 等。設定工具後,只需將該命令新增到 Jenkinsfile 中或通過 Jenkins 指令碼執行即可。
本文為你介紹了使用酷炫的開源工具 Jenkins 建立 CI/CD 流水線的方法。要了解你可以使用 Jenkins 完成的許多其他操作,請在 Opensource.com 上檢視以下其他文章:
你可能對我為你的開源之旅而寫的其他一些文章感興趣: