一、环境准备
宿主机要安装jdk和maven,这里就不展开讲了。
docker的安装请参照Docker学习笔记一文。
安装Jenkins
1、拉取Jenkins镜像
shell
docker pull jenkins/jenkins
2、运行镜像
shell
docker run \
-d \
-p 10240:8080 -p 10241:50000 \
-v /opt/jenkins:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /opt/maven/apache-maven-3.9.5/:/opt/maven/apache-maven-3.9.5 \
-v /opt/maven/repository:/opt/maven/repository \
-v /etc/localtime:/etc/localtime \
--name jenkins \
jenkins/jenkins
下面分别讲解各个选项作用:
-d:后台运行-p 10240:8080 -p 10241:50000:Jenkins使用的两个端口映射,核心是第一个,将Jenkins启动端口映射到宿主机的10240端口,这样启动后,我们访问ip:10240就能访问Jenkins了-v /opt/jenkins:/var/jenkins_home:将jenkins主目录/var/jenkins_home映射到宿主机/opt/jenkins目录,这样我们就能直接在宿主机上查看相关信息,不用进入容器内部查看-v /var/run/docker.sock:/var/run/docker.sock和-v /usr/bin/docker:/usr/bin/docker:将docker配置挂载到容器中,这样就能在容器中访问docker命令了。注意配置docker.sock的权限/opt/maven/apache-maven-3.9.5/:/opt/maven/apache-maven-3.9.5:将maven主目录挂载到容器中,通过在Jenkins控制台中设置全局属性后,就能在容器中使用mvn命令了/opt/maven/repository:/opt/maven/repository:将容器中的/opt/maven/repository目录映射到宿主机的/opt/maven/repository目录,这样Jenkins中每次使用mvn命令时可以共用该本地仓库,不用每次都从远程下载。注意repository文件权限问题,至少需要写权限-v /etc/localtime:/etc/localtime:映射时区--name jenkins:指定容器名称
这里没有映射
jdk主目录,因为Jenkins会自动安装jdk,所以不需要我们自己处理了,如果没有的话,那就需要挂载了
3、配置Jenkins
镜像启动后,可以访问ip:10240,可以安装默认配置进入Jenkins中,然后进行如下配置
1)配置maven环境变量
选择系统管理,然后选择系统配置,下拉,找到全局属性,添加maven环境变量,如下所示

二、配置项目自动部署
1、安装插件
由于我们项目放在gitee上面,Jenkins没有自动帮着我们安装相应插件,因此需要我们自己安装。选择系统管理、插件管理,搜索Gitee Plugin并安装。这里我已经安装了,所有是在Installed plugins栏,未安装的话需要到Available plugins栏中搜索安装。

2、创建项目
首页点击新建任务,进入如下页面,输入任务名称,选择第一个,点击确定。如下所示

3、配置项目
第一个配置项General可以简单看下,没有要特殊说明的
3.1 源码管理
就是配置你的源码地址,以及凭据和代码分支等,如下图所示

3.2 构建触发器
我们的目的是当推送代码到git上,或者合并代码就完成自动构建和部署,故我们这里选择Gitee webhook 触发构建。注意:需要先安装Gitee Plugin插件。

继续往下,可以看到有一个Gitee WebHook 密码,是空的,需要我们点击生成按钮,生成密码,然后将其和URL一起配置到git项目中

3.3 配置git项目
进入你的git项目,选择管理、WebHooks,点击右上角的添加WebHook按钮,填写上一步Jenkins中的URL和自动生成的密码,保存即可。如下所示

3.4 添加构建步骤
继续回到Jenkins配置中,添加构建步骤,这里我们选择shell脚本,如下所示

