Docker+Jenkins+Gitee自动化部署maven项目的实现

作者:fkjavaer 时间:2021-07-03 15:52:47 

1.简介

各位看官老爷,本文为Jenkins实战,注重实际过程,阅读完会有以下收获:

  • 了解如何使用Docker安装Jenkins

  • 了解如何使用Jenkins部署maven项目

  • 了解如何使用Jenkins+Gitee实现自动化部署

2.Jenkins介绍

相信,正在读这篇文章的你,对Jenkins应该有或多或少的了解,就算没有也应该在某个地方听说过。??

接下来,我们就一起来进行探索吧。??

2.1 Jenkins是什么

Jenkins是一个开源的自动化工具,可以自动化地完成构建、测试、交付或部署等任务。总之重点就是三个字:自动化,至于如何实现这些功能,Jenkins基于插件化的机制,提供了众多的插件来完成持续集成与持续部署。

2.2 什么是持续集成与持续部署

在软件开发中经常会提到持续集成(Continuous Integration)和持续部署(Continuous Delivery),那么它们的真正意思是什么呢?

  • 『持续集成』:当我们向代码仓库提交代码后,可以对变更进行监测,进而实现自动拉取代码、构建、测试等操作。试想一下,如果这些操作都手动进行,效率是非常低的,因而提出了持续集成。

  • 『持续部署』:持续集成帮助我们实现了对项目的自动化构建、测试等工作,我们知道,项目最终需要部署到服务器上,在不借助Jenkins的情况下,需要我们手动将项目部署到服务器上,如果项目数量多,就会容易出现错误且效率低,而且特别麻烦,因而提出了持续部署,来实现对项目的自动化部署。

同样滴,Jenkins借助插件,例如Maven、Git、Pipeline、SSH等来实现这一系列的功能。

3.Docker安装Jenkins

系统环境:ubuntu20.04 + Docker20.10.8

3.1 拉取镜像

docker pull jenkins/jenkins:lts

Docker+Jenkins+Gitee自动化部署maven项目的实现

3.2 启动容器

docker run -d --restart=always --name jenkins -uroot -p 8080:8080 -p 50000:50000 -v /home/docker/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker jenkins/jenkins:lts

说明:这里我们挂载了宿主机的/var/run/docker.sock以及/usr/bin/docker,是因为,我们后续需要在容器内执行docker相关命令。

3.3 Jenkins初体验

访问http://192.168.110.101:8080,会出现如下界面:

Docker+Jenkins+Gitee自动化部署maven项目的实现

提示我们可以去容器的/var/jenkins_home/secrets/initialAdminPassword中查看登录密码,我们一开始已经将/var/jenkins_home挂载到宿主机的/home/docker/jenkins,因此我们直接去宿主机的对应目录进行查看。

# 查看初始化登录密码
cat /home/docker/jenkins/secrets/initialAdminPassword

Docker+Jenkins+Gitee自动化部署maven项目的实现

然后将密码复制粘贴到输入框,会进入如下界面:

Docker+Jenkins+Gitee自动化部署maven项目的实现

不得不说,这里Jenkins的选项对于新手小白还是挺友好的,我们选择安装推荐的插件,至于后面我们所要用到的功能,再去插件市场按需安装即可。

Docker+Jenkins+Gitee自动化部署maven项目的实现

可以看到,Jenkins为我们安装了Git、Pipeline等常用插件,因为Jenkins默认使用的是国外的安装源,咱们耐心等待一下。??

经历过漫长的等待,终于,终于,这个步骤是走完了,但还是有些插件下载失败了,后续我们再手动安装吧。不得不说,这下载速度着实有点慢啊!!!

Docker+Jenkins+Gitee自动化部署maven项目的实现

这里我们就不创建新用户了,使用admin账户继续。

Docker+Jenkins+Gitee自动化部署maven项目的实现

点击保存并完成。提示部分插件需要重启才会生效。

Docker+Jenkins+Gitee自动化部署maven项目的实现

终于,它来了。小伙伴们上号!!!

Docker+Jenkins+Gitee自动化部署maven项目的实现

主界面如下:

Docker+Jenkins+Gitee自动化部署maven项目的实现

这里我们先修改一下admin账户的登录密码,否则只能使用安装时提到的初始化密码。当然,如果你在前面的步骤中创建了新的管理员用户,就可以忽略该步骤。

Docker+Jenkins+Gitee自动化部署maven项目的实现

4.Jenkins插件安装、环境配置

4.1 插件安装

我们这里是部署一个maven的单模块项目,同时需要用到Gitee的WebHook,因此需要下载Maven、Gitee相关的插件,所以在Jenkins首页选择系统管理—》插件管理,搜索进行下载即可。

Docker+Jenkins+Gitee自动化部署maven项目的实现

下载完成后,点击返回首页。

Docker+Jenkins+Gitee自动化部署maven项目的实现

4.2 配置maven

