前言

Jenkins集成Gitlab持续集成

之前使用过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
2
mkdir -p /home/docker/jenkins/data
chmod -R 777 /home/docker/jenkins/

第一条命令表示创建一个递归的目录/home/docker/jenkins/data

第二条命令表示赋予/home/docker/jenkins/目录下全部文件夹权限为777

创建一个docker-compose.yml文件,然后将以下文件写入该文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
version: "3"
services:
jenkins:
image: jenkins/jenkins:2.401-jdk11
container_name: jenkinsjdk11
restart: always
volumes:
- ./data:/var/jenkins_home
- /etc/localtime:/etc/localtime
- /usr/local/maven:/usr/local/maven # 可选
ports:
- "5327:8080"
- "5328:50000"

使用命令行部署

我们来启动一个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:最后一个命令表示指定容器的镜像文件。

这里指定了53275328端口映射,后面打开Jenkins是打开5327端口即可。

这里路径挂载,将宿主机的/usr/local/maven路径挂载到容器中,为的是在容器中可以使用maven,就不用在容器中另外再安装maven了。如果你不需要maven,可以直接去除这个挂载

查看容器

运行完容器,可以使用docker ps指令来查看正在运行的容器,如下面,我已经将jenkins容器运行起来了。

01-查看容器-20230423-689

开放端口

Ubuntu

Ubuntu开放10240和10241端口

1
2
3
ufw allow 10240
ufw allow 10241
ufw reload

CentOS

如果你是CentOS的,可以使用下面开放端口

1
2
3
firewall-cmd --zone=public --add-port=10240/tcp --permanent
firewall-cmd --zone=public --add-port=10241/tcp --permanent
firewall-cmd --reload

Iptables

Iptables防火墙开放端口

1
2
iptables -t filter A INPUT -p tcp --dport 10240 -j ACCEPT
iptables -t filter A INPUT -p tcp --dport 10241 -j ACCEPT

安装插件

Gitee Plugin(必选)

后面我们会从Gitee拉取仓库内容到Jenkins自动构建,所以,我们必须要安装Gitee插件。

02-GiteePlugin-20230424-571

Publish Over SSH(可选)

作用:Publish Over SSH用于在构建完成后通过SSH协议将构建产物或者其他文件上传到远程服务器。

根据你的需求是否安装这个软件,如果你后面需要将构建好的文件使用SSH上传到别的地方就需要这个插件,用不到不装也可以。

03-Publish Over SSH- 20230424-273

安装插件两个方法

点击最上角 Dashboard 进到首页。然后 系统管理 --> 插件管理 --> 可选插件 搜索插件名称。

如果已经安装了某个插件,在可选插件里面是搜索不到的,可以去已安装的选项查看已安装的插件

在安装过程可以勾选安装完成后重启Jenkins(空闲时),表示在安装完后,如果没有任务在执行,则会自动重启Jenkins生效插件。

01-安装插件-20230424-600

打开Jenkins官网:https://www.jenkins.io/

右上角打开Plugin,可以搜索自己想要的插件。

下载插件:打开插件页面-->Releases-->Installation options-->Direct link-->下载文件

安装插件:Dashboard-->系统管理-->插件管理-->Advanced settings-->Deploy Plugin-->上传文件-->Deploy

05-安装插件

自动化构建Java项目

创建SpringBoot项目

JDK和Java建议选择JDK11,构建类型必选Maven

01-新建项目20230423-951

SpringBoot版本选择2.7.11,建议低于3.0即可。

02-新建项目20230423-200

SpringBoot版本建议

SpringBoot项目版本建议低于3.0,因为大于3.0的版本需要JDK17以上,可能在Maven上面也有版本要求,后面部署容易出现奇怪的错误。

如果你在创建项目选择了3.0版本以上,你可以在pom.xml文件修改Springboot版本,如下:

1
2
3
4
5
6
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

在pom.xml文件最上方有上面这样的标签,将version的值修改为2.7.10即可。

JDK版本建议

JDK版本建议使用JDK11就好了,因为后面使用Jenkins容器时,Jenkins自带了一个jdk版本是11,使用JDK版本相同可以减少一些奇怪的问题。

项目使用的JDK版本也可以在pom.xml文件设置,如下:

