CI/CD之jenkins
Posted Tuki_a
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CI/CD之jenkins相关的知识,希望对你有一定的参考价值。
jenkins
CI/CD简介
CI(Continuous integration持续集成):持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。
比如写个dockerfile,能不能通过gitlab或者jenkins来实现构建镜像和测试。
CD(Continuous Delivery持续交付) :是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。
最后一步最好人工干预一下,否则草率的推到生产环境中是有很大的风险的。
jenkins简介
Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。
jenkins安装
软件下载:https://jenkins.io/zh/download/
国内镜像站:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/
安装jenkins及java开发环境,还有daemonize依赖项从清华的镜像站下载即可
开启jenkins
jenkins使用8080端口
网页访问http://192.168.122.12:8080,第一次登陆初始化较慢。
根据提示,进入目录,查看初始密码解锁jenkins
需要部署的主机能够上网,暂时不需要安装插件所以可以先离线配置跳过插件安装
先跳过
输入url,和浏览器上方输一样的就可以
开始使用jenkins
进入后界面如下
修改一下root用户密码
设置时区
重新用设置好的密码登录一下
安装jenkins插件
先上传ca证书
mkdir /var/lib/jenkins/update-center-rootCAs
wget https://cdn.jsdelivr.net/gh/lework/jenkins-update-center/rootCA/update-center.crt -O /var/lib/jenkins/update-center-rootCAs/update-center.crt
chown jenkins.jenkins -R /var/lib/jenkins/update-center-rootCAs
按下图操作,管理插件
点击advace可以看到用的官方的更新站点
官方的太慢,我们使用下面的命令测试一下哪个站点比较快
[root@server2 ~]# curl -sSL https://cdn.jsdelivr.net/gh/lework/jenkins-update-center/speed-test.sh | bash
清华的比较快,选择清华的站点
可以根据自己的测速换源
将清华的cdn输入后提交
https://cdn.jsdelivr.net/gh/lework/jenkins-update-center/updates/tsinghua/update-center.json
到文件里查看也已经自动更改(也可以直接到文件里改),换源后记得点check now检查一下
安装中文插件
安装中文环境,操作如图
注意装完中文插件后要重启服务才能生效。
安装流水线插件
操作如图
安装gitlab插件
操作如图
回到管理界面会发现提醒我们当前只有一个master,会比较繁忙,应该构建一个分布式环境,设置代理,master只负责调度,给agent布置任务
可以修改master的任务数,按下图操作
改为0就只能调度不能完成任务了,由于硬件限制,我这里就不做代理了
jenkins和gitlab联动
jenkins轮询检查gitlab代码变更
选择new item创建一个自由风格的新任务
到gitlab复制仓库地址
在任务设置里选择git输入仓库地址,添加失败,因为server2主机没有git工具
yum install -y git
下载后刷新报了新的错误,因为远程仓库是加密的,需要ssh免密,要提供一个ssh私钥
在jenkins主机做免密
将公钥上传到gitlab
选择添加jenkins,将私钥给jenkins,然后添加即可
注意分支填写要和仓库端的分支名一致
轮询就是隔一段时间到代码仓库看一下有没有更新
查看构建历史,查看控制台输出
输出正常,如果在仓库下创建新的文件,过一会查看就会更新
使用webhook实时检查gitlab代码变更
我们在网上做的工作,大部分其实就是事件,webhooks 已经成为了连接系统的主要方式,不管是用户创建、支付成功、DockerHub 镜像推送或者 Git 仓库上的合并请求,这些都是非常有用并且轻量级的共享信息的方式。
webhook 是应用给其它应用提供实时信息的一种方式。信息一产生,webhook 就会把它发送给已经注册的应用,这就意味着你能实时得到数据。不像传统的 APIs 方式,你需要用轮询的方式来获得尽可能实时的数据。这一点使得 webhook 不管是在发送端还是接收端都非常高效。由于大部分服务提供商对 API 的访问有一定限制,所以要么采用 webhook 方式,要么采用传统的轮询方式,不过这样客户端数据会有一些(或者比较多的)滞后。上面的图是用户发起的一个典型的支付流程的示例。
在gitlab端到管理中心设置
允许外发请求
再到jenkins端取消轮询的方式,改为使用GitLab webhook的方式提供实时信息
选择高级的,产生一个私密token并复制然后保存
到gitlab将token粘贴上去,并将 GitLab webhook URL: http://192.168.122.12:8080/project/demo写入,然后点击添加webhook即可,触发来源我们只选择推送事件
webhook创建成功测试一下
这时到jenkins查看就会有自动化构建的列表出来
在本地仓库修改一下文件推上去验证一下
jenkins这边已经收到状态更改,又构建了列表
实际生产环境中轮询和webhook可以同时使用
推送dockerfile文件自动构建镜像
原理过程阐述:
user写好dockerfile -> git push (dockerfile) -> gitlab -> webhooks实时更新 -> 事件触发tigger -> 触发jenkins -> 调用插件docker plugins -> 构建镜像build images -> 推到harbor镜像仓库push harbor
需要jenkins主机下载好docker并准备好一个镜像,jenkins也要下载好docker的插件;
仓库端写好dockerfile并提交上传到gitlab;
harbor仓库的证书要记得给jenkins。
新增agent节点
前面一直是在master上部署任务,这样当任务多起来的时候master会比较繁忙,所以添加一个agent节点,master节点只负责调度任务,agent来执行任务。
新建一个server3虚拟机作为agent端,安装git和jdk
[root@server3 ~]# rpm -ivh jdk-8u171-linux-x64.rpm
[root@server3 ~]# yum install -y git
jenkins安装agent插件
把master节点的任务数量设为0,这样master端就不能部署任务了,只负责调度
创建新节点
按下图操作添加agent节点的信息,启动方式为ssh
添加ssh证书
输入server3用户名和密码即可
不验证的意思就是在ssh连接的时候不会问你yes or no
agent添加成功
重新构建demo任务
任务会在agent上创建
jenkins用户管理
之前一直使用的root账户,具有所有权限,实际中应该使用普通用户,并且权限进行一定的限制
添加基于角色控制的插件
点击管理用户面板
新建一个普通用户
使用该新建用户身份登录,会发现该用户是有所有权限的
这是因为安全设置里登录用户可以做任何事情
改为基于角色的策略
到面板点击管理和分配角色
管理角色
添加全局角色,users,权限只有读;添加项目角色demo,可以看凭据,可以读写运行任务,对demo开头的项目都生效,最后记得保存
分配角色,最后记得保存
再以lucky用户的身份登录,会发现权限已经少了很多,因为上面我们并没有给全部的权限。现在就可以用普通用户的身份进行操作啦
以上是关于CI/CD之jenkins的主要内容,如果未能解决你的问题,请参考以下文章
Jenkins vs GitLab CI:CI/CD工具之战