持續(xù)集成和部署方面的3個(gè)優(yōu)秀實(shí)踐
譯文【51CTO.com快譯】 本文介紹了三大主題:自動(dòng)化持續(xù)集成/持續(xù)部署(CI/CD)配置、使用Git代碼倉庫用于常見的CI/CD工件以及參數(shù)化Jenkins管道。
術(shù)語介紹
先不妨定義幾個(gè)術(shù)語。CI/CD是一種讓團(tuán)隊(duì)可以快速自動(dòng)測(cè)試、打包和部署應(yīng)用程序的實(shí)踐。它常常通過利用名為Jenkins的服務(wù)器來實(shí)現(xiàn),該服務(wù)器充當(dāng)CI/CD編排器。Jenkins偵聽特定的輸入(常常是代碼簽入后的Git鉤子),被觸發(fā)后啟動(dòng)管道。
管道由開發(fā)團(tuán)隊(duì)及/或運(yùn)維團(tuán)隊(duì)編寫的代碼組成,這些代碼指示Jenkins在CI/CD過程中執(zhí)行哪些操作。這個(gè)管道常常類似于“構(gòu)建我的代碼,然后測(cè)試代碼,如果那些測(cè)試通過,將我的應(yīng)用程序部署到下一個(gè)***環(huán)境(通常是開發(fā)、測(cè)試或生產(chǎn)環(huán)境)。”企業(yè)常常有更復(fù)雜的管道,結(jié)合工件倉庫和代碼分析器之類的工具,但這提供了大體例子。
我們已搞明白了關(guān)鍵術(shù)語,不妨深入了解幾個(gè)***實(shí)踐。
1. 自動(dòng)化是關(guān)鍵
想在PaaS上運(yùn)行CI/CD,需要在集群上配置適當(dāng)?shù)幕A(chǔ)設(shè)施。在這個(gè)例子中,我將使用OpenShift。
很容易實(shí)現(xiàn)“Hello, World”。只要運(yùn)行oc new-app jenkins-
最終,可能需要復(fù)制部署CI/CD組件所需的手動(dòng)步驟,你可能不是執(zhí)行那些步驟的人。為了確保生成結(jié)果時(shí)快速、無錯(cuò)誤、并與以前一模一樣,應(yīng)該在創(chuàng)建基礎(chǔ)設(shè)施的方式中包含自動(dòng)化方法。這可以是Ansible playbook、Bash腳本或者希望自動(dòng)部署CI/CD基礎(chǔ)設(shè)施的任何其他方式。
我使用Ansible和OpenShift-Applier角色來自動(dòng)化我的實(shí)現(xiàn)。你可能覺得這些工具很有價(jià)值,也可能覺得別的工具更適合你和貴企業(yè)。無論怎樣,你會(huì)發(fā)現(xiàn)自動(dòng)化大大減少了重新創(chuàng)建CI/ CD組件所需的工作量。
配置Jenkins主節(jié)點(diǎn)
除了一般的“自動(dòng)化”外,我想單單挑出Jenkins主節(jié)點(diǎn),談?wù)劰芾韱T可以利用OpenShift自動(dòng)化Jenkins配置的幾種方法。來自Red Hat Container Catalog中的Jenkins映像隨附安裝了OpenShift-Sync插件(https://github.com/openshift/jenkins-sync-plugin)。
想創(chuàng)建Jenkins管道,要?jiǎng)?chuàng)建類似這樣的OpenShift BuildConfig:
- apiVersion: v1
- kind: BuildConfig
- ...
- spec:
- source:
- git:
- ref: master
- uri: <repository-uri>
- ...
- strategy:
- jenkinsPipelineStrategy:
- jenkinsfilePath: Jenkinsfile
- type: JenkinsPipeline
OpenShift-Sync插件會(huì)注意到,擁有策略jenkinsPipelineStrategy的BuildConfig已創(chuàng)建,可將它轉(zhuǎn)換成Jenkins管道,從Git源代碼指定的Jenkinsfile來獲取。還可以使用內(nèi)聯(lián)式Jenkinsfile,而不是從Git代碼倉庫來獲取一個(gè)。欲知詳情,請(qǐng)參閱說明文檔。
想創(chuàng)建Jenkins從節(jié)點(diǎn),創(chuàng)建以下列定義開始的OpenShift ImageStream:
- apiVersion: v1
- kind: ImageStream
- metadata:
- annotations:
- slave-label: jenkins-slave
- labels:
- role: jenkins-slave
- …
請(qǐng)注意這個(gè)ImageStream中定義的元數(shù)據(jù)。OpenShift-Sync插件會(huì)將標(biāo)簽是role: jenkins-slave的任何ImageStream轉(zhuǎn)換成Jenkins從節(jié)點(diǎn)。Jenkins從節(jié)點(diǎn)將以來自slave-label標(biāo)注的值命名。
ImageStreams非常適合簡(jiǎn)單的Jenkins從節(jié)點(diǎn)配置,但是一些團(tuán)隊(duì)發(fā)現(xiàn)有必要配置一些基本細(xì)節(jié),比如資源限制、就緒和活性探針以及實(shí)例上限。這時(shí)ConfigMaps可以派上用場(chǎng):
- apiVersion: v1
- kind: ConfigMap
- metadata:
- labels:
- role: jenkins-slave
- ...
- data:
- template1: |-
- <Kubernetes pod template>
注意仍需要role: jenkins-slave標(biāo)簽將ConfigMap轉(zhuǎn)換成Jenkins從節(jié)點(diǎn)。Kubernetes pod模塊包括一段很長(zhǎng)的XML,可根據(jù)貴企業(yè)的喜好來配置每個(gè)細(xì)節(jié)。想查看該XML以及將ImageStreams和ConfigMaps轉(zhuǎn)換成Jenkins從節(jié)點(diǎn)方面的更多信息,請(qǐng)參閱說明文檔。
從上面三個(gè)例子中可以看出,沒有一項(xiàng)操作要求管理員手動(dòng)更改Jenkins控制臺(tái)。通過使用OpenShift資源,Jenkins能以一種輕松自動(dòng)化的方式來配置。
2. 共享就是關(guān)愛
第二個(gè)***實(shí)踐是維護(hù)常見CI/CD工件的Git倉庫。主要想法是,防止團(tuán)隊(duì)重新發(fā)明輪子。設(shè)想你的團(tuán)隊(duì)需要執(zhí)行藍(lán)/綠部署到OpenShift環(huán)境的工作,作為管道的CD階段的一部分。團(tuán)隊(duì)中負(fù)責(zé)編寫管道的成員可能不是OpenShift專家,他們也沒能力從頭開始編寫這種功能。幸好,有人已經(jīng)編寫了一個(gè)將該功能整合到常見CI/CD倉庫中的函數(shù),因此你的團(tuán)隊(duì)可以使用該函數(shù),而不是花時(shí)間編寫一個(gè)。
在此基礎(chǔ)上更進(jìn)一步,貴企業(yè)可能決定要維護(hù)整條管道。你可能發(fā)現(xiàn),團(tuán)隊(duì)在編寫功能相似的管道。那些團(tuán)隊(duì)使用一條來自共同倉庫的參數(shù)化管道而不是各自從頭開始編寫會(huì)來得更高效。
3. 少就是多
如上所述,第三條***實(shí)踐是參數(shù)化CI/CD管道。參數(shù)化可防止管道泛濫,使你的CI/CD系統(tǒng)更容易維護(hù)。設(shè)想我有多個(gè)地區(qū)來部署應(yīng)用程序。要是沒有參數(shù)化,每個(gè)地區(qū)都需要一條不同的管道。
想?yún)?shù)化編寫成OpenShift構(gòu)建配置的管道,將env這節(jié)添加到配置中:
- ...
- spec:
- ...
- strategy:
- jenkinsPipelineStrategy:
- env:
- - name: REGION
- value: US-West
- jenkinsfilePath: Jenkinsfile
- type: JenkinsPipeline
有了這個(gè)配置,我可以將REGION這個(gè)參數(shù)傳遞給管道,以便將應(yīng)用程序部署到指定的地區(qū)。
一些企業(yè)可能決定將CI/CD管道分成獨(dú)立的CI管道和CD管道,通常是由于在部署之前要有某個(gè)審批環(huán)節(jié)。設(shè)想我有四個(gè)映像和三個(gè)不同的環(huán)境要部署。要是沒有參數(shù)化,我需要12條CD管道以支持所有的部署方案。這很快就會(huì)失控。為了讓CD管道的維護(hù)更容易,企業(yè)會(huì)發(fā)現(xiàn)參數(shù)化映像和環(huán)境、好讓一條管道執(zhí)行多條管道的工作來得更明智。
結(jié)束語
企業(yè)層面的CI/CD往往比許多企業(yè)預(yù)料的來得復(fù)雜。幸好有了Jenkins,有好多方法可以無縫提供自動(dòng)化機(jī)制。維護(hù)常見CI/CD工件的Git倉庫也會(huì)簡(jiǎn)化工作,因?yàn)閳F(tuán)隊(duì)可以從維護(hù)的依賴項(xiàng)來獲取,而不是從頭開始自行編寫。***,參數(shù)化CI/CD管道將減少需要維護(hù)的管道的數(shù)量。
原文標(biāo)題:3 best practices for continuous integration and deployment,作者:Austin Dewey
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】