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://img-blog.csdnimg.cn/img_convert/b2e98e5d96b34fccfdf2da7c3479bab7.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/a8c644db0dd9b554dacc8e18ff4e1c69.png)
安装环境:
![](https://img-blog.csdnimg.cn/img_convert/6c3b20e26f0f1828e756a6496106811f.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://img-blog.csdnimg.cn/img_convert/969e1c256db3f6cda8914ca79c96c669.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://img-blog.csdnimg.cn/img_convert/109d57d60cbde5cc0c4d7ada94e40e00.png)
之后创建管理员账户:
![](https://img-blog.csdnimg.cn/img_convert/9f08c4d5298e08197e4b0f39cb6c3316.png)
![](https://img-blog.csdnimg.cn/img_convert/1dea769efbaedf6e389664601e19bf1d.png)
继续,进入jenkins主页面:
![](https://img-blog.csdnimg.cn/img_convert/1a7b0a6c6b55c3879f804a3874ff5d08.png)
此时打开终端,输入命令查案8080端口的使用情况:
sudo lsof -i:8080
![](https://img-blog.csdnimg.cn/img_convert/4c2222813480250c39aafcc1548d856d.png)
安装jenkins插件
Jenkins支持很多的plugin,这些plugin极大地丰富了Jenkins的功能。安装plugin有两种方式:自动安装和手动安装。
自动安装比较简单,直接在jenkins浏览器界面操作,入口是:
进入主页http://localhost:8080/->manage jenkins-> manage plugins-> available plugins
![](https://img-blog.csdnimg.cn/img_convert/36e8d8cc6af5f015624064885e61f903.png)
搜索publish over ssh插件,选择安装
![](https://img-blog.csdnimg.cn/img_convert/427ce27bda60c82467b6fc5256b72eda.png)
继续搜索PostBuildScript插件,用于Jenkins构建后,根据结果,执行shell脚本,可用于集群服务器。
![](https://img-blog.csdnimg.cn/img_convert/5f722dc53d074ee7f7fcc2a5b3d43b8a.png)
![](https://img-blog.csdnimg.cn/img_convert/df2fccf19fba25348bb5d4dc7fe35fdc.png)
新建ITEM:
Jenkins主页选择新建item.
![](https://img-blog.csdnimg.cn/img_convert/c4cad2a29d27fe51b16f052b00258172.png)
![](https://img-blog.csdnimg.cn/img_convert/e1154f92664206b78cf660bed7858f82.png)
输入一个名字,选择freestyle project.然后继续。
general页输入仓库地址:
![](https://img-blog.csdnimg.cn/img_convert/ed9bdfde45ace494f8b2aa0244139c85.png)
源码管理页选择git,注意,必须要打开Credentials设置仓库账号/密码,否则Jenkins将无法正常访问仓库。
![](https://img-blog.csdnimg.cn/img_convert/c304a43d7d5f450570a8b713eb59ff41.png)
用户名和密码正确填写,其它输入有意义的字符串即可。
![](https://img-blog.csdnimg.cn/img_convert/5c1596523bad97e19b9ae52474c6559c.png)
之后,Credentials选择新添加的账户,红色警告便消失:
![](https://img-blog.csdnimg.cn/img_convert/0eb87e237b1a7f04f21c9a4774179ea6.png)
触发器设置为每15分钟构建一次:
![](https://img-blog.csdnimg.cn/img_convert/d1681fc9b19e820298ac0ff008833d4a.png)
构建环境,在LOG中增加时间戳信息。
![](https://img-blog.csdnimg.cn/img_convert/96c6b2b66a7e6470ac4a9b784079ab3d.png)
Build Steps填写增加构建步骤
![](https://img-blog.csdnimg.cn/img_convert/cfdcf9884758c7db2600ea3eda1199c3.png)
构建后操作
构建后操作--> Execute scripts --> add generic script file.
![](https://img-blog.csdnimg.cn/img_convert/692aa1ef8868994e9e25c23f51b0bdd0.png)
我们需要在本地文件系统中提供一个脚本文件,并将文件路径设置到此步骤的配置中。这里只是举例,所以postscript没有做任何有价值的事情,仅仅是输出一行完成信息。
![](https://img-blog.csdnimg.cn/img_convert/31c16076cc145dba78aebe02c5f6a840.png)
![](https://img-blog.csdnimg.cn/img_convert/f42049b171a769374401f6f99ef6236b.png)
设置完成后保存,此时jenkins界面如下图所示:
![](https://img-blog.csdnimg.cn/img_convert/2b770eb45ba71d3dc6798cfa7d99dbf2.png)
可以看到我们新建的任务,后面可以触发执行(这里新创建的时候已经执行过一次了)。
![](https://img-blog.csdnimg.cn/img_convert/ca7dd4a1bc197aa5b8e2aace69435200.png)
触发任务执行
选择My View->任务名->Build Now,可以看到左下角的工作序列,如果当前有工作在进行,新进入的工作序列将会进入Pending状态,等正在执行的任务接受后再投入执行。
![](https://img-blog.csdnimg.cn/img_convert/301b01155accee01edea47650f46793c.png)
可以看到,任务pipeline执行完成后,Jenkins工作空间页面可以看到项目文件的一些信息:
![](https://img-blog.csdnimg.cn/img_convert/eea62357180f4662dcfe93a1214f1ffe.png)
选中任何一个执行pipeline打开:
![](https://img-blog.csdnimg.cn/img_convert/106b40ba2a514f1fcdf4ce03058ab9f4.png)
进入后,打开控制台输出,即可看到编译过程:
![](https://img-blog.csdnimg.cn/img_convert/fef3eff46089d2b2decf5fe200abdae3.png)
并且发现确实被下载到了指定目录/var/lib/jenkins/workspace/seqfile:
![](https://img-blog.csdnimg.cn/img_convert/fed98cb2de565cf5c89bc5007a85dbe9.png)
编译错误是代码和内核兼容原因,和Jenkins配置无关。
出错原因
经过实际测试发现,如果将最后一步的流程改为:
构建后操作--> Execute scripts --> add post bulid step
![](https://img-blog.csdnimg.cn/img_convert/e6fe51b6184214eba93df7c044b1538f.png)
此时,编译错误变成了项目本身的编译错误了,这次配置才算完全正确。
![](https://img-blog.csdnimg.cn/img_convert/248aac326e9db2d34f59d15def0ceea8.png)
设置的每15分钟构建一次,经过一个晚上,构建达到了64次:
![](https://img-blog.csdnimg.cn/img_convert/468bf4d6ede5c8b71d47c0fc28f9b6fc.png)
无密码登陆
编辑config.xml文件,找到<useSecurity>, 将“true”改为“false”
vim /var/lib/jenkins/config.xml
true修改为false:
![](https://img-blog.csdnimg.cn/img_convert/07eb4a7f6a64fc96d1ffecf85108f0b8.png)
重启jenkins服务
sudo service jenkins restart
![](https://img-blog.csdnimg.cn/img_convert/c1dbb46b4647cfeedfc5ef3847a0702a.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://img-blog.csdnimg.cn/img_convert/4e988ddbab11668d3d18e55d5563de03.png)
![](https://img-blog.csdnimg.cn/img_convert/1a8b34f20b0eb1438b1aa01e846ff4a7.png)
![](https://img-blog.csdnimg.cn/img_convert/ec96d1c2a335f810ce1bedd23d07ac45.png)
enable 8848端口
sudo ufw allow 8848
sudo systemctl daemon-reload
sudo systemctl restart jenkins
此时输入新的地址http://localhost:8848/ 即可打开jenkins,原地址无效。
![](https://img-blog.csdnimg.cn/img_convert/a2c08f05d7a77e651839eec5091c492f.png)
查看端口占用情况,8848已被占用,8080被释放。
![](https://img-blog.csdnimg.cn/img_convert/9e3b83a1cdf0f89a9c1eb8292fa35bd9.png)
删除项目,鼠标放到项目右边,会自动显示》符号,从中选择删除。
![](https://img-blog.csdnimg.cn/img_convert/4f4cf42fe98878524e3dbf9a69e18638.png)
gitlab部署
sudo apt-get install curl openssh-server ca-certificates postfix net-tools
![](https://img-blog.csdnimg.cn/img_convert/3fd5df96dd8d541b83f67196223da05d.png)
![](https://img-blog.csdnimg.cn/img_convert/6f43d8d329487bf68d1fc78640de343f.png)
![](https://img-blog.csdnimg.cn/img_convert/dfe4efc572e4b01c981818653f8b589a.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://img-blog.csdnimg.cn/img_convert/6b3926af8989661d32f2533292f191a0.png)
这里使用第一种方法,在线下载过程还是比较漫长的
![](https://img-blog.csdnimg.cn/img_convert/70bee794a101031bcd5df6f21065f124.png)
出现以下提示,表示安装成功:
![](https://img-blog.csdnimg.cn/img_convert/6d5ef837f3deefcc732c28eb394ae01d.png)
配置GITLAB
sudo vim /etc/gitlab/gitlab.rb
默认情况下,GITLAB也使用8080端口,如果不调整,必定会产生端口冲突,所以实际应用中,GITLAB和JENKINS一般是不同的机器,这里没有这个条件,我们修改配置对外IP和默认端口8081:
![](https://img-blog.csdnimg.cn/img_convert/e04c79482d7b92066a85865beffaf221.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://img-blog.csdnimg.cn/img_convert/56ffd18611dfe79d0f18674c2fb00292.png)
默认账号是root,默认密码在/etc/gitlab/initial_root_password文件中。
![](https://img-blog.csdnimg.cn/img_convert/4db8fbac5f96b7bbe589cb0f8a0fac8f.png)
![](https://img-blog.csdnimg.cn/img_convert/8466fb3f68d46da65bb063f4f4f08d6c.png)
![](https://img-blog.csdnimg.cn/img_convert/89e9338420abcac318ec1146cd94f81d.png)
新用户注册
只有管理员能以ROOT用户登陆,开发者需要注册普通账户,注册过程如下图:
![](https://img-blog.csdnimg.cn/img_convert/8aab89123d93923261290fa266922f5e.png)
新注册的用户会出现在admin area->users->pending approval栏中,需要管理员approve后方可正常登陆。
![](https://img-blog.csdnimg.cn/img_convert/ed67f3b765c1d32a59e96933eeaa54e8.png)
之后以管理员身份登陆,arppove账户注册请求
![](https://img-blog.csdnimg.cn/img_convert/f1865d9a02213febba45982846e6a09a.png)
之后退出ROOT账户,以刚刚注册的普通账户登陆,登陆后会要求你选择开发角色,这里选择账户为开发者的角色。
![](https://img-blog.csdnimg.cn/img_convert/9af6610920f6d114727920c500fea675.png)
之后继续,进入到用户主页,即可进行后续创建项目的操作了。
![](https://img-blog.csdnimg.cn/img_convert/4849fbaf6be3b86931122cb33b9ade49.png)
创建gitlab项目:
![](https://img-blog.csdnimg.cn/img_convert/8250c020a4cbf0b4a5351c587086effc.png)
创建成功的项目视图如下:
![](https://img-blog.csdnimg.cn/img_convert/84f2dac251d830067c1247e52f733a9c.png)
gitlab服务器都使用 SSH 公钥进行认证。 为了向 gitlab 服务器提供 SSH 公钥,如果某系统用户尚未拥有密钥,必须事先为其生成一份。 这个过程在所有操作系统上都是相似的。 首先,你需要确认自己是否已经拥有密钥。 默认情况下,用户的 SSH 密钥存储在其 ~/.ssh 目录下。 进入该目录并列出其中内容,你便可以快速确认自己是否已拥有密钥,我们需要寻找一对以 id_dsa 或 id_rsa 命名的文件,其中一个带有 .pub 扩展名。 .pub 文件是你的公钥,另一个则是与之对应的私钥。 如果找不到这样的文件(或者根本没有 .ssh 目录),你可以通过运行 ssh-keygen 程序来创建它们。
![](https://img-blog.csdnimg.cn/img_convert/774eb38e3690d8f64dcf7756c3964dc4.png)
id_rsa是私钥,id_rsa.pub是公钥。
![](https://img-blog.csdnimg.cn/img_convert/05dd03a27bf798c44e9c6a73b9f2be0e.png)
点击个人账户->preferences->ssh keys选项,将公钥粘贴在文本框中。
![](https://img-blog.csdnimg.cn/img_convert/d3d4c14596ecee9b514626914f683e2f.png)
编写一个helloword程序推到工程中:
![](https://img-blog.csdnimg.cn/img_convert/7ab9786d96196547ca0c80378b72b156.png)
首先克隆代码
![](https://img-blog.csdnimg.cn/img_convert/87e355006afdb8cb6c1ee3954ec2b93e.png)
添加用例,推到仓库
![](https://img-blog.csdnimg.cn/img_convert/1466921b4132f9a50a14eae7710781b0.png)
通过gitlab网页查看,项目已经包含了我们推上去的改动
![](https://img-blog.csdnimg.cn/img_convert/1dc9fc28c8e7fa20407856ac06cb5714.png)
gitlab和jekins协同
按照上面创建seqfile流程,创建一个gitlab的构建项目:
![](https://img-blog.csdnimg.cn/img_convert/c06e850dccb30540255c3ee3e8621aa2.png)
构建成功:
![](https://img-blog.csdnimg.cn/img_convert/3b0f5d5aa46bb24e6775de86185b2a8c.png)
系统构建成功:
![](https://img-blog.csdnimg.cn/img_convert/b7b2e715fffc44d087e27387d9140386.png)
![](https://img-blog.csdnimg.cn/img_convert/ac88cae82a98589a2731f2dee79a447a.png)
新建测试任务
在helloworld构建流的基础上,新建一个测试任务,关联gitlab构建流程,设置触发器为构建gitlab后进行测试helloworld.
![](https://img-blog.csdnimg.cn/img_convert/2a21858b62fe85edbb3209f0dadc1352.png)
![](https://img-blog.csdnimg.cn/img_convert/ca0f4c64854a4ae61ca7470da544e0bf.png)
可以看到,在gitlab触发随后,13-5.6=7.4秒后helloworld测试工程也被触发。
![](https://img-blog.csdnimg.cn/img_convert/6925d3694a6b73f03d61bc3eec2ac5d4.png)
jenkins流水线任务
之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。所以Pipeline相对自由风格或者其他的项目风格更容易操作。
![](https://img-blog.csdnimg.cn/img_convert/cc7c89701f1e5b693eed6093f7e048e6.png)
![](https://img-blog.csdnimg.cn/img_convert/34293f9c0c77747f55ff1ea699b61e2e.png)
构建执行
![](https://img-blog.csdnimg.cn/img_convert/94698e4781c7f5303aff0769089662ec.png)
![](https://img-blog.csdnimg.cn/img_convert/27351d2e572eb4c68f944be2bb6558a8.png)
所有任务列表
![](https://img-blog.csdnimg.cn/img_convert/59f1acd01eb57e9a773cb8535b371d56.png)
从另一台电脑登录
前面安装和访问jenkins和gitlab的电脑是同一台,所以我们可以在浏览器中用localhost替代IP地址进行访问。既然这台电脑已经开通了WEB服务以及开放了访问端口。也就可以从另一台电脑进行访问。
gitlab默认使用了nginx作为web server.
![](https://img-blog.csdnimg.cn/img_convert/4f457b9c87f87a5cc3f07e4e8763e32a.png)
jenkins默认使用了jetty作为webserver.
根据IP地址,从另一台电脑访问jenkins和gitlab的地址分别为:
![](https://img-blog.csdnimg.cn/img_convert/497c28edb5b1557718f9cdf49922e3a9.png)
![](https://img-blog.csdnimg.cn/img_convert/dcde82f08e4b93a490c059def7a83c49.png)
![](https://img-blog.csdnimg.cn/img_convert/fe90515b8b5cbd02f1f739723344478c.png)
Gerrit/gitlab代码审核服务器的核心是在web服务器上给托管的Git仓库提供一系列的权限控制,以及通过Web前端页面来做代码审核和权限管理,通常适用于大型软件项目,并且要求软件配置、开发、测试、审核等角色完整的软件开发团队。
gitlab配置仓库
仓库matainer添加开发者权限。
![](https://img-blog.csdnimg.cn/img_convert/651ea5b271bf75ed3338e7e8fa166cad.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