β

Jenkins 与 Docker 的持续集成实践一

奇虎360-addops 878 阅读
 

持续集成(CI/CD)是一种软件开发实践。用于帮助团队成员频繁、快速的集成,测试他们的工作成果,以尽快发现集成错误。 更频繁、更早的集成意味着更早的发现问题。通过持续集成,及时发现和解决代码故障,提高代码质量,减少故障处理成本等等。

常见持续集成工具

目前持续集成的生态越来越完善,工具也有很多,开源的或商业的。如:


我们的选型是 Jenkins,所以我们来看下 Jenkins

Jenkins

Jenkins 特点

Jenkins 几个概念


Jenkins 部署

Jenkins组件其实非常少,安装部署也非常简单。 Jenkins按角色就两类: master节点和slave节点。master安装完成后,在控制台中添加节点即可。

下面以Dcoker的部署方式为例说一下Jenkins的部署:

master 节点

[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]

可以看到第一个是官方提供的,所以我们选择这个即可。

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

slave 节点

yun install java-1.8.0-openjdk
$ useradd -m jenkins -d /home/jenkins
$ passwd jenkins
mkdir /data/jenkins
chown jenkins.jenkins /data/jenkins
sudo usermod -a -G docker 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 是需要安装插件的。那我们需要安装哪些插件呢?

Jenkins 有哪些 Docker 的 Plugins

alt alt

是非常丰富的,但并不是我们都能用的上,所以需要根据你使用的环境和平台来选择适合自己的 plugin 安装就可以了。 每个 plugin 都需要适配 Jenkins 的版本,且每个 plugin 也需要依赖一些其它 plugin,上面都已经做了标注,需要配套来用。

这里介绍几个常用的 Docker 插件


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 镜像常见问题

 
作者:奇虎360-addops
应用运维|运维开发|opsdev|addops|虚拟化|openstack|docker|容器化|k8s|智能运维
原文地址:Jenkins 与 Docker 的持续集成实践一, 感谢原作者分享。

发表评论