1
2
3
<properties>
<java.version>11</java.version>
</properties>

pom.xml如果有上面这样的标签,那就直接修改值就好,要是没有,就添加一个。

Maven版本

并且也指定maven插件的版本,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>

将SpringBoot项目推送Gitee

创建Gitee仓库

创建一个Gitee仓库,仓库名任意,一般选择见名知意最好。

03-新建仓库20230423-601

下面这个仓库是我已经创建过了,并且推送过文件到仓库了,你新建的话,打开是空的,什么都没有。打开仓库后,复制仓库地址。

04-复制仓库地址-20230423-869

创建一个Controller类

在AutoJenkinsApplication类同级目录新新建一个Hello类,输入以下内容,表示,如果对127.0.0.1/hello发起请求,则在页面上输出hello World!!!内容。

目的是为了后面在Jenkins上自动化编译Java项目,然后在服务器上输出这个页面,从而可以更直观得看到项目构建成功了。

1
2
3
4
5
6
7
8
9
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Hello {
@GetMapping ("hello")
public String hello(){
return "hello World!!!";
}
}

将远程仓库绑定本地仓库

创建本地仓库

点击VCS,创建一个本地Git仓库

05-创建本地仓库-20230423-976

添加远程仓库

创建完本地仓库,指定远程仓库地址,这样本地才知道,将代码推送到Gitee,点击管理远程

06-添加远程地址-20230423-600

URL添加刚刚在Gitee复制的https地址链接。名称一般默认是origin,你想该其他的名称也是可以的。

07-定义远程20230423-626

推送文件到Gitee仓库

先提交代码到本地仓库,然后在commit推送代码到远程仓库。

08-提交-20230423-498

确认推送到gitee仓库

09-确认推送到gitee仓库-20230423-133

配置Jenkins环境

打开系统管理--->全局工具配置--->maven配置

02-配置maven-20230423-865

配置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

03-配置jdk-20230423-957

配置Maven家目录,也就是/usr/local/maven,如果你在宿主机没有安装到maven并没有挂载,那选择自动安装Maven。

04-配置maven家目录-20230423-259

创建第一个自动化任务

过程演示

新建任务-->构建一个自由风格的软件项目-->源码管理-->Git-->添加Repositories-->Build Steps-->调用顶层Maven目标

02-启动任务

添加凭据

这里的添加用户我已经添加过了,在创建一个登陆凭证时,类型选择Username with password

03-Gitee登录-20230424-070

构建成功

点击下图的立即构建,等待构建。

04-构建成功-20230424-796

WebHooks触发自动构建

我们可以在Gitee仓库设置一个钩子,当我们在本地推送代码到仓库时,Jenkins检测到Gitee仓库代码发生变动就立即构建。

配置GiteeToken

去Gitee官网生成一个Token,用于Jenkins自动监测Gitee仓库的变动情况。

新建token:https://gitee.com/profile/personal_access_tokens

01-创建GiteeToken

Token配置

02-Gitee配置-20230424-067

设置WebHooks钩子

03-设置webhooks

代码关联

