原理:项目上传到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,点击立即构建
设置在控制台打印shell命令
在构建控制台可以看到,jenkins上传两个文件到服务器,并执行了shell命令
登录服务器,同时可以看到镜像和容器,都已经构建好了