DevOps 是 Development 和 Operations 的组合,也就是开发和运维的简写。DevOps 是针对企业中的研发人员、运维人员和测试人员的工作理念,是他们在应用开发、代码部署和质量测试等整条生命周期中协作和沟通的最佳实践,DevOps 强调整个组织的合作以及交付和基础设施变更的自动化、从而实现持续集成、持续部署和持续交付。DevOps 四大平台:代码托管(gitlab/github/gerrit/svn)、项目管理(jira)、运维平台(腾讯蓝鲸/开源平台)、持续交付(Jenkins/gitlab).
Jenkins 是一款开源自动化服务器,结合 web 界面一键部署--自动化构建交付,可用于轻松设置持续集成和持续交付(CI / CD)管道。
持续集成(CI)是DevOps的一种实践,团队成员定期将其代码更改提交到版本控制存储库,然后运行自动构建和测试。 持续交付(CD)是一系列的实践,代码更改会自动生成,测试并部署到生产中。
Jenkins可以作为独立应用程序安装,也可以用APT方式安装。
Devops开发流程
什么是持续集成(CI-Continuous integration):持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代码行合并到一起并切相互不影响工作。
什么是持续部署(CD-continuous deployment):是基于某种工具或平台实现代码自动化的构建、测试和部署到线上环境以实现交付高质量的产品,持续部署在某种程度上代表了一个开发团队的更新迭代速率。目标是始终保证存在一个可交付的仓库。
什么是持续交付(Continuous Delivery):持续交付是在持续部署的基础之上,将产品交付到线上环境,因此持续交付是产品价值的一种交付,是产品价值的一种盈利的实现。
![](https://i-blog.csdnimg.cn/blog_migrate/07da556c204973d01249b95582aed8b5.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/88af65853b2e6b53844c652cc00a5b17.png)
安装环境:
![](https://i-blog.csdnimg.cn/blog_migrate/71b88de91921c019f7c1da0085f6e0cc.png)
APT方式安装Jenkins
sudo apt-get install --reinstall ca-certificates
wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get -y update
sudo apt-get install jenkins
sudo ufw allow 8080
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
安装后,用命令 jenkins --version查看版本信息:
![](https://i-blog.csdnimg.cn/blog_migrate/8121759ef7076b24b2fc16bf07aad826.png)
默认端口是8080,通过http://localhost:8080访问.如果要在受防火墙保护的远程Ubuntu服务器上安装Jenkins,则需要打开端口8080。通常只想允许从特定IP地址或IP范围访问Jenkins服务器。 例如,要仅允许来自“ 192.168.121.0/24”子网的连接,可以运行以下命令:
sudo ufw allow proto tcp from 192.168.121.0/24 to any port 8080
如果需要允许从任何地方访问,请执行以下操作:
sudo ufw allow 8080
Jenkins安装默认插件
要设置新安装的Jenkins,打开浏览器,输入
https://localhost:8080
提示你输入在安装过程中创建的管理员密码, 密码保存在文件/var/lib/jenkins/secrets/initialAdminPassword中。
![](https://i-blog.csdnimg.cn/blog_migrate/af34bf4ec5687a1e6991e9246ec7198f.png)
之后创建管理员账户:
![](https://i-blog.csdnimg.cn/blog_migrate/9f775ad33eab5b4bd8c8ee677eb9d67e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7a9f9ac577511c2252243cf36a6ef595.png)
继续,进入jenkins主页面:
![](https://i-blog.csdnimg.cn/blog_migrate/e75458975115f04c9093565a89c3e65b.png)
此时打开终端,输入命令查案8080端口的使用情况:
sudo lsof -i:8080
![](https://i-blog.csdnimg.cn/blog_migrate/e126e2211122147a51e24c86df09d2d4.png)
安装jenkins插件
Jenkins支持很多的plugin,这些plugin极大地丰富了Jenkins的功能。安装plugin有两种方式:自动安装和手动安装。
自动安装比较简单,直接在jenkins浏览器界面操作,入口是:
进入主页http://localhost:8080/->manage jenkins-> manage plugins-> available plugins
![](https://i-blog.csdnimg.cn/blog_migrate/9b78e4cea60abbdbc496a14cde7f82aa.png)
搜索publish over ssh插件,选择安装
![](https://i-blog.csdnimg.cn/blog_migrate/d67ff0dd009b43901081381dacec0265.png)
继续搜索PostBuildScript插件,用于Jenkins构建后,根据结果,执行shell脚本,可用于集群服务器。
![](https://i-blog.csdnimg.cn/blog_migrate/324d6c4b3dfc7d33125dfb9fefc3f276.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c08425c4286c411e114e563a49c7cfad.png)
新建ITEM:
Jenkins主页选择新建item.
![](https://i-blog.csdnimg.cn/blog_migrate/f323fb81f58f26acbb01231a249e8283.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e3f3284b5d45d48a80894dbcae9eb044.png)
输入一个名字,选择freestyle project.然后继续。
general页输入仓库地址:
![](https://i-blog.csdnimg.cn/blog_migrate/9538cde9f32d96cbc4aea60c9a6c322f.png)
源码管理页选择git,注意,必须要打开Credentials设置仓库账号/密码,否则Jenkins将无法正常访问仓库。
![](https://i-blog.csdnimg.cn/blog_migrate/15fef6a5ceb6794603455e33434780df.png)
用户名和密码正确填写,其它输入有意义的字符串即可。
![](https://i-blog.csdnimg.cn/blog_migrate/ebecf29b4a47db6b65d416f02abd76c6.png)
之后,Credentials选择新添加的账户,红色警告便消失:
![](https://i-blog.csdnimg.cn/blog_migrate/d583b4747444ccfc32da21a40a8bd80a.png)
触发器设置为每15分钟构建一次:
![](https://i-blog.csdnimg.cn/blog_migrate/3efdf94f8a971ef2e6e03af92cddcd1a.png)
构建环境,在LOG中增加时间戳信息。
![](https://i-blog.csdnimg.cn/blog_migrate/d7053b2c8384c0afdf2b971be7bf365f.png)
Build Steps填写增加构建步骤
![](https://i-blog.csdnimg.cn/blog_migrate/5075ede006c30c87f0984b5da01329b4.png)
构建后操作
构建后操作--> Execute scripts --> add generic script file.
![](https://i-blog.csdnimg.cn/blog_migrate/787e1832c8a6f7c1663b3e205b0f8029.png)
我们需要在本地文件系统中提供一个脚本文件,并将文件路径设置到此步骤的配置中。这里只是举例,所以postscript没有做任何有价值的事情,仅仅是输出一行完成信息。
![](https://i-blog.csdnimg.cn/blog_migrate/faf9cfeba722c5685b1763a0b2c49728.png)
![](https://i-blog.csdnimg.cn/blog_migrate/26f662576ca474989627835b59effa5a.png)
设置完成后保存,此时jenkins界面如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/8f9832d25cc24de4aeb214840d1e074a.png)
可以看到我们新建的任务,后面可以触发执行(这里新创建的时候已经执行过一次了)。
![](https://i-blog.csdnimg.cn/blog_migrate/7fe747d8ce49675ffc3f5d9b498c995a.png)
触发任务执行
选择My View->任务名->Build Now,可以看到左下角的工作序列,如果当前有工作在进行,新进入的工作序列将会进入Pending状态,等正在执行的任务接受后再投入执行。
![](https://i-blog.csdnimg.cn/blog_migrate/217f49ce3bd39061cd0929d9475de34f.png)
可以看到,任务pipeline执行完成后,Jenkins工作空间页面可以看到项目文件的一些信息:
![](https://i-blog.csdnimg.cn/blog_migrate/88cf32e3c4d4d6934b1095139cd0bf78.png)
选中任何一个执行pipeline打开:
![](https://i-blog.csdnimg.cn/blog_migrate/c301a13b984c036ee3c136a3b0f894f4.png)
进入后,打开控制台输出,即可看到编译过程:
![](https://i-blog.csdnimg.cn/blog_migrate/562c1e264e95545c354511da18a86f3d.png)
并且发现确实被下载到了指定目录/var/lib/jenkins/workspace/seqfile:
![](https://i-blog.csdnimg.cn/blog_migrate/a369670c5395fbad3ec038a2b2625078.png)
编译错误是代码和内核兼容原因,和Jenkins配置无关。
出错原因
经过实际测试发现,如果将最后一步的流程改为:
构建后操作--> Execute scripts --> add post bulid step
![](https://i-blog.csdnimg.cn/blog_migrate/911974111019b35e3f352d4a0ac3c4d3.png)
此时,编译错误变成了项目本身的编译错误了,这次配置才算完全正确。
![](https://i-blog.csdnimg.cn/blog_migrate/72a5d4819d045472c51f33db94173b9e.png)
设置的每15分钟构建一次,经过一个晚上,构建达到了64次:
![](https://i-blog.csdnimg.cn/blog_migrate/8298957312d5b93873ef2190cadf849b.png)
无密码登陆
编辑config.xml文件,找到<useSecurity>, 将“true”改为“false”
vim /var/lib/jenkins/config.xml
true修改为false:
![](https://i-blog.csdnimg.cn/blog_migrate/4cf0e163effd3b85a3d3d5a2496dac52.png)
重启jenkins服务
sudo service jenkins restart
![](https://i-blog.csdnimg.cn/blog_migrate/8713b220fde103f1816ce8ef15cbd6e3.png)
修改端口号
检查 /etc/init.d/jenkins 脚本,修改 do_start 函数的 check_tcp_port 命令,端口号从 8080 换成 8848:
修改 /etc/default/jenkins 文件,将端口 8080 改成 8848
修改 /usr/lib/systemd/system/jenkins.service,将8080改成8848,并将user,group修改为root
![](https://i-blog.csdnimg.cn/blog_migrate/92d9d5529b7a2bacb11db73ce9040f5c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/560db04807140b9e6437160dc8136872.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a95062f925f4f4490a3c57c45aa9c770.png)
enable 8848端口
sudo ufw allow 8848
sudo systemctl daemon-reload
sudo systemctl restart jenkins
此时输入新的地址http://localhost:8848/ 即可打开jenkins,原地址无效。
![](https://i-blog.csdnimg.cn/blog_migrate/9ec9a2c6c93e448232876b596673c5f9.png)
查看端口占用情况,8848已被占用,8080被释放。
![](https://i-blog.csdnimg.cn/blog_migrate/e7ffeee9b4b9168c00dc79c7e168b2dc.png)
删除项目,鼠标放到项目右边,会自动显示》符号,从中选择删除。
![](https://i-blog.csdnimg.cn/blog_migrate/2d2cbf4100af3a2161a3803791a0eacb.png)
gitlab部署
sudo apt-get install curl openssh-server ca-certificates postfix net-tools
![](https://i-blog.csdnimg.cn/blog_migrate/ed699b89eeefa2a405367c87e519d8dd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1208a98ac015dd6af0939cb6d88f7c08.png)
![](https://i-blog.csdnimg.cn/blog_migrate/620f0b83f4b900b08552457c44047b88.png)
安装GITLAB
有两种选择,可以在线下载安装
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh |sudo bash
sudo apt-get install gitlab-ce
或者在如下地址https://packages.gitlab.com/gitlab/gitlab-ce 选择RPM或者DEB包下载安装文件进行安装。
![](https://i-blog.csdnimg.cn/blog_migrate/c0424e0c75522ab431cf64cbd318ccb3.png)
这里使用第一种方法,在线下载过程还是比较漫长的
![](https://i-blog.csdnimg.cn/blog_migrate/b02640e4962e6e8e58d8fc978311348e.png)
出现以下提示,表示安装成功:
![](https://i-blog.csdnimg.cn/blog_migrate/64278db28e9e3baa0f83e3a1612481b6.png)
配置GITLAB
sudo vim /etc/gitlab/gitlab.rb
默认情况下,GITLAB也使用8080端口,如果不调整,必定会产生端口冲突,所以实际应用中,GITLAB和JENKINS一般是不同的机器,这里没有这个条件,我们修改配置对外IP和默认端口8081:
![](https://i-blog.csdnimg.cn/blog_migrate/3216674195506ba80b37dfdd5012db21.png)
启动GITLAB
sudo gitlab-ctl stop
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo gitlab-ctl start
开机自启动/关闭开机自启动
启用 Gitlab开机自启动 :systemctl enable gitlab-runsvdir.service
禁止 Gitlab 开机自启动:systemctl disable gitlab-runsvdir.service
登陆GITLAB
![](https://i-blog.csdnimg.cn/blog_migrate/8c92f88de6b6e1b21a1e1146d4ae25c1.png)
默认账号是root,默认密码在/etc/gitlab/initial_root_password文件中。
![](https://i-blog.csdnimg.cn/blog_migrate/fc85ebd91d3fb4233d88ebee635cc500.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2db54c6e4087526bf23db4e114fc0919.png)
![](https://i-blog.csdnimg.cn/blog_migrate/581c040e593efc81518d5ab751ae2c73.png)
新用户注册
只有管理员能以ROOT用户登陆,开发者需要注册普通账户,注册过程如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/107493effc882269e2d64ddd2564b367.png)
新注册的用户会出现在admin area->users->pending approval栏中,需要管理员approve后方可正常登陆。
![](https://i-blog.csdnimg.cn/blog_migrate/1f9dbe82a8f5fd002d8196f8b6bb1253.png)
之后以管理员身份登陆,arppove账户注册请求
![](https://i-blog.csdnimg.cn/blog_migrate/d1a9d08f7556e48d46c5e123faf06b4d.png)
之后退出ROOT账户,以刚刚注册的普通账户登陆,登陆后会要求你选择开发角色,这里选择账户为开发者的角色。
![](https://i-blog.csdnimg.cn/blog_migrate/976a1e8fbe48876196ca74606614354a.png)
之后继续,进入到用户主页,即可进行后续创建项目的操作了。
![](https://i-blog.csdnimg.cn/blog_migrate/6068386b4fb7e0a928409c1c0ac8c26e.png)
创建gitlab项目:
![](https://i-blog.csdnimg.cn/blog_migrate/81cb2cb4071fa75799fccfbb10e7cbbc.png)
创建成功的项目视图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/7188d15496d1d72bf832068dc972fe46.png)
gitlab服务器都使用 SSH 公钥进行认证。 为了向 gitlab 服务器提供 SSH 公钥,如果某系统用户尚未拥有密钥,必须事先为其生成一份。 这个过程在所有操作系统上都是相似的。 首先,你需要确认自己是否已经拥有密钥。 默认情况下,用户的 SSH 密钥存储在其 ~/.ssh 目录下。 进入该目录并列出其中内容,你便可以快速确认自己是否已拥有密钥,我们需要寻找一对以 id_dsa 或 id_rsa 命名的文件,其中一个带有 .pub 扩展名。 .pub 文件是你的公钥,另一个则是与之对应的私钥。 如果找不到这样的文件(或者根本没有 .ssh 目录),你可以通过运行 ssh-keygen 程序来创建它们。
![](https://i-blog.csdnimg.cn/blog_migrate/68de33932699cc2c4791d2f5f7664293.png)
id_rsa是私钥,id_rsa.pub是公钥。
![](https://i-blog.csdnimg.cn/blog_migrate/bce10cceff1a78e1ea3ee9e2ed8bd4c7.png)
点击个人账户->preferences->ssh keys选项,将公钥粘贴在文本框中。
![](https://i-blog.csdnimg.cn/blog_migrate/63bb9ee95acbae66cdf3f15044bf3170.png)
编写一个helloword程序推到工程中:
![](https://i-blog.csdnimg.cn/blog_migrate/df1ecf9552eb492d89770586f668467f.png)
首先克隆代码
![](https://i-blog.csdnimg.cn/blog_migrate/1e2fbb52703d33e26ecc0cb9c0ae1b9d.png)
添加用例,推到仓库
![](https://i-blog.csdnimg.cn/blog_migrate/e922ac2070c6648402952fe095e26d5b.png)
通过gitlab网页查看,项目已经包含了我们推上去的改动
![](https://i-blog.csdnimg.cn/blog_migrate/2000428fe24f1bea32cc61e1ea1765a5.png)
gitlab和jekins协同
按照上面创建seqfile流程,创建一个gitlab的构建项目:
![](https://i-blog.csdnimg.cn/blog_migrate/eb0b75c625db880f43a023dc134f402f.png)
构建成功:
![](https://i-blog.csdnimg.cn/blog_migrate/8c71422ee524cd4f1ba2ab2a7f941606.png)
系统构建成功:
![](https://i-blog.csdnimg.cn/blog_migrate/217114bfcc0bea8c31e0c7f0271e63eb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e291e1cf7459148d8131cf619ea34a48.png)
新建测试任务
在helloworld构建流的基础上,新建一个测试任务,关联gitlab构建流程,设置触发器为构建gitlab后进行测试helloworld.
![](https://i-blog.csdnimg.cn/blog_migrate/ed32360566b3c60ba565c87e40b71a55.png)
![](https://i-blog.csdnimg.cn/blog_migrate/03759e1ee025c86ddd08fffd5871a176.png)
可以看到,在gitlab触发随后,13-5.6=7.4秒后helloworld测试工程也被触发。
![](https://i-blog.csdnimg.cn/blog_migrate/23e2e9c61bf34d2f8a1ba8fe470855e7.png)
jenkins流水线任务
之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。所以Pipeline相对自由风格或者其他的项目风格更容易操作。
![](https://i-blog.csdnimg.cn/blog_migrate/a18d37b9fb56eac1b78b6696b22b44a4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8459fb85287121d2d132049983a5b6a1.png)
构建执行
![](https://i-blog.csdnimg.cn/blog_migrate/2496f0d4a57900effbd15e34585c1380.png)
![](https://i-blog.csdnimg.cn/blog_migrate/021c0f4d254c2b10136047c8411552c5.png)
所有任务列表
![](https://i-blog.csdnimg.cn/blog_migrate/c417f8f9f81db5c283b47a006f663709.png)
从另一台电脑登录
前面安装和访问jenkins和gitlab的电脑是同一台,所以我们可以在浏览器中用localhost替代IP地址进行访问。既然这台电脑已经开通了WEB服务以及开放了访问端口。也就可以从另一台电脑进行访问。
gitlab默认使用了nginx作为web server.
![](https://i-blog.csdnimg.cn/blog_migrate/d4f6645f5387f7f2923bffc46864b3fb.png)
jenkins默认使用了jetty作为webserver.
根据IP地址,从另一台电脑访问jenkins和gitlab的地址分别为:
![](https://i-blog.csdnimg.cn/blog_migrate/238bf7a8d2591214cafac5e53edf0967.png)
![](https://i-blog.csdnimg.cn/blog_migrate/003c12eccdc49f3ef4ed311f2aeaff82.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0f07e77e72eb48f289d167f2ddb388ad.png)
Gerrit/gitlab代码审核服务器的核心是在web服务器上给托管的Git仓库提供一系列的权限控制,以及通过Web前端页面来做代码审核和权限管理,通常适用于大型软件项目,并且要求软件配置、开发、测试、审核等角色完整的软件开发团队。
gitlab配置仓库
仓库matainer添加开发者权限。
![](https://i-blog.csdnimg.cn/blog_migrate/78f60b6c80cb355856589773c9a4cd6a.png)
参考文章
https://blog.csdn.net/tugouxp/article/details/120103794?spm=1001.2014.3001.5502
https://blog.csdn.net/tugouxp/article/details/119602151?spm=1001.2014.3001.5502
https://blog.csdn.net/tugouxp/article/details/118752932?spm=1001.2014.3001.5502
https://blog.csdn.net/tugouxp/article/details/104562056?spm=1001.2014.3001.5502
https://blog.csdn.net/qq_20173195/article/details/126521845