Docker+Jenkins+Git自动部署项目

一、环境准备

宿主机要安装jdkmaven,这里就不展开讲了。

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:50000Jenkins使用的两个端口映射,核心是第一个,将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:17Dockerfile文件如下所示:

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、构建项目

配置完成后,来的首页,点击项目名称,进入项目详情页,点击立即构建,项目就会开始构建,下方的构建历史中会多出一条构建记录,如下所示

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

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

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

相关推荐
zwjapple26 分钟前
docker-compose一键部署全栈项目。springboot后端,react前端
前端·spring boot·docker
tan180°2 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
代码老y2 小时前
Docker:容器化技术的基石与实践指南
运维·docker·容器
wuk9983 小时前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社23 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
why技术3 小时前
Stack Overflow,轰然倒下!
前端·人工智能·后端
幽络源小助理4 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
ai小鬼头5 小时前
AIStarter如何助力用户与创作者?Stable Diffusion一键管理教程!
后端·架构·github
简佐义的博客5 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang