jenkins结合springboot、maven、svn进行持续集成

原理:项目上传到svn,通过jenkins拉取到上传的svn代码库项目,接着将拉取到的项目部署到服务器上并执行shell命令运行项目,这就是对项目进行进行持续集成的整个流程,每当改动代码上传到svn,通过jenkins拉取,并且重新构建


我们创建一个简单的springboot项目,并且可以打成jar包在本地访问

1、创建一个可以访问的controlle

package com.example.demo.controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("app/")
public class HelloController {

    public static int view = 0;

    @GetMapping("hello")
    public String hello()
    {
        view++;
        return "你好,当前浏览量统计:"+view;
    }
}

2、配置文件,项目访问端口

server:
  port: 8000

3、pom依赖

<?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 https://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.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4、创建Dockerfile文件,为后面打包成docker镜像

# 设置来源的基础镜像
FROM openjdk:8u181-jdk-alpine

# 把jar添加到容器中并命名为app
ADD *.jar app.jar

# 容器运行时监听的端口
EXPOSE 8000

# 容器启动时要运行的命令
ENTRYPOINT ["java","-jar","app.jar"]


第一步、新建一个任务,输入任务名

如果这里没有maven选项,是少了【Maven Integration plugin】这个插件


第二步、配置svn管理,这一步就是告诉jenkins,需要拉取项目的svn地址

如果这里的源码管理没有svn选项,则需要下载svn插件


第三步、配置构建过程,这里是通过maven构建和编译项目


这样我们就可以开始构建项目了,jenkins首先通过svn插件从svn仓库拉取项目,接着用maven插件去构建和编译打包

同时我们可以查看控制台,监控具体的构建过程,

jenkins通过svn插件,会从svn版本库拉取项目到jenkins的workspace目录下

可以看到最后项目构建成功,至此jenkins的构建工作完成,我们在主目录看到项目

由于之间对jenkins进行了挂在,所以在在服务器也可以看到拉取到的项目

到此jenkins构建成功并拉取到项目,接下来就要考虑怎么把项目部署到服务器中


部署项目到docker容器,使用Publish Over SSH远程部署

第一步、下载插件 这个插件是不在默认安装插件的范围内的,需要先手动安装下

第二步、在系统管理中配置需要远程部署的服务器

第三步、在项目中使用插件(构建中使用的话名为Send files or execute commands over SSH,构建后使用的话名为Send build artifacts over SSH)。

Name :选择需要的服务器
Source files: 需要上传的文件。支持通配符。需要特别注意的是,需要上传的文件必须位于jenkins中的workspace中的项目中,否则会上传失败。
Remove prefix:移除指定前缀。例如我指定了移除test,这个文件会直接上传到/home/test/html/下,否则会上传到/home/test/html/test下。
Remote directory:远程目录。注意! 此目录是基于之前设置服务器时设置远程目录的,即这里的目录是位于服务器设置目录下的相对目录。
Exec command:需要执行的命令,如下

方式一、这里需要注意,因为我使用了卷挂载目录,将jenkins容器中的目录挂载到了宿主机中,所以没有使用上传文件这个步骤,而是直接从宿主机的挂载目录拿到最新的项目

#自定义的工作路径(Dockerfile存放的路径)
MY_WORK_PATH=/home/work

# jenkins的工作空间路径
JENKINS_WORK_PATH=/home/jenkins-data/workspace

# 项目名(docker 镜像/容器都用这个名字)
PROJECT_NAME=my-demo

# 项目中jar的名字
JAR_NAME=demo-0.0.1-SNAPSHOT


#容器id
CID=$(docker ps | grep "$PROJECT_NAME" | awk '{print $1}')
#镜像id
IID=$(docker images | grep "$PROJECT_NAME" | awk '{print $3}')


# 开始重新构建项目
function transfer(){
    if [ ! -d $MY_WORK_PATH ];then
        mkdir -p $MY_WORK_PATH
        cp $JENKINS_WORK_PATH/$PROJECT_NAME/target/$JAR_NAME.jar $MY_WORK_PATH
        cp $JENKINS_WORK_PATH/$PROJECT_NAME/Dockerfile $MY_WORK_PATH
    else
        rm -rf $MY_WORK_PATH/*
        cp $JENKINS_WORK_PATH/$PROJECT_NAME/target/$JAR_NAME.jar $MY_WORK_PATH
        cp $JENKINS_WORK_PATH/$PROJECT_NAME/Dockerfile $MY_WORK_PATH
    fi     
}

# 删除之前的镜像和容器
function delete(){
        docker stop $CID
        docker rm $CID
        docker rmi $IID
}

# 构建docker镜像
function build(){
		cd $MY_WORK_PATH
		docker build -t $PROJECT_NAME .
}

# 运行docker容器
function run(){
    echo "构建最新代码"
	transfer
    delete
	build
	docker run --name $PROJECT_NAME -v $MY_WORK_PATH:$MY_WORK_PATH -d -p 8000:8000 $PROJECT_NAME
	echo "$PROJECT_NAME容器创建完成"
}
 
#入口
run

方式二、正常情况下,jenkins和项目不在一个服务器,所以需要将jenkins中的workspaces中的项目中的文件上传到服务器,然后执行命令 (如果上传到服务器的目录不存在,则会自动创建)

#自定义的工作路径(Dockerfile存放的路径)
MY_WORK_PATH=/home/work

# 项目名(docker 镜像/容器都用这个名字)
PROJECT_NAME=my-demo


#容器id
CID=$(docker ps | grep "$PROJECT_NAME" | awk '{print $1}')
#镜像id
IID=$(docker images | grep "$PROJECT_NAME" | awk '{print $3}')

# 删除之前的镜像和容器
function delete(){
        docker stop $CID
        docker rm $CID
        docker rmi $IID
}

# 构建docker镜像
function build(){
		cd $MY_WORK_PATH
		docker build -t $PROJECT_NAME .
}

# 运行docker容器
function run(){
    echo "构建最新代码"
	transfer
    delete
	build
	docker run --name $PROJECT_NAME  -d -p 8000:8000 $PROJECT_NAME
	echo "$PROJECT_NAME容器创建完成"
}
 
#入口
run

docker run参数

   --name docker-test                 容器的名字为docker-test
   -d                                 容器后台运行
   -p 8000:8000                       指定容器映射的端口和主机对应的端口都为8000
   -v /work/project/:/work/project/   将主机的/work/project/目录挂载到容器的/work/project/ 目录中(不可少每次本地更新jar包重启容器即可,不用重新构建镜像)

第四步、进入jenkins,点击立即构建 

在构建控制台可以看到,jenkins上传两个文件到服务器,并执行了shell命令

登录服务器,同时可以看到镜像和容器,都已经构建好了

猜你喜欢

转载自blog.csdn.net/bbj12345678/article/details/115047107