likes
comments
collection
share

Docker+Jenkins+Git自动部署项目

作者站长头像
站长
· 阅读数 6

一、环境准备

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

安装Jenkins

1、拉取Jenkins镜像

 docker pull jenkins/jenkins

2、运行镜像

 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环境变量,如下所示

Docker+Jenkins+Git自动部署项目

二、配置项目自动部署

1、安装插件

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

Docker+Jenkins+Git自动部署项目

2、创建项目

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

Docker+Jenkins+Git自动部署项目

3、配置项目

第一个配置项General可以简单看下,没有要特殊说明的

3.1 源码管理

就是配置你的源码地址,以及凭据和代码分支等,如下图所示

Docker+Jenkins+Git自动部署项目

3.2 构建触发器

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

Docker+Jenkins+Git自动部署项目

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

Docker+Jenkins+Git自动部署项目

3.3 配置git项目

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

Docker+Jenkins+Git自动部署项目

3.4 添加构建步骤

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

Docker+Jenkins+Git自动部署项目

shell脚本是用来配合我们项目中的Dockerfile文件来完成项目的构建和部署,因此两者是息息相关的。

这里给出了两种方式:一种是在Jenkins中打包项目;另一种是在镜像中打包项目。

两种方式只是项目打包的位置不一样,大的流程是一样的,这里推荐第一种方式,在Jenkins中打包。前面构建Jenkins时,已经挂载好了仓库目录,因此每次打包都可以共用maven仓库,不用每次都远程下载依赖,一定程度上缩短了我们项目的部署时间。

这里给出的打包方式是spring boot的分层打包,具体可以参考官方文档

组合一:Jenkins中打包项目

该方式要求Jenkins中配置maven环境,因为是在Jenkins中打包项目

1、Jenkins中构建步骤的执行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包中的依赖项和资源提取到当前目录了,故这里直接复制即可

 # 基础镜像
 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文件如下所示:

 # 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

 #!/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文件

 # 基础镜像
 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、构建项目

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

Docker+Jenkins+Git自动部署项目

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

Docker+Jenkins+Git自动部署项目

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

Docker+Jenkins+Git自动部署项目

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