【編者的話】持續集成(CI/CD)是一種軟件開發實踐。用於幫助團隊成員頻繁、快速的集成,測試他們的工做成果,以儘快發現集成錯誤。 更頻繁、更早的集成意味着更早的發現問題。經過持續集成,及時發現和解決代碼故障,提升代碼質量,減小故障處理成本等等。java
目前持續集成的生態愈來愈完善,工具也有不少,開源的或商業的。如:git
咱們的選型是Jenkins,因此咱們來看下Jenkins。docker
Pipeline 流水線即代碼(Pipeline as Code),經過編碼而非配置持續集成/持續交付(CI/CD)運行工具的方式定義部署。流水線使得部署是可重現、可重複的;數據庫
流水線包括節點(Node)、階段(Stage)和步驟(Step)。api
流水線執行在節點上。節點是Jenkins安裝的一部分。流水線一般包含多個階段。一個階段包含多個步驟。流水線上手指南能夠查看到更多的內容。瀏覽器
node在Pipeline中的context中,node是job運行的地方。 node會給job建立一個工做空間。工做空間就是一個文件目錄,這是爲了不跟資源相關的處理互相產生影響。工做空間是node建立的,在node裏的全部step都執行完畢後會自動刪除。app
stage階段,stage是一個任務執行過程的獨立的而且惟一的邏輯塊,Pipeline定義在語法上就是由一系列的stage組成的。 每個stage邏輯都包含一個或多個step。ssh
step步驟,一個step是整個流程中的一系列事情中的一個獨立的任務,step是用來告訴Jenkins如何作。curl
Jenkinfile Jenkins支持建立流水線。它使用一種基於Groovy的流水線領域特定語言(Pipeline DSL)的簡單腳。而這些腳本,一般名字叫Jenkinsfile。它定義了一些根據指定參數執行簡單或複雜的任務的步驟。流水線建立好後,能夠用來構建代碼,或者編排從代碼提交到交付過程當中所需的工做。Jenkins中的Jenkinsfile有點相似Docker中的Dockfile的感受
Jenkins組件其實很是少,安裝部署也很是簡單。 Jenkins按角色就兩類: master節點和slave節點。master安裝完成後,在控制檯中添加節點便可。
下面以Dcoker的部署方式爲例說一下Jenkins的部署:
Master節點
查看 docker hub 中 jenkins 的 image[root@k3128v /home/huomingming]# docker search jenkinsNAME DESCRIPTION STARS OFFICIAL AUTOMATEDjenkins Official Jenkins Docker image 2600 [OK] stephenreed/jenkins-java8-maven-git Automated build that provides a continuous... 53
能夠看到第一個是官方提供的,因此咱們選擇這個便可。
拉取jenkins imagedocker pull jenkins
啓動Jenkins容器
Jenkins沒有數據庫,全部數據都是存放在文件中的,首先在本地建立Jenkins數據目錄,用於保存Jenkins的數據 這個目錄須要按期的備份,用於容災(當前Jenkins容器所在節點因爲不可抗因素沒法使用時,能夠在新機器上使用備份的數據啓動新的jenkins master節點)。sudo mkdir /var/jenkins sudo chown 1000:1000 /var/jenkins sudo docker run -p 8080:8080 -p 50000:50000 -v /var/jenkins:/var/jenkins_home --name my_jenkins -d jenkins
這樣Jenkins就成功跑起來了。能夠直接經過機器的8080端口訪問Jenkins,本地的/var/jenkins就至關於容器裏Jenkins用戶的用戶主目錄,因此要保證該目錄的權限爲uid爲j1000的用戶目錄。
配置Jenkins
啓動完 jenkins master 後,在瀏覽器中數據輸入 http://jenkins_master_ip:8080 登陸Jenkins控制檯進行接下來的安裝和配置。 具體圖就不貼出來了。
查看Jenkins的版本java -jar /usr/share/jenkins/jenkins.war --version
slave 節點
安裝Java JDKyun install java-1.8.0-openjdk
建立Jenkins用戶$ useradd -m jenkins -d /home/jenkins$ passwd jenkins
建立工做目錄mkdir /data/jenkinschown jenkins.jenkins /data/jenkins
添加Jenkins用戶到Docker用戶組sudo usermod -a -G docker jenkins
配置SSH互信,Master免密碼登錄Slave
Master有多種管理Slave的方式,咱們選擇SSH方式在Master節點中,切換到Jenkins用戶ssh-keygen -t rsa建立祕鑰對把公鑰拷貝到Slave節點scp ~/.ssh/id_rsa.pub jenkins@slave_ip:~/.ssh/authorized_keys
確保在scp前,slave節點根目錄下.ssh目錄已存在chmod 700 authorized_keys
使用Jenkins來構建Docker是須要安裝插件的。那咱們須要安裝哪些插件呢?
Jenkins有哪些Docker的Plugins
這裏介紹幾個經常使用的Docker插件:
Docker Commons Plugin
其基本功能:
Docker Plugins,該插件是將Docker做爲Jenkins的slave來使用,來在Docker容器種完成項目的build,build完成後該容器slave容器就會被銷燬。全部的工做都是在slave容器內完成。docker-build-step
該插件在 build 過程種增長了對 Docker 命令的支持。
Docker Pipeline Plugin,基於Docker Commons Plugin實現的一些上層的基於Docker的Pipeline編排。
Docker Hub Notification Trigger Plugin,該插件提供了當Registry中的image發生變化時觸發build新鏡像的功能。
CloudBees Docker Build and Publish,該插件提供了經過Dockerfile來構建項目並將生成的鏡像上傳到鏡像倉庫的功能。
CloudBees Docker Custom Build Environment,This plugin allows the definition of a build environment for a job using a Docker container。該插件適用於 「自由風格的軟件項目」,如圖:
Kubernetes, This plugin allows Jenkins agents to be dynamically provisioned on a Kubernetes cluster. The aim of the Kubernetes plugin is to be able to use a Kubernetes cluster to dynamically provision a Jenkins agent (using Kubernetes scheduling mechanisms to optimize the loads), run a single build, then tear-down that slave.
與Kubernetes結合,經過Kubernetes提供Jenkins的 slave 節點。利用Kubernetes的調度功能提供快速的啓停 slave 節點執行 build 等任務。目前是0.11版本,穩定性有待驗證。
由於,咱們不是直接在Jenkins的Dashbord來操做, 而是集成到現有平臺,因此咱們須要使用它的API。
Jenkins的Remote API以REST的形式進行提供。例如,咱們搭建的Jenkins站點爲myjenkins.com:8080。那麼,訪問http://myjenkins.… 便可查看到該站點全部可用的API。
查詢操做
<?xml version='1.0' encoding='UTF-8'?><project> <actions/> <description></description> <keepDependencies>false</keepDependencies> <properties/> <scm class="hudson.scm.NullSCM"/> <canRoam>true</canRoam> <disabled>false</disabled> <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding> <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding> <triggers class="vector"/> <concurrentBuild>false</concurrentBuild> <builders/> <publishers/> <buildWrappers/></project>
調用API建立 my_job:curl -X POST http://www.xxx.xxx/jenkins/createItem?name=my_job --user uname:pass --data-binary "my_job_config.xml" -H "Content-Type: application/xml"
而後,你就能夠在Jenkins Dashboard上看到這個job了。它的管理頁面爲myjenkins.com:8080/job/my_job。… /my_job/api/ 便可查看到該job可用的API。
更多的API介紹能夠參考Jenkins的官方wiki,這裏只是個引子,在此就不過多進行介紹。
該篇文章主要是介紹了Jenkins和Docker的持續集成的實現部分,後續還有關於Jenkins的壓測、性能擴展、高可用等,還須要持續深刻的介紹。