前言
jenkins概述
持续集成是一种实践,而jenkins可以帮助团队去尽量好的去完成这种实践
- jenkins是⼀个开源软件项⽬,是基于Java开发的⼀种持续集成⼯具,⽤于监控持续重复的⼯作,旨在提供⼀个开放易⽤的软件平台,使软件项⽬可以进⾏持续集成
- Jenkins是基于java语言的开源持续集成工具,提供了一套非常易用的用户界面
- jenkins类似于eclipse,基于插件化的架构,方便功能的扩展,目前有几百个现成插件可以使用,这些插件涵盖从版本控制、构建工具、代码质量、构建通知、集成外部系统、UI定制、游戏等等各个方面
持续集成作用
- 场景一:某项目本地更新时未拉取最新代码导致更新后的服务和其他人员联调出现接口不通,请求错误等异常。
- 场景二:每次更新需要人手动去编译打包最新的代码并上传到服务器进行部署。
- 场景三:同一套服务需要部署多个环境进行测试、发布等等,需要手动去拷贝上传部署等等。
- 场景四:团队成员或者teamleader想了解当前项目的状态,以及更新部署历史记录等。
持续集成就是用来解决以上问题,它的价值主要在于减少重复的步骤,降低项目的风险,任何时间任何地点生成可用的软件,增强项目的可见性等。
1. 登录jenkins
浏览器访问:http://127.0.0.1:8080/
首次启动会出现如下界面:
首次进入需要输入初始密码来解锁,初始密码查看方法: sudo cat /var/lib/jenkins/secrets/initialAdminPassword
因为部署过程已经配置过了,所以这里我们直接输入账户/密码登录:admin/root
登录后显示界面如下:
2.Jenkins基本设置
Jenkins的基本设置都在系统的后台设置中,具体路径为:系统管理->系统配置
2.1 设置JDK
可以在这里进行JAVA_HOME设置,当前系统已经设置JAVA_HOME,可以不需要再进行配置,同时可以让Jenkins再安装一个不同版本的JDK。
2.2 设置Maven
2.3 设置SSH Server
系统配置在最下方找到 “新增”
点击“高级”,进行配置下面的内容。
这里我们通过密钥的方式进行连接,已有秘钥无须在生成,只需要吧公钥配置到将要配置的ssh server服务器上即可。
配置完成,点击“Test Configuration”,出现 success即为成功!
第一次配置需要秘钥,找到一台服务器执行:ssh-keygen -m PEM -t rsa -b 4096
会在目录/root/.ssh生成id_rsa私钥、id_rsa.pub公钥,将公钥的内容写入到同目录下的authorized_keys文件(jenkins连接多台服务器,将公钥写入到相应服务器的authorized_keys文件即可)
3.Jenkins插件
系统管理->插件配置
3.1 Jenkins初次启动时直接进行安装
3.2 进入jenkins后找到插件管理页面进行安装
jenkins 的所有插件安装后需要重启才能够生效,如果jendkins国外官方插件地址的下载速度很慢,我们可以修改为国内镜像地址:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
备注:所有的插件安装完毕后,必须重启Jenkins才能使插件生效,不支持即插即用模式。
3.3 jenkins常用插件汇总
- Git:支持使用Github、GitLab、Gerrit等系统管理代码仓库。
- Subversion:支持Subversion系统管理源代码。
- Build-timeout Plugin:任务构建超时插件
- Naginator Plugin:任务重试插件
- Build User Vars Plugin:用户变量获取插件
- Build Pipeline Plugin View :Pipeline 管道流图表展示插件
- Build Flow Plugin:工作流插件,支持DSL脚本定义工作流
- Build Graph View Plugin:build Flow插件视图(安装后需要重新才能生效)
- Multijob Plugin:多任务插件
- Build-timeout Plugin:job构建超时插件
- Build Timestamp Plugin :任务log时间戳插件,使得job log的每次输出前面都增加当时的时间
- Parameterized Trigger Plugin:这是一个扩展型的插件,使各个job连接的时候可以传递一些job相关的信息
- Join Plugin:这也是一个触发job的插件,亮点在于它触发job的条件是等待所有当前job的下游的job都完成才会发生。
- Files Found Trigger:检测指定的目录,如果发现指定模式的文件则启动build。
- BuildResultTrigger Plugin:根据其他的job的成功或失败来启动此build。
- Publish Over SSH Plugin:通过ssh发布文件
- Rebuild Plugin:重新执行插件
- ws-cleanup Plugin :workspace清理插件
- Cron Column Plugin: 通过定时任务例行的运行一些job
- Job Configuration History Plugin:使用心得:使job具备版本管理的能力,diff和rollback功能更是非常赞
- HTTP Request Plugin:使用心得:在构建前后可以通过该插件以http形式调用各种api接口实现和内部系统的联动
- Periodic Backup:使用心得:备份是运维一个系统必须要保障的事情,该插件的恢复功能可能不可用,需要手工进行,好处在于可以定时备份
- Job Import Plugin:使用心得:可以快速导入其他jenkins集群的已有job,需要认证的jenkins系统导入需要提供凭证才可以
- Status Monitor Plugin:构建状态插件
- Build Monitor View :基于该插件可以实现dashboard功能
- Build Environment Plugin:构建环境插件,可以进行构建环境比较。
4. 新建任务
4.1 在控制面板中点击新建任务
输入项目名称后,这里我们选择构建一个自由风格的软件项目,然后点击确定
创建完成后的界面显示如下:
4.2 配置项目参数
点击配置
4.2.1 General
丢弃旧的构建,可以指定保留历史构建的天数和最大个数,超过限制会自动清理,避免磁盘空间浪费
4.2.2 源码管理
指定项目源码地址,并配置拉取代码需要的账号密码
4.2.3 构建触发器
可以指定当前项目的父项目,并在其父项目构建后可触发当前项目的构建
Jenkins支持多种Build 触发方式,尤其一些自动化触发方式非常有用
- Build periodically,Jenkins 内置功能,可以设置类似crontab时间,周期性地自动触发构建。
- Poll SCM,Jenkins 内置功能,类似Build periodically,可以设置类似crontab时间,不同的是不是直接进行构建,而是周期性地在后台检查所配置的SCM有没有更新,只有当有代码更新时才会触发构建。
- Trigger builds remotely (e.g., from scripts),Jenkins 内置功能,远程触发构建,通过设置token可以支持远程脚本中触发Jenkins构建。
- Gerrit Trigger,这个插件将Jenkins集成到Gerrit code review中,支持Jenkins配置Gerrit服务器等信息,实现Gerrit event 触发Jenkins 构建。
- GitLab, 这个插件将Jenkins 集成到GitLab web hook中,支持Gitlab 分支及Merge Request等相关事件触发Jenkins构建。
- GitHub Integration,这个插件将Jenkins集成到GitHub中,支持Gitgub分支及Pull requests 触发Jenkins 构建。
- JIRA Trigge,这个插件将Jenkins集成到Jira WebHooks中,支持Jira issue的状态等变化时触发Jenkins构建。
这里也可以选择定时构建(提供一个类似cron的特性来定期执行这个项目)或者轮询SCM(对于CVS来说,这将是一个耗费资源的操作,因为每次轮询都需要Jenkins扫描整个工作区并与服务器进行验证)
定时构建语法如下:
- 第一个*表示分钟,取值0~59
- 第二个*表示小时,取值0~23
- 第三个*表示一个月的第几天,取值1~31
- 第四个*表示第几月,取值1~12
- 第五个*表示一周中的第几天,取值0~7,其中0和7代表的都是周日
例如:
每小时执行一次
H/59 * * * *
每两个小时执行一次
H H/2 * * *
每隔15分钟。(或许:07, :22, :37, :52)
H/15 * * * *
4.2.4 Build Steps
添加构建步骤->执行shell
运行shell脚本(默认为sh,但这是可配置的)以构建项目。脚本将以工作区作为当前目录运行,这里我们写入maven打包项目的相关命令
4.2.5 构建后操作
添加构建后操作,选send build artifact over SSH,将构建后的项目包通过SSH发送。
- Name 选我们在设置中添加的SSH服务器;
- Source files 配置需要send的项目jar包,如xxx/project.jar。注意该路径是相对.jenkins/workspace/taskName的,即完整路径是.jenkins/workspace/taskName/xxx/project.jar
- Remove prefix 移除前缀
- Remote directory 远程文件夹,(注意这里的跟是我们在系统配置中配置的文件夹为跟文件夹,而并非linux系统的"/")
- Exec command 这里配置我们在远程服务器上提前编写好的脚本,Jenkins只是将打好的war包发送到远程服务器,但是发送到服务器之后的的操作则需要我们自己编写脚本实现,比如需要修改包名,移动位置,等。我这里配置的执行的命令如下:
cd /usr/local/test/business-service
mv …/target/*.jar ./
docker-compose down
docker-compose up -d --build
docker image prune -f
最后点击确定即可。
4.3 构建项目
4.3.1 立即构建
当一个任务配置完成后,可以采用手动构建和触发器构建两种方式,在项目验证阶段,可以通过手动触发方式,点击任务区的“立即构建”,会在Build History中出现以下进度条:
4.3.2 查看构建信息
4.3.3 变更记录
可以查看CVS工具相关提交记录
4.3.4 控制台输出
构建过程的相关日志可在此处进行查看,便于排查问题
4.3.5 删除构建
点击确定即可删除当前构建历史记录
4.4 任务构建状态
Jenkins通过当前构建状态和构建稳定新
当前构建状态分为以下几种
Jenkins会基于一些后处理器任务为构建发布一个稳健指数(从0-100 ),越高越稳定
5. Docker部署脚本
进入SSH Server中配置的服务器目录下(这里以我配置的business-service服务为例):
远程服务器目录:/usr/local/test/business-service
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。
5.1 docker-compose.yml
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
version: '3.1'
services:
business:
build:
context: ./
dockerfile: Dockerfile
image: business:v1.0.0
container_name: business
ports:
- 10890:10890
network_mode: host
volumes:
- /home/rts/nginx/userHelp:/opt/rts/userHelp
5.2 Dockerfile
FROM openjdk:8-jdk-alpine
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
COPY business-service-latest.jar /usr/local/
COPY application.properties /usr/local/
COPY bootstrap.yml /usr/local/
WORKDIR /usr/local/
CMD java -jar business-service-latest.jar -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
6. 用户管理
6.1 全局安全配置
Jenkins安装完成后,默认是不进行安全控制的,需要在系统配置中添加安全控制后,具体位置在系统管理的安全域中,Jenkins支持Jenkins专用用户数据库、LDAP、Servlet容器代理、MySql数据库。授权策略包括采用安全矩阵、登陆后可以做任何事、任何用户可以做任何事(没有任何限制)、项目矩阵授权策略、遗留模式等。建议采用Jenkins专用数据库,安全策略采用安全矩阵方式,已经能够基本满足现有的模式。如下图:
选择Jenkins专用用户数据库后,勾选允许用户注册选项。在添加用户或组,对其进行附权限。
用户注册入口在登录页,如下:
添加用户的基本信息,点击注册按钮后,用户注册完成,用户没有赋权限,登陆后的界面如下:
然后我们在登录管理员账号对新加的账号授权即可:
6.2 个性化设置
Jenkins对用户视图支持个性化定制,保证登陆用户只关注自身关注的项目视图,用户登陆后,默认一般显示如下图:
可以点击“+”增加个性化视图,出现如下视图:
选择列表视图选项,填写“视图名称”,以及需要的任务选项,同时可以选择需要展示的列,选择完成后保存即可,可以在首页上显示。
7. 钉钉机器人
Jenkins整合dingding json pusher,发送自定义消息到钉钉群
每个机器人每分钟最多发送20条消息到群里,如果超过20条,会限流10分钟。
7.1 获取access_token
下载钉钉,建群,添加机器人,获得Webhook中的access_token值
选择需要添加机器人的群聊,然后依次单击群设置 > 智能群助手。
7.2 下载钉钉插件
主页面-系统管理-插件管理-可选插件 搜索Dingding JSON Pusher Plugin
7.3 添加钉钉推送配置
项目配置完成后,添加构建后操作,选择Dingding JSON Pusher
钉钉access token填入access_token,不是整个路径只是路径后的access_token的值,比如
https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx,要填入的是xxxxxxxx
7.4 自定义钉钉推送内容
Json文件内容格式如下:
{
"at": {
"atMobiles":[
"@人员的手机号"
],
"atUserIds":[
"@人员的账户"
],
"isAtAll": false
},
"text": {
"content":"这里写自定义的消息内容"
},
"msgtype":"text"
}
附录
Jenkins 遇到检查更新中心: None of the tool installer metadata passed the signature check 时发生错误
默认:https://updates.jenkins.io/update-center.json
url 地址设置为:https://jenkins-zh.gitee.io/update-center-mirror/tsinghua/current/update-center.json
Docker脚本执行异常
提示异常:-bash: docker-compose: 未找到命令
cd /usr/local/bin #切换到安装路径
wget https://github.com/docker/compose/releases/download/1.14.0-rc2/docker-compose-Linux-x86_64 # 下载安装源
rename docker-compose-Linux-x86_64 docker-compose docker-compose-Linux-x86_64 # 重命名安装下载的安装包
chmod +x /usr/local/bin/docker-compose #授权
docker-compose version # 查看是否安装成功
Jenkins构建时间显示不正确
使用过程中发现 Jenkins 构建的时候和实际的时间相差8小时
访问URL:Jenkins访问地址/script
执行:System.setProperty(‘org.apache.commons.jelly.tags.fmt.timeZone’,‘Asia/Shanghai’)