前言:Jenkins是一个开源的自动化服务器,它可以用于自动执行各种任务,如构建、测试和部署软件。通过使用Jenkins,软件开发团队可以自动化和优化其工作流程,提高效率和质量。Jenkins提供了丰富的插件生态系统,支持各种不同的集成和扩展,使其成为了许多团队的首选工具之一。

前置准备

后端项目添加Dockerfile

后端项目中在src同级目录创建Dockerfile文件,添加如下内容,按项目进行修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 基础镜像
FROM openjdk:11-jre-slim

# 作者
MAINTAINER changwang

# 配置
ENV PARAMS=""

# 时区
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 添加应用
ADD target/listen-0.0.1-SNAPSHOT.jar /listen-0.0.1-SNAPSHOT.jar

## 在镜像运行为容器后执行的命令
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /listen-0.0.1-SNAPSHOT.jar $PARAMS"]

安装maven

maven官网https://maven.apache.org/download.cgi

下载好上传至服务器

1
2
# 解压maven至当前目录
tar -zxf apache-maven-3.9.7-bin.tar.gz
阿里云镜像

替换mavensettings.xml的阿里云镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>

安装jdk

jdk安装:https://blog.changruyi.com/posts/2531909329.html

配置服务器环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 编辑配置
vim /etc/profile

# 添加配置
export JAVA_HOME=/data/program/jdk1.8.0_261
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}

export MAVEN_HOME=/data/program/apache-maven-3.9.7
export PATH=${MAVEN_HOME}/bin:${PATH}

# 刷新配置
source /etc/profile

# 验证jdk
java -version

# 验证maven
mvn -v

docker-compose安装

这步如果之前安装过,可以省略

1
2
3
4
5
6
7
8
# 下载 Docker Compose 二进制文件:
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 为二进制文件添加执行权限:
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装是否成功:
docker-compose --version

关闭防火墙

这步如果之前处理过,可以省略,

1
2
3
4
5
# 关闭防火墙
sudo systemctl stop firewalld

# 永久关闭防火墙
sudo systemctl disable firewalld

jenkins部署

docker-compose

创建docker-compose.yml文件,由于jenkins默认启动端口是8080,和其他项目容易冲突,这块映射成8888

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3.8'

services:
jenkins:
image: jenkins/jenkins:lts # 使用 Jenkins LTS 版本镜像
container_name: jenkins # 容器名称为 jenkins
user: root # 将启动用户设置为 root
ports:
- "8888:8080" # 将宿主机的 8888 端口映射到 Jenkins 的 8080 端口
- "50000:50000" # 将宿主机的 50000 端口映射到 Jenkins 的 50000 端口(用于 Jenkins 节点通信)
volumes:
- /data/program/jenkins_home:/var/jenkins_home # 挂载 Jenkins 数据目录
- /data/program/jdk1.8.0_261:/usr/lib/jvm/java # 挂载 JDK 安装目录
- /data/program/apache-maven-3.9.7:/opt/maven # 挂载 Maven 安装目录
- /usr/bin/docker:/usr/bin/docker # 挂载 Docker 可执行文件目录
- /var/run/docker.sock:/var/run/docker.sock # 挂载 Docker 守护进程的 UNIX 套接字
restart: unless-stopped # 容器退出时自动重启,除非显式停止

启动jenkins

1
docker-compose up -d

image-20240605193642471

查看密码

1
docker logs jenkins

image-20240605193721603

自定义Jenkins

选择安装推荐的插件

image-20240605193756297

创建用户

这块随意,填写完成,点击保存并完成

image-20240605194645461

实例配置

默认展示当前服务器地址和Jenkins端口,点击保存并完成

image-20240605194710477

安装完成

image-20240605194740325

系统管理

系统配置

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

image-20240605195005942

默认Maven 配置

这块在启动的时候进行了挂载

1
/opt/maven/conf/settings.xml

image-20240605195257395

