持续集成(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,这里只是个引子,在此就不过多进行介绍。
第一篇先到这吧,下一篇主要如下面几个问题展开