一、环境准备
宿主机要安装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、构建项目
配置完成后,来的首页,点击项目名称,进入项目详情页,点击立即构建
,项目就会开始构建,下方的构建历史中会多出一条构建记录,如下所示
我们可以点击构建标号进入本次构建详情页,可以选择你想查看的信息,如下所示:
一般情况下我们都会进控制台查看日志,尤其是构建失败了,需要在控制台查看失败原因并修正。除了上面提到的通过构建详情页进入外,我们还可以直接在项目详情页进入,以下是两种快捷进入控制台的方式:
到这里文章就结束了,如果还有不清楚的地方,欢迎留言交流