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的主要内容,如果未能解决你的问题,请参考以下文章

CI/CD之jenkins

CI/CD之jenkins

传统云环境下的CI/CD操作手册配置jenkins

传统云环境下的CI/CD操作手册jenkins手动构建示例及实现自动触发构建

Jenkins vs GitLab CI:CI/CD工具之战

传统云环境下的CI/CD操作手册系统架构概述