Jenkins集成Gitee持续集成
Jenkins集成Gitee持续集成
小码同学前言
之前使用过Jenkins+Gitlab+Dockerfile+Nginx
来部署过SpringBoot项目,这次试试使用Gitee仓库部署项目,使用Gitee来集成项目,对于独立开发者用的更多,使用GitHub需要魔法,有时候push会失败就没办法,用Gitee的效果就会好很多。速度快。
我们还可以将我们的博客源码放在Gitee上,然后在Jenkins自动化构建我们的博客。方面管理。
安装Jenkins
我们使用Docker安装Jenkins,因为如果使用Jenkins安装包可能会因为会因为环境问题导致无法打开Jenkins,之前使用Jenkins的jar包来安装Jenkins,是真的难搞,一大堆因为环境问题无法打开Jenkins,所以我们使用Docker容器来部署Jenkins,这样会避免一些环境的问题。
安装准备
安装Docker(必装)
安装Docker这里就不展开讲了,可以去我之前的文章看看怎么安装Docker。
安装Docker教程:https://blog.hikki.site/2802e5c6.html
安装Maven(可选)
在新版Jenkins2.4.0以后,Jenkins自带了安装第三方环境的插件了,可以选择在容器内安装其他环境,如maven、JDK等。
如果你通过挂载宿主机的Maven、NodeJs、等其他环境到Docker容器,可以减少容器的占用大小,也是一个非常不错的选择方案,下面我通过挂载maven到容器中使用。
Maven的安装这里也不展开讲了,我之前的文章也有讲过,你可以去看看怎么安装Maven。
安装Maven教程:https://blog.hikki.site/111f4f09.html
运行Jenkins容器
但使用Docker安装Jenkins也有一些不好的地方,比如缺少环境,没有Maven、Node、Git等等这些的环境,但也有一些解决方法,我下面只需要到Maven和Git,Maven使用Docker挂载过去使用。下面我们来试一下,部署方式有两种,一种是使用docker-compose,一种是直接使用docker run运行容器。
使用Docker-compose部署
创建一个jenkins目录,在目录下创建一个data文件夹,赋予jenkins文件夹下权限为777
,比如我将jenkins创建在docker下:
1 | mkdir -p /home/docker/jenkins/data |
第一条命令表示创建一个递归的目录/home/docker/jenkins/data
第二条命令表示赋予/home/docker/jenkins/
目录下全部文件夹权限为777
创建一个docker-compose.yml
文件,然后将以下文件写入该文件。
1 | version: "3" |
使用命令行部署
我们来启动一个Jenkins容器,在Linux终端运行下面指令:
1 | docker run -d -p 5327:8080 -p 5328:50000 -v /home/jenkins/data:/var/jenkins_home -v /usr/local/maven:/usr/local/maven -v /etc/localtime:/etc/localtime --name myjenkins jenkins/jenkins |
-d
:表示在后台运行-p
:指定端口映射。宿主机端口:容器端口
-v
:路径挂载。宿主机路径:容器路径
--name
:给该容器命名jenkins/jenkins
:最后一个命令表示指定容器的镜像文件。
这里指定了5327
和5328
端口映射,后面打开Jenkins
是打开5327
端口即可。
这里路径挂载,将宿主机的/usr/local/maven路径挂载到容器中,为的是在容器中可以使用maven,就不用在容器中另外再安装maven了。如果你不需要maven,可以直接去除这个挂载
查看容器
运行完容器,可以使用docker ps
指令来查看正在运行的容器,如下面,我已经将jenkins容器运行起来了。
开放端口
Ubuntu
Ubuntu开放10240和10241端口
1 | ufw allow 10240 |
CentOS
如果你是CentOS的,可以使用下面开放端口
1 | firewall-cmd --zone=public --add-port=10240/tcp --permanent |
Iptables
Iptables防火墙开放端口
1 | iptables -t filter A INPUT -p tcp --dport 10240 -j ACCEPT |
安装插件
Gitee Plugin(必选)
后面我们会从Gitee拉取仓库内容到Jenkins自动构建,所以,我们必须要安装Gitee插件。
Publish Over SSH(可选)
作用:Publish Over SSH用于在构建完成后通过SSH协议将构建产物或者其他文件上传到远程服务器。
根据你的需求是否安装这个软件,如果你后面需要将构建好的文件使用SSH上传到别的地方就需要这个插件,用不到不装也可以。
安装插件两个方法
点击最上角 Dashboard 进到首页。然后 系统管理 --> 插件管理 --> 可选插件
搜索插件名称。
如果已经安装了某个插件,在可选插件里面是搜索不到的,可以去已安装的选项查看已安装的插件
在安装过程可以勾选安装完成后重启Jenkins(空闲时)
,表示在安装完后,如果没有任务在执行,则会自动重启Jenkins生效插件。
打开Jenkins官网:https://www.jenkins.io/
右上角打开Plugin,可以搜索自己想要的插件。
下载插件:打开插件页面-->Releases-->Installation options-->Direct link-->下载文件
安装插件:Dashboard-->系统管理-->插件管理-->Advanced settings-->Deploy Plugin-->上传文件-->Deploy
自动化构建Java项目
创建SpringBoot项目
JDK和Java建议选择JDK11
,构建类型必选Maven
。
SpringBoot版本选择2.7.11
,建议低于3.0即可。
SpringBoot版本建议
SpringBoot项目版本建议低于3.0,因为大于3.0的版本需要JDK17以上,可能在Maven上面也有版本要求,后面部署容易出现奇怪的错误。
如果你在创建项目选择了3.0版本以上,你可以在pom.xml文件修改Springboot版本,如下:
1 | <parent> |
在pom.xml文件最上方有上面这样的标签,将version的值修改为2.7.10
即可。
JDK版本建议
JDK版本建议使用JDK11就好了,因为后面使用Jenkins容器时,Jenkins自带了一个jdk版本是11,使用JDK版本相同可以减少一些奇怪的问题。
项目使用的JDK版本也可以在pom.xml文件设置,如下:
1 | <properties> |
pom.xml如果有上面这样的标签,那就直接修改值就好,要是没有,就添加一个。
Maven版本
并且也指定maven插件的版本,如下:
1 | <build> |
将SpringBoot项目推送Gitee
创建Gitee仓库
创建一个Gitee仓库,仓库名任意,一般选择见名知意最好。
下面这个仓库是我已经创建过了,并且推送过文件到仓库了,你新建的话,打开是空的,什么都没有。打开仓库后,复制仓库地址。
创建一个Controller类
在AutoJenkinsApplication类同级目录新新建一个Hello类,输入以下内容,表示,如果对127.0.0.1/hello
发起请求,则在页面上输出hello World!!!
内容。
目的是为了后面在Jenkins上自动化编译Java项目,然后在服务器上输出这个页面,从而可以更直观得看到项目构建成功了。
1 | import org.springframework.web.bind.annotation.GetMapping; |
将远程仓库绑定本地仓库
创建本地仓库
点击VCS,创建一个本地Git仓库
。
添加远程仓库
创建完本地仓库,指定远程仓库地址,这样本地才知道,将代码推送到Gitee,点击管理远程
URL添加刚刚在Gitee复制的https地址链接。名称一般默认是origin,你想该其他的名称也是可以的。
推送文件到Gitee仓库
先提交代码到本地仓库,然后在commit推送代码到远程仓库。
确认推送到gitee仓库
配置Jenkins环境
打开系统管理--->全局工具配置--->maven配置
配置Maven、JDK
Maven
设置maven的settings.xml文件,我们在使用docker创建容器时,挂载了/usr/local/maven
这个路径,我们在安装maven时,默认安装到该/usr/local/maven
路径下,这样在容器里面也可以使用maven的环境,不需要重复安装maven,减少容器存储。
JDK
我这次使用的是jenkins/jenkins:2.401-jdk11
这个镜像,这个镜像自带了jdk,不需要自己重复安装,可以直接使用内置的jdk。
默认jdk安装在/opt/java/openjdk
。
配置Maven家目录,也就是/usr/local/maven
,如果你在宿主机没有安装到maven并没有挂载,那选择自动安装Maven。
创建第一个自动化任务
过程演示
新建任务-->构建一个自由风格的软件项目-->源码管理-->Git-->添加Repositories-->Build Steps-->调用顶层Maven目标
添加凭据
这里的添加用户我已经添加过了,在创建一个登陆凭证时,类型选择Username with password
。
构建成功
点击下图的立即构建
,等待构建。
WebHooks触发自动构建
我们可以在Gitee仓库设置一个钩子,当我们在本地推送代码到仓库时,Jenkins检测到Gitee仓库代码发生变动就立即构建。
配置GiteeToken
去Gitee官网生成一个Token,用于Jenkins自动监测Gitee仓库的变动情况。
新建token:https://gitee.com/profile/personal_access_tokens
Token配置
设置WebHooks钩子
代码关联
在配置Git仓库时,使用+refs/heads/*:refs/remotes/origin/*
,表示指定了将远程仓库(origin)中所有本地分支(refs/heads/*)与对应的远程跟踪分支(refs/remotes/origin/*)
关联起来。具体来说,它会将本地分支推送到远程仓库对应的远程跟踪分支,以便进行协作开发。
Name
:origin
Refspec
:+refs/heads/*:refs/remotes/origin/*
webhooks设置成功
看到请求历史绿色的200状态码就表示请求成功了。
测试自动化部署
在刚刚创建的SpringBoot项目中,随便修改一下文件,比如添加一个注释也行,我这里增加一个语句。
1 | System.out.println("test"); |
Gitee提交时间
测试自动化构建结果
可以看到在本地提交代码到Gitee,jenkins就拉取Gitee仓库的代码进行自动化构建了。
怎么知道是不是自动化构建呢?可以看下面图中圈出来的,Started by Gitee push by 吴小白
,表示该启动的来源用户是哪位,这里的吴小白是我的Gitee仓库用户拥有者,所以启动这次的构建就是吴小白发起的。
总结
疑问
Jenkins是怎么知道Gitee仓库发生变化的呢?
我们在本地push代码到Gitee仓库时,如果仓库有设置Webhooks,则每一次push仓库,仓库都会给WebHooks设置的远程URL发运送一个POST请求,告诉这个请求的接收者自己更新仓库内容,你要做什么就可以开始做了。
能做什么?
如果你有要上线的Java项目或者博客,你可以将代码部署在Gitee,然后在服务器安装Jenkins,当你每次push到Gitee仓库时,Jenkins可以自动帮你构建代码,然后将代码发布到公网。
同样,不只是只能自动化构建Java项目,NodeJs、Go项目也是可以的,比如我的博客是Hexo框架,就需要NodeJs环境,我就可以在Jenkins自动化构建我的博客,之后每一次在本地写完文章,push到Gitee仓库就好了,Jenkins就自动化构建了。
当然,你使用GitHub Actions也是没问题,GitHub Actions也有和Jenkins差不多一样的功能,如果你需求不大,可能Actions比Jenkins更为方便,只是有时候GitHub需要魔法,
自动化构建NodeJs项目
操作流程
- 将本地代码推送到Gitee
- 安装Jenkins并安装Gitee插件和SSH插件
- 配置NodeJs环境、配置服务器信息
- 添加Gitee的Token
- 创建一个自由风格的任务流程
- 配置Gitee仓库信息
- 配置NodeJs执行命令
- 指定推送构建内容
我这里以构建Hexo博客项目为例,Hexo博客属于NodeJs项目
将NodeJs项目部署到Gitee
这里不具体讲述怎么推送到Gitee了,你应该有一些Git的基础才合适来查看此教程。
1 | git add . |
配置环境
安装NodeJs环境
打开系统管理--->全局工具配置-->NodeJs
,
- 勾选自动安装
- 版本可以选和自己电脑的环境版本一样的,防止出错
- 选择32位架构的版本(不勾选则是64位架构)
- 安装
hexo-cli
全局模块(如需要指定版本,如hexo-cli@4.3.0
) - npm缓存保留时间
配置Gitee的Token
目的是为了Jenkins有权限对Gitee仓库进行检测拉取权限。
仍然是在系统管理--->系统配置--->Gitee
配置
配置GiteeToken
去Gitee官网生成一个Token,用于Jenkins自动监测Gitee仓库的变动情况。
新建token:https://gitee.com/profile/personal_access_tokens
Token配置
创建自由风格任务
推送文件到服务器
配置服务器信息
打开系统管理--->系统配置---> Publish over SSH
前面三个空可不填。
SSH Servers块就比较重要了,填写的是使用SSH连接服务器的信息。
Name
:SSH别名,任意取一个,区分不同的SSH服务Hostname
:服务器的IP地址或域名Username
:可以使用SSH登录服务器的用户Remote Directory
:构建后保存文件在服务器路径- 高级:
Use password authentication, or use a different key
:勾选Passphrase / Password
:可以使用SSH登录服务器的用户密码
其他的空,一概默认即可。
这里有个注意的点,你上面如果使用root用户登录SSH,你首先要保证开启了root用户远程SSH,一般服务器是默认禁止root用户使用SSH的
任务指定推送文件
打开任务--->配置--->添加构建后操作--->Send build artifacts over SSH
-
SSH Server
:选中刚在系统配置添加的SSH配置 -
Source files
:要上传到服务器的文件或文件夹 -
Remove prefix
:要删除的文件夹前缀,如上传public时,只上传public下面的文件,不要在服务器创建public文件夹 -
Remote directory
:目标服务器保存路径 -
Exec command
:传输成功后在远程服务器执行的shell命令
添加WebHooks
我们可以在Gitee仓库设置一个钩子,当我们在本地推送代码到仓库时,Jenkins检测到Gitee仓库代码发生变动就立即构建,构建后自动将public文件夹下的文件推送到服务器,更新博客。
进入任务--->配置--->构建触发器--->勾选 Gitee webhooks触发构建--->生成Gitee WebHooks密码(滑下去)-->复制输入框密码和上面勾选的URL--->打开Gitee仓库 Webhooks--->新建WebHooks--->填入URL和密码--->回到jenkins保存配置--->回到Gitee窗口点击更测试-->查看更多,观察返回状态码是否是200
,如果是200,则说明成功了。
可能会遇到的问题
构建失败
这个错误是因为springboot和maven的版本有冲突了,可以将springboot的版本降低为3.0一下,然后指定jdk为低于jdk17,比如下面指定jdk11,指定maven版本
解决方法
在Java项目中,将下面文件添加到pom.xml
文件中
1 | <build> |
初始化插件失败
在初始化时一片中国红,看着真喜庆,哈哈哈哈。
我目前发现造成这个错误的原因有两个,一个是网络问题,一个是环境问题。
原因一
可能是网络不行,因为Jenkins安装插件默认的源是国外的,可能国内连不通,或者其他原因。如果你更换了源,还是一样安装失败,你可以试着先不安装这些插件,先进去Jenkins系统,然后使用上传文件安装插件的方法,如上面我说的手动安装插件。
解决方法
换源,既然国外的源下载不了,那就换过国内的镜像源,可以试试清华大学、中科大的镜像源。
下面是常见使用的镜像源
jenkins/data/hudson.model.UpdateCenter.xml
文件替换一个镜像源地址即可。
打开该文件是这样的:
1 |
|
将<url>
标签内的地址修改为新建的镜像源地址即可。
原因二
Jenkins需要的依赖缺失,可能是Jenkins的环境和系统有冲突,导致Jenkins无法正常运行。
我们需要换一个Jenkins版本,比如我使用下面的2.401-jdk11的版本就没问题了,根据你的需求换一个版本即可。
Docker:https://hub.docker.com/r/jenkins/jenkins/tags
参考文章