在Jenkins首页点击系统管理—》全局工具配置。在这里我们可以对Maven、JDK等要使用的环境进行配置。我这里只对Maven进行了配置,JDK无需配置,因为我们后续在将项目打包成Docker镜像时,会将JRE运行环境一起打包。

Docker+Jenkins+Gitee自动化部署maven项目的实现

Docker+Jenkins+Gitee自动化部署maven项目的实现

在Maven配置这里,使用默认Maven配置即可。由于我们的Jenkins运行在Docker之中,因此需要在容器中安装Maven,这里我们选择自动安装(会安装到/var/jenkins_home/tools目录下),也可以自行下载,然后将文件放在该目录下即可。

4.3 添加凭据

由于需要使用Git从Gitee仓库拉取代码,我们这里添加一个Gitee的SSH key。Jenkins首页—》系统管理—》Credentials,这里应该是Jenkins的汉化插件没有汉化完全,不过无伤大雅。

Docker+Jenkins+Gitee自动化部署maven项目的实现

Docker+Jenkins+Gitee自动化部署maven项目的实现

1)添加凭据页面

Docker+Jenkins+Gitee自动化部署maven项目的实现

2)创建SSH key

Gitee官方提供了添加生成SSH key的方法:https://gitee.com/help/articles/4181,总结命令如下:

# 生成密钥,一直按回车即可。
ssh-keygen -t ed25519 -C "jenkins@example.com"
# 查看公钥
cat ~/.ssh/id_ed25519.pub
# 将host添加到SSH信任列表
ssh -T git@gitee.com

接下来我们就进入Jenkins容器,执行这些命令。

docker exec -it jenkins bash

Docker+Jenkins+Gitee自动化部署maven项目的实现

Docker+Jenkins+Gitee自动化部署maven项目的实现

3)Gitee设置中添加SSH key

Docker+Jenkins+Gitee自动化部署maven项目的实现

这时候我们再回过头来,将私钥添加到凭据中,一个凭据就添加好了。

Docker+Jenkins+Gitee自动化部署maven项目的实现

5.Jenkins自动化部署Maven单模块项目

5.1 准备Maven项目

准备一个Maven项目,我这里是一个简单的基于SpringBoot的Web项目。项目结构如下:

Docker+Jenkins+Gitee自动化部署maven项目的实现

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.5.7</version>
       <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.stone</groupId>
   <artifactId>jenkins-test</artifactId>
   <version>1.0.0-SNAPSHOT</version>
   <description>Jenkins-test</description>
   <properties>
       <java.version>11</java.version>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
       <maven.compiler.source>11</maven.compiler.source>
       <maven.compiler.target>11</maven.compiler.target>
   </properties>
   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
           <version>2.5.7</version>
       </dependency>
   </dependencies>
   <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
               <configuration>
                   <!--开启分层构建-->
                   <layers>
                       <enabled>true</enabled>
                   </layers>
               </configuration>
           </plugin>
       </plugins>
   </build>
</project>

Dockerfile

