Jenkins與Docker的持續集成實踐

【編者的話】持續集成(CI/CD)是一種軟件開發實踐。用於幫助團隊成員頻繁、快速的集成,測試他們的工做成果,以儘快發現集成錯誤。 更頻繁、更早的集成意味着更早的發現問題。經過持續集成,及時發現和解決代碼故障,提升代碼質量,減小故障處理成本等等。java

【3 天燒腦式基於Docker的CI/CD實戰訓練營 | 北京站】本次培訓圍繞基於Docker的CI/CD實戰展開,具體內容包括:持續集成與持續交付(CI/CD)概覽;持續集成系統介紹;客戶端與服務端的 CI/CD 實踐;開發流程中引入 CI、CD;Gitlab 和 CI、CD 工具;Gitlab CI、Drone 的使用以及實踐經驗分享等。node

常見持續集成工具

目前持續集成的生態愈來愈完善,工具也有不少,開源的或商業的。如:git

  • 最最流行的,也是使用最多的Jenkins
  • 有着持續集成DNA的ThoughtWorks GO。理念:"Deployment as pipeline" (華爲容器平臺應該是基於GO作的二次開發實現)
  • Atlassian工具鏈之一的Bamboo
  • 與Gitlab緊密集成的Gitlab CI
  • 專爲開源打造的Travis CI,與Github緊密集成
  • 使用Python語言實現的Buildbot,相信Pythoner看到會喜歡

咱們的選型是Jenkins,因此咱們來看下Jenkins。docker

Jenkins

Jenkins特色

  • Jenkins是開源的應用最普遍的持續集成工具,支持CI, CD;
  • Jenkins有不少插件,並且用戶也能夠自定義插件,可擴展性很是強;
  • Jenkins對Docker支持很是好,有一套完善的Docker插件;
  • Jenkins 2.0開始支持Pipeline,一個很是強大的插件,使用基於Groovy的DSL,支持CI/CD流水線;
  • Jenkins基於Java語言開發;

Jenkins幾個概念

  • Master是Jenkins安裝和運行的地方,它負責解析job腳本,處理任務,調度計算資源;
  • Agent 負責處理從Master分發的任務;
  • Executor就是執行任務的計算資源,它能夠在Master或者Agent上運行。多個Executor也能夠合做執行一些任務;
  • job 任務,用來定義具體的構建過程;
  • Groovy是一種基於JVM(Java虛擬機)的敏捷開發語言,它結合了Python、Ruby和Smalltalk的許多強大的特性,Groovy代碼可以與Java代碼很好地結合,也能用於擴展示有代碼。因爲其運行在 JVM 上的特性,Groovy可使用其餘Java語言編寫的庫。Jenkins用Groovy做爲DSL;
  • 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組件其實很是少,安裝部署也很是簡單。 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 image
docker 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 JDK
yun 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


是很是豐富的,但並非咱們都能用的上,因此須要根據你使用的環境和平臺來選擇適合本身的Plugin安裝就能夠了。 每一個Plugin都須要適配 Jenkins的版本,且每一個Plugin也須要依賴一些其它Plugin,上面都已經作了標註,須要配套來用。

這裏介紹幾個經常使用的Docker插件:

Docker Commons Plugin

其基本功能:

  • API for managing Docker image and container fingerprints
  • Credentials and location of Docker Registry
  • Credentials and location of Docker Daemon (aka Docker Remote API)
  • ToolInstallation for Docker CLI clients
  • DockerImageExtractor extension point to get Docker image relations from jobs
  • Simple UI referring related image fingerprints in Docker builds

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。該插件適用於 「自由風格的軟件項目」,如圖:


CloudBees Docker Traceability,用於追蹤經過Jenkins啓停的容器的事件。

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有沒有API?

由於,咱們不是直接在Jenkins的Dashbord來操做, 而是集成到現有平臺,因此咱們須要使用它的API。

Jenkins的Remote API以REST的形式進行提供。例如,咱們搭建的Jenkins站點爲myjenkins.com:8080。那麼,訪問http://myjenkins.… 便可查看到該站點全部可用的API。

查詢操做


執行一些動做

例如,我要建立一個 job,名字爲 my_job,my_job的配置文件:
<?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的壓測、性能擴展、高可用等,還須要持續深刻的介紹。

原文連接:dockone.io/article/259…

相關文章
相關標籤/搜索