Jenkins 與 Docker 的持續集成實踐一

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

常見持續集成工具

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

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

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

Jenkins

Jenkins 特色

  • Jenkins是開源的應用最普遍的持續集成工具,支持CI, CD;
  • Jenkins有不少插件,並且用戶也能夠自定義插件,可擴展性很是強;
  • Jenkins對Docker支持很是好,有一套完善的Docker插件;
  • Jenkins2.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)運行工具的方式定義部署。流水線使得部署是可重現、可重複的;python

    流水線包括節點(Node)、階段(Stage)和步驟(Step)。流水線執行在節點上。節點是Jenkins安裝的一部分。流水線一般包含多個階段。一個階段包含多個步驟。流水線上手指南能夠查看到更多的內容。git

    • node 在Pipeline中的context中,node是 job 運行的地方。 node會給job建立一個工做空間。工做空間就是一個文件目錄,這是爲了不跟資源相關的處理互相產生影響。工做空間是node建立的,在node裏的全部step都執行完畢後會自動刪除。
    • stage 階段,stage是一個任務執行過程的獨立的而且惟一的邏輯塊,pipeline定義在語法上就是由一系列的stage組成的。 每個stage邏輯都包含一個或多個step。
    • step 步驟,一個step是整個流程中的一系列事情中的一個獨立的任務,step是用來告訴Jenkins如何作。
  • Jenkinfile Jenkins支持建立流水線。它使用一種基於Groovy的流水線領域特定語言(Pipeline DSL)的簡單腳。而這些腳本,一般名字叫Jenkinsfile。它定義了一些根據指定參數執行簡單或複雜的任務的步驟。流水線建立好後,能夠用來構建代碼,或者編排從代碼提交到交付過程當中所需的工做。Jenkins中的Jenkinsfile有點相似Docker中的Dockfile的感受github

Jenkins 部署

Jenkins組件其實很是少,安裝部署也很是簡單。 Jenkins按角色就兩類: master節點和slave節點。master安裝完成後,在控制檯中添加節點便可。docker

下面以Dcoker的部署方式爲例說一下Jenkins的部署:數據庫

master 節點

  • 查看 docker hub 中 jenkins 的 image
[root@k3128v /home/huomingming]# docker search jenkins
NAME                                  DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
jenkins                               Official Jenkins Docker image                   2600      [OK]       
stephenreed/jenkins-java8-maven-git   Automated build that provides a continuous...   53                   [OK]
killercentury/jenkins-dind            Generic Jenkins CI with Docker Engine and ...   24                   [OK]
aespinosa/jenkins                     Sets up a container with jenkins installed...   22                   [OK]
cloudbees/jenkins-enterprise          CloudBees Jenkins Enterprise (Rolling rele...   18                   [OK]
blacklabelops/jenkins                 Docker Jenkins Swarm-Ready with HTTPS and ...   7                    [OK]
appcontainers/jenkins                 Centos/Debian/Ubuntu Based Customizable Je...   7                    [OK]
tianon/jenkins-slave                  SSHd, Java, and Docker-in-Docker specifica...   6                    [OK]
fabric8/jenkins-docker                Fabric8 Jenkins Docker Image                    4                    [OK]
blacklabelops/jenkins-swarm           Jenkins Swarm Slave Dockerized and Paramet...   4                    [OK]
eeacms/jenkins-slave                  Jenkins slave ready to run Docker image (J...   3                    [OK]
publicisworldwide/jenkins-slave       Jenkins Slave based on Oracle Linux             3                    [OK]
bitnami/jenkins                       Bitnami Docker Image for Jenkins                1                    [OK]
foxylion/jenkins                      Jenkins 2 with automated setup to support ...   1                    [OK]
enieuw/jenkins                        Jenkins                                         1                    [OK]
mrbobbytables/jenkins                 Jenkins CI container with Mesos integration     1                    [OK]
marcelhuberfoo/jenkins                jenkins build server docker image               1                    [OK]
garethjevans/jenkins                  Jenkins docker image with additional plugins    0                    [OK]
openfrontier/jenkins                  The official Jenkins docker plus some plug...   0                    [OK]
unox/jenkins                          Jenkins, with the jenkins user added to th...   0                    [OK]
oleksandrberezianskyi/jenkins         Jenkins image build on Debian 8 with Oracl...   0                    [OK]
brimstone/jenkins                     Jenkins, with docker, in docker.                0                    [OK]
indec/jenkins                         Docker image for custom jenkins container       0                    [OK]
dockersolutions/jenkins               Jenkins image used for SE demos                 0                    [OK]
virtuasphere/jenkins                  jenkins                                         0                    [OK]

能夠看到第一個是官方提供的,因此咱們選擇這個便可。api

  • 拉取 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/jenkins
chown jenkins.jenkins /data/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

altalt

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

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

  • Docker Commons Plugin

    是全部Docker Plugins的基礎

    其基本功能:

    • 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 Commons Plugin

  • Docker Plugin

    該插件是將 docker 做爲 jenkins 的 slave 來使用,來在 docker 容器種完成項目的build,build 完成後該容器 slave 容器就會被銷燬。全部的工做都是在 slave 容器內完成。

    更多使用細節 Docker Plugin

  • docker-build-step

    該插件在 build 過程種增長了對 Docker 命令的支持。

    更多使用細節docker-build-step

  • Docker Pipeline Plugin

    基於 Docker Commons Plugin 實現的一些上層的基於 Docker 的 Pipeline 編排

    更多使用細節Docker Pipeline Plugin

  • Docker Hub Notification Trigger Plugin

    該插件提供了當registry中的image發生變化時觸發build新鏡像的功能。

  • CloudBees Docker Build and Publish

    該插件提供了經過 Dockerfile 來構建項目並將生成的鏡像上傳到鏡像倉庫的功能。

    更多使用細節 CloudBees Docker Build and Publish

  • CloudBees Docker Custom Build Environment

    This plugin allows the definition of a build environment for a job using a Docker container.

    該插件適用於 「自由風格的軟件項目」,如圖:alt

    更多使用細節CloudBees Docker Custom Build Environment

  • 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版本,穩定性有待驗證。

    更多使用細節 kubernetes plugin

Jenkins 有沒有 API?

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

Jenkins的Remote API以REST的形式進行提供。

例如,咱們搭建的Jenkins站點爲http://myjenkins.com:8080。

那麼,訪問http://myjenkins.com:8080/api 便可查看到該站點全部可用的API;

查詢操做

alt

執行一些動做

alt

例如,我要建立一個 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 了。它的管理頁面爲http://myjenkins.com:8080/job/my_job, 那麼咱們訪問 http://myjenkins.com:8080/job/my_job/api/ 便可查看到該job可用的API。

更多的 api 介紹能夠參考Jenkins的官方wiki,這裏只是個引子,在此就不過多進行介紹。

第一篇先到這吧,下一篇主要如下面幾個問題展開

Pipeline 和 Jenkinsfile 的使用及如何使用這些 plugins 實現項目構建

Jenkins 的性能,擴展性,高可用

Jenkins 數據監控(天天執行次數、成功、失敗等指標)

Jenkins 壓測

Jenkins 構建 docker 鏡像常見問題

相關文章
相關標籤/搜索