在配置Git仓库时,使用+refs/heads/*:refs/remotes/origin/*,表示指定了将远程仓库(origin)中所有本地分支(refs/heads/*)与对应的远程跟踪分支(refs/remotes/origin/*)关联起来。具体来说,它会将本地分支推送到远程仓库对应的远程跟踪分支,以便进行协作开发。

  • Nameorigin
  • Refspec+refs/heads/*:refs/remotes/origin/*

webhooks设置成功

看到请求历史绿色的200状态码就表示请求成功了。

04-钩子设置成功-20230424-000

测试自动化部署

在刚刚创建的SpringBoot项目中,随便修改一下文件,比如添加一个注释也行,我这里增加一个语句。

1
System.out.println("test");

05-测试自动化-20230424-426

Gitee提交时间

06-提交信息-20230424-788

测试自动化构建结果

可以看到在本地提交代码到Gitee,jenkins就拉取Gitee仓库的代码进行自动化构建了。

怎么知道是不是自动化构建呢?可以看下面图中圈出来的,Started by Gitee push by 吴小白,表示该启动的来源用户是哪位,这里的吴小白是我的Gitee仓库用户拥有者,所以启动这次的构建就是吴小白发起的。

07-测试自动化部署成功-20230424-600

总结

疑问

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项目

操作流程

  1. 将本地代码推送到Gitee
  2. 安装Jenkins并安装Gitee插件和SSH插件
  3. 配置NodeJs环境、配置服务器信息
  4. 添加Gitee的Token
  5. 创建一个自由风格的任务流程
  6. 配置Gitee仓库信息
  7. 配置NodeJs执行命令
  8. 指定推送构建内容

我这里以构建Hexo博客项目为例,Hexo博客属于NodeJs项目

将NodeJs项目部署到Gitee

这里不具体讲述怎么推送到Gitee了,你应该有一些Git的基础才合适来查看此教程。

1
2
3
git add .
git commit -m "test nodejs and jenkins"
git push origin main

配置环境

安装NodeJs环境

打开系统管理--->全局工具配置-->NodeJs

  • 勾选自动安装
  • 版本可以选和自己电脑的环境版本一样的,防止出错
  • 选择32位架构的版本(不勾选则是64位架构)
  • 安装hexo-cli全局模块(如需要指定版本,如hexo-cli@4.3.0)
  • npm缓存保留时间

01-安装NodeJs环境-20230428-747

配置Gitee的Token

目的是为了Jenkins有权限对Gitee仓库进行检测拉取权限。

仍然是在系统管理--->系统配置--->Gitee配置

配置GiteeToken

去Gitee官网生成一个Token,用于Jenkins自动监测Gitee仓库的变动情况。

新建token:https://gitee.com/profile/personal_access_tokens

01-创建GiteeToken

Token配置

02-Gitee配置-20230424-067

创建自由风格任务

03-创建一个自由风格任务

推送文件到服务器

配置服务器信息

打开系统管理--->系统配置---> Publish over SSH

前面三个空可不填。

05-配置服务器信息-20230428-866

SSH Servers块就比较重要了,填写的是使用SSH连接服务器的信息。

06-服务器保存信息-20230428-333

  • 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

09-推送文件到服务器

08-设置任务推送-20230428-723

  • 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,则说明成功了。

10-添加webhooks

可能会遇到的问题

构建失败

这个错误是因为springboot和maven的版本有冲突了,可以将springboot的版本降低为3.0一下,然后指定jdk为低于jdk17,比如下面指定jdk11,指定maven版本

01-maven-error-20230423-935

解决方法

在Java项目中,将下面文件添加到pom.xml文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>

初始化插件失败

在初始化时一片中国红,看着真喜庆,哈哈哈哈。

我目前发现造成这个错误的原因有两个,一个是网络问题,一个是环境问题。

02-初始化插件失败-20230424165355

原因一

可能是网络不行,因为Jenkins安装插件默认的源是国外的,可能国内连不通,或者其他原因。如果你更换了源,还是一样安装失败,你可以试着先不安装这些插件,先进去Jenkins系统,然后使用上传文件安装插件的方法,如上面我说的手动安装插件。

解决方法

换源,既然国外的源下载不了,那就换过国内的镜像源,可以试试清华大学、中科大的镜像源。

下面是常见使用的镜像源

渠道 镜像源地址
官方 https://updates.jenkins.io/update-center.json
中科大 https://mirrors.ustc.edu.cn/jenkins/updates/update-center.json
清华大学 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
阿里云 https://mirrors.aliyun.com/jenkins/updates/update-center.json

jenkins/data/hudson.model.UpdateCenter.xml文件替换一个镜像源地址即可。

打开该文件是这样的:

1
2
3
4
5
6
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://updates.jenkins.io/update-center.json</url>
</site>

<url>标签内的地址修改为新建的镜像源地址即可。

原因二

Jenkins需要的依赖缺失,可能是Jenkins的环境和系统有冲突,导致Jenkins无法正常运行。

我们需要换一个Jenkins版本,比如我使用下面的2.401-jdk11的版本就没问题了,根据你的需求换一个版本即可。

Docker:https://hub.docker.com/r/jenkins/jenkins/tags

安装失败-20230424-156

参考文章

Jenkins中集成NodeJS插件问题对应

使用Jenkins持续集成Hexo博客