# 指定基础镜像,这是分阶段构建的前期阶段
FROM openjdk:11-jre   as builder
# 执行工作目录
WORKDIR apps
# 配置参数
ARG JAR_FILE=target/*.jar
# 将编译构建得到的jar文件复制到镜像空间中
COPY ${JAR_FILE} application.jar
# 通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract
# 正式构建镜像
FROM openjdk:11-jre
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
WORKDIR apps
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer
COPY --from=builder apps/dependencies/ ./
COPY --from=builder apps/spring-boot-loader/ ./
COPY --from=builder apps/snapshot-dependencies/ ./
COPY --from=builder apps/application/ ./
ENTRYPOINT java ${JAVA_OPTS} org.springframework.boot.loader.JarLauncher

5.2 准备外网映射

由于我这里是在虚拟机上搭建的环境,为了能够在更新仓库代码时通过WebHook触发自动构建,需要进行外网映射,使用云服务器的小伙伴可以忽略此步骤。

由于只需要达到演示的效果,我这里使用的是免费的ngrok。下载地址:https://ngrok.com/download

Docker+Jenkins+Gitee自动化部署maven项目的实现

# 安装snapd,才能使用snap安装ngrok
apt install -y snapd
# 安装ngrok
snap install ngrok

如下图所示,表示已经安装成功。

Docker+Jenkins+Gitee自动化部署maven项目的实现

这里需要注册一个ngrok的账号,才能获得authtoken。我这里已经注册好了,直接执行ngrok config add-authtoken xxx就行

# xxx为对应的token
ngrok config add-authtoken xxx

现在我们将虚拟机服务器的8080端口映射出去。出现如下界面就表示映射成功。

ngrok http 8080

Docker+Jenkins+Gitee自动化部署maven项目的实现

5.3 Jenkins任务配置

1)新建任务

Jenkins首页点击新建任务,选择构建一个maven项目。

Docker+Jenkins+Gitee自动化部署maven项目的实现

2)Git配置

Docker+Jenkins+Gitee自动化部署maven项目的实现

3)Gitee的webhook配置

我这儿勾选的是当仓库有推送代码事件时触发自动构建。

Docker+Jenkins+Gitee自动化部署maven项目的实现

配置WebHook密码。

Docker+Jenkins+Gitee自动化部署maven项目的实现

Gitee中添加WebHook。

Docker+Jenkins+Gitee自动化部署maven项目的实现

4)编译、打包

Docker+Jenkins+Gitee自动化部署maven项目的实现

5)编译、打包后执行后置脚本

Docker+Jenkins+Gitee自动化部署maven项目的实现

我这儿准备了一个deploy.sh,并放在容器的/var/jenkins_home/sh目录下

Docker+Jenkins+Gitee自动化部署maven项目的实现

deploy.sh

#!/bin/bash
# 服务名称
SERVER_NAME=$1
# 镜像tag
IMAGE_TAG=$2
# 镜像名称
IMAGE_NAME=$SERVER_NAME:$IMAGE_TAG
echo "------ 开始构建镜像:${SERVER_NAME} ------"
docker build -t ${IMAGE_NAME} .
echo "------ 镜像构建结束:${IMAGE_NAME} ------"
if [[ -n $(docker ps -q -f "name=^${SERVER_NAME}$") ]];then
   echo "------ 容器正在运行:${SERVER_NAME} ------"
   echo "------ 停止容器:$SERVER_NAME ------"
   docker stop $SERVER_NAME
   echo "------ 删除容器:$SERVER_NAME ------"
   docker rm $SERVER_NAME
else
   echo "------ 容器未在运行:${SERVER_NAME} ------"
   echo "------ 删除容器:$SERVER_NAME ------"
   docker rm $SERVER_NAME
fi
echo "------ 开始运行容器:$SERVER_NAME ------"
docker run -d --name $SERVER_NAME -p 9090:9090 ${IMAGE_NAME}
echo "------ 清理虚悬镜像 ------"
if [[ -n $(docker images | grep "none" | awk '{print $3}') ]];then
   docker rmi -f $(docker images | grep "none" | awk '{print $3}')
fi

5.4 手动部署

1)点击立即构建

Docker+Jenkins+Gitee自动化部署maven项目的实现

2)查看日志

拉取代码。

Docker+Jenkins+Gitee自动化部署maven项目的实现

编译、打包。

Docker+Jenkins+Gitee自动化部署maven项目的实现

构建镜像、运行容器。

Docker+Jenkins+Gitee自动化部署maven项目的实现

查看运行中的容器,jenkins-maven已成功运行。

Docker+Jenkins+Gitee自动化部署maven项目的实现

5.5 自动部署

Docker+Jenkins+Gitee自动化部署maven项目的实现

查看日志,拉取到最新的commit信息。

Docker+Jenkins+Gitee自动化部署maven项目的实现

来源:https://blog.csdn.net/weixin_43834401/article/details/130971053

标签:Docker,Jenkins,Gitee,maven
0
投稿

猜你喜欢

  • 详解Docker Volume 之权限管理

    2023-06-24 18:58:45
  • CentOS 开机启动自定义脚本详解及实现

    2023-11-02 19:26:03
  • Linux下Sendmail服务器转发功能的讲解

    2010-03-12 19:13:00
  • 金山毒霸进军泰国市场或将为网游国际化布局

    2010-03-04 12:54:00
  • 论坛推广四要素

    2010-03-07 16:30:00
  • 管理FTP站点服务器[图文]

    2008-06-09 15:12:00
  • 揭秘UCenter Home 2.0表态功能

    2009-08-05 20:37:00
  • dedeCMS站内搜索代码的改进

    2010-01-16 17:25:00
  • Opera发布网络信息交互技术Opera Unite测试版

    2009-10-14 18:00:00
  • 最新的SEO优化公式

    2009-02-19 08:51:00
  • 搜索引擎为网站导流量:百度74.88% 谷歌13.54%

    2007-09-08 08:01:00
  • 外部链接是什么意思

    2008-08-22 13:17:00
  • 被忽视的Windows Server 2008十大功能

    2009-10-11 15:31:00
  • error while loading shared libraries xx.so处理方法

    2023-10-06 15:02:05
  • 用Windows2008 Server防火墙 确保系统安全

    2009-10-14 14:46:00
  • 如何经营好网站是值得各位站长深思的问题

    2010-03-07 16:54:00
  • 网站价值判断之网民回头率

    2008-05-20 18:43:00
  • php查询Oracle 数据

    2010-12-14 15:04:00
  • Web 服务器日志工具点评

    2008-04-18 15:55:00
  • linux搭建NFS文件共享服务器的步骤详解

    2023-08-04 23:14:49
  • asp之家 网站运营 m.aspxhome.com