shell脚本是用来配合我们项目中的Dockerfile文件来完成项目的构建和部署,因此两者是息息相关的。
这里给出了两种方式:一种是在Jenkins中打包项目;另一种是在镜像中打包项目。
两种方式只是项目打包的位置不一样,大的流程是一样的,这里推荐第一种方式,在Jenkins中打包。前面构建Jenkins时,已经挂载好了仓库目录,因此每次打包都可以共用maven仓库,不用每次都远程下载依赖,一定程度上缩短了我们项目的部署时间。
这里给出的打包方式是
spring boot的分层打包,具体可以参考官方文档
组合一:Jenkins中打包项目
该方式要求
Jenkins中配置maven环境,因为是在Jenkins中打包项目
1、Jenkins中构建步骤的执行shell
shell
#!/bin/bash
# 打包项目,跳过测试,-s指定settings文件
mvn clean package -Dmaven.test.skip -s /opt/maven/apache-maven-3.9.5/conf/txz-settings.xml
# 以展开的形式运行应用程序,并将应用程序的所有依赖项和资源提取到当前目录中
# target/*.jar 匹配target目录下后缀为.jar的文件,就是package命令生成的jar包,项目不同,名称不同,这里用*来通配
java -Djarmode=layertools -jar target/*.jar extract
#项目名称,后续所有的镜像、容器名都使用该名称
projectName=sso
# 如果存在,则删除镜像和容器,-f表示强制删除,即使容器在运行中
if [ $(docker ps -aq --filter name=$projectName) ]; then docker rm -f $projectName; echo '删除容器' + $projectName; fi
if [ $(docker images -q $projectName) ]; then docker rmi $projectName; echo '删除镜像' + $projectName; fi
# 构建镜像,最后的.表示在当前目录执行
docker build -f Dockerfile -t $projectName .
docker run --name $projectName -d -e TZ="Asia/Shanghai" -p 8080:8080 $projectName
如果对哪一步有疑问,可以在脚本中添加
ls -l命令,查看当前目录文件
2、对应的Dockerfile
因为Jenkins中已经打好了包,且将jar包中的依赖项和资源提取到当前目录了,故这里直接复制即可
shell
# 基础镜像
FROM openjdk:17
# 镜像作者
MAINTAINER snowwalker
WORKDIR application
# 设置为东八区
ENV TZ=Asia/Shanghai
# 将上面shell中执行的jar包的应用程序的所有依赖项和资源复制到当前目录中
COPY dependencies/ ./
COPY spring-boot-loader/ ./
COPY snapshot-dependencies/ ./
COPY application/ ./
# 运行镜像时执行的命令
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
组合二:镜像中打包项目
该方式要求在镜像中配置
maven环境,因为是在镜像中打包项目
1、制作java+maven环境的镜像
一般情况下,我们都是将openjdk:17作为基础镜像,但是该镜像只包含java环境,没有maven环境,为了方便,我们可以在openjdk:17的基础上构建一个包含maven环境的基础镜像openjdk-maven:17,Dockerfile文件如下所示:
shell
# openjdk作为基础镜像
FROM openjdk:17
# 将宿主机上的maven目录复制到镜像目录
COPY /opt/maven/apache-maven-3.9.5 /opt/maven/apache-maven-3.9.5
# 设置环境变量
ENV PATH=/opt/maven/apache-maven-3.9.5/bin:$PATH
2、Jenkins中构建步骤的执行shell
shell
#!/bin/bash
# 如果存在,则删除镜像和容器,-f表示强制删除,即使容器在运行中
if [ $(docker ps -aq --filter name=sso) ]; then docker rm -f sso; fi
if [ $(docker images sso) ]; then docker rmi sso; fi
# 构建镜像,最后的.表示在当前目录执行
docker build -f Dockerfile -t sso .
docker run --name sso -d -e TZ="Asia/Shanghai" -p 8080:8080 sso
3、Dockerfile文件
shell
# 基础镜像
FROM openjdk-maven:17 as builder
# 镜像作者
MAINTAINER snowwalker
# 指定工作目录,是每个镜像内的工作目录,不是宿主机的目录,故可以统一为application,当然也可以是其他目录
# 容器启动后,进入容器内部,可以再application目录看到所有相关文件
WORKDIR application
# 将当前目录文件复制到指定目录
COPY . /application
# 设置为东八区
ENV TZ=Asia/Shanghai
# 打包项目,获取jar包
RUN mvn clean package -Dmaven.test.skip -s /opt/maven/apache-maven-3.9.5/conf/txz-settings.xml
# 变量
ARG JAR_FILE=target/*.jar
# 将文件复制到指定文件,这里的application可以是任意名,不一定要和WORKDIR一样
COPY ${JAR_FILE} application.jar
# 运行 application.jar
RUN java -Djarmode=layertools -jar application.jar extract
# spring boot 分层构建镜像
FROM openjdk:17
# 指定工作目录,要和上面的一直
WORKDIR application
# 下面的4个application都要和上面的保持一致
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
# 运行镜像时执行的命令
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
4、构建项目
配置完成后,来的首页,点击项目名称,进入项目详情页,点击立即构建,项目就会开始构建,下方的构建历史中会多出一条构建记录,如下所示

我们可以点击构建标号进入本次构建详情页,可以选择你想查看的信息,如下所示:

一般情况下我们都会进控制台查看日志,尤其是构建失败了,需要在控制台查看失败原因并修正。除了上面提到的通过构建详情页进入外,我们还可以直接在项目详情页进入,以下是两种快捷进入控制台的方式:

到这里文章就结束了,如果还有不清楚的地方,欢迎留言交流