jdk配置

这块在启动的时候进行了挂载

1
/usr/lib/jvm/java

image-20240605195318566

Maven 配置

这块在启动的时候进行了挂载

1
/opt/maven

image-20240605195358557

凭证管理

系统管理->安全->凭证管理

添加凭证SSH是需要从git拉取代码到Jenkins

先通过docker进入Jenkins容器,生成密钥,把公钥添加到git上,私钥在此处使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 进入jenkins内部
docker exec -it jenkins bash

# 生成ssh
ssh-keygen -t rsa

# 查看公钥
cat ~/.ssh/id_rsa.pub

# 查看私钥
cat ~/.ssh/id_rsa

# 手动添加 Gitee 的主机密钥
ssh-keyscan -t rsa gitee.com >> ~/.ssh/known_hosts

image-20240605195832750

image-20240605195913801

添加完成后,点击Create按钮

插件管理

后端项目是springboot项目,基于pom文件,需要安装Maven Integration,点击安装,进去安装页面,下拉到底,点击安装完成后重启

image-20240605194830716

新建任务

重启完成后,点击首页右侧新建任务,输入任务名称,选择构建一个maven项目,点击确定

image-20240605200108083

项目配置

源码管理选择Git,添入git项目地址,选择凭证,指定分支

PS:Credentials 为上面创建的全局凭证

image-20240605200300843

Build

构建,Goals and options

清理并打包项目,并跳过测试

1
clean package -Dmaven.test.skip=true

image-20240605200359060

post steps

任务执行完成后执行的步骤

点击Add post-build step,选择执行shell,添加如下内容,按项目进行修改

1
2
3
4
5
6
7
8
9
10
11
12
13
# 先删除之前的容器和镜像文件
if [ "$(docker ps -a | grep listen-app)" ]; then
docker stop listen-app
docker rm listen-app
fi
if [ "$(docker images -q listen-app)" ]; then
docker rmi listen-app
fi

# demo1为当前任务名称
cd /var/jenkins_home/workspace/demo1
docker build -t changwang/listen-app .
docker run -itd -p 8081:8081 --name listen-app changwang/listen-app

image-20240605200421473

image-20240605211138908

到这步,配置基本完成,后面的按需进行修改,也可以不动

启动任务

控制台输出

进入首页,执行任务,查看控制台输出,当出现如下类似内容时,构建完成

image-20240605201248308

docker

查看镜像,后端项目正常启动

1
2
3
4
5
root@106eb080017c:/# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
changwang/listen-app latest ee3eeef9b8af About a minute ago 312MB
jenkins/jenkins lts 0bd9f204ffc3 2 weeks ago 470MB
openjdk 11-jre-slim 764a04af3eff 22 months ago 223MB

浏览器

输入服务器ip:项目端口,可以正常访问

image-20240605201344211

自动构建项目

在提交代码后,自动触发构建任务

插件安装

插件搜索Gitee Plugin安装,重启

image-20240606114634164

构建触发器

选择项目

安装完成后,在项目的构建触发器 选择Gitee webhook 触发构建,需要在Gitee webhook中填写 URL: http://192.168.58.101:8888/gitee-project/demo1

image-20240606114749351

生成Gitee WebHook 密码

image-20240606114844838

内网穿透

由于是在本地演示,需要进行内网穿透,如果是在公网可以访问的情况下,不用配置,这块使用了花生壳内网穿透

image-20240606121856032

gitee添加WebHooks

Gitee项目管理页面,选择WebHooks,点击添加webHook

image-20240606115020406

输入URL密码,点击确定

image-20240606120931042

自动构建项目相关配置完成

测试自动构建

提交代码

在项目中修改内容后提交代码

image-20240606121251662

触发构建任务

打开jenkins,可以看到自动触发了构建任务,构建完成后,打开后端项目swagger,可以看到修改的内容已经部署完成了

image-20240606122252247

效果展示

image-20240606123425155