持續集成(CI/CD)是一種軟件開發實踐。用於幫助團隊成員頻繁、快速的集成,測試他們的工做成果,以儘快發現集成錯誤。 更頻繁、更早的集成意味着更早的發現問題。經過持續集成,及時發現和解決代碼故障,提升代碼質量,減小故障處理成本等等。html
目前持續集成的生態愈來愈完善,工具也有不少,開源的或商業的。如:java
咱們的選型是 Jenkins,因此咱們來看下 Jenkinsnode
pipeline 流水線即代碼(Pipeline as Code),經過編碼而非配置持續集成/持續交付(CI/CD)運行工具的方式定義部署。流水線使得部署是可重現、可重複的;python
流水線包括節點(Node)、階段(Stage)和步驟(Step)。流水線執行在節點上。節點是Jenkins安裝的一部分。流水線一般包含多個階段。一個階段包含多個步驟。流水線上手指南能夠查看到更多的內容。git
Jenkinfile Jenkins支持建立流水線。它使用一種基於Groovy的流水線領域特定語言(Pipeline DSL)的簡單腳。而這些腳本,一般名字叫Jenkinsfile。它定義了一些根據指定參數執行簡單或複雜的任務的步驟。流水線建立好後,能夠用來構建代碼,或者編排從代碼提交到交付過程當中所需的工做。Jenkins中的Jenkinsfile有點相似Docker中的Dockfile的感受github
Jenkins組件其實很是少,安裝部署也很是簡單。 Jenkins按角色就兩類: master節點和slave節點。master安裝完成後,在控制檯中添加節點便可。docker
下面以Dcoker的部署方式爲例說一下Jenkins的部署:數據庫
[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
docker pull 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 master 後,在瀏覽器中數據輸入 http://jenkins_master_ip:8080 登陸 Jenkins 控制檯進行接下來的安裝和配置。 具體圖就不貼出來了~~
java -jar /usr/share/jenkins/jenkins.war --version
yun install java-1.8.0-openjdk
$ useradd -m jenkins -d /home/jenkins $ passwd jenkins
mkdir /data/jenkins chown jenkins.jenkins /data/jenkins
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 是須要安裝插件的。那咱們須要安裝哪些插件呢?
是很是豐富的,但並非咱們都能用的上,因此須要根據你使用的環境和平臺來選擇適合本身的 plugin 安裝就能夠了。 每一個 plugin 都須要適配 Jenkins 的版本,且每一個 plugin 也須要依賴一些其它 plugin,上面都已經作了標註,須要配套來用。
這裏介紹幾個經常使用的 Docker 插件
Docker Commons Plugin
是全部Docker Plugins的基礎
其基本功能:
Simple UI referring related image fingerprints in Docker builds
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 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版本,穩定性有待驗證。
更多使用細節 kubernetes plugin
由於,咱們不是直接在 Jenkins 的 Dashbord 來操做, 而是集成到現有平臺,因此咱們須要使用它的API。
Jenkins的Remote API以REST的形式進行提供。
例如,咱們搭建的Jenkins站點爲http://myjenkins.com:8080。
那麼,訪問http://myjenkins.com:8080/api 便可查看到該站點全部可用的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 了。它的管理頁面爲http://myjenkins.com:8080/job/my_job, 那麼咱們訪問 http://myjenkins.com:8080/job/my_job/api/ 便可查看到該job可用的API。
更多的 api 介紹能夠參考Jenkins的官方wiki,這裏只是個引子,在此就不過多進行介紹。
第一篇先到這吧,下一篇主要如下面幾個問題展開