spring boot 项目

写一个接口

在 gitee 上创建一个 sprint boot 项目,并添加一个接口

jenkins + gitee 部署 Sprint Boot_maven

打包注意事项

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http:///POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http:///POM/4.0.0 http:///xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.13.RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId></groupId>
    <artifactId>boot-shop</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>


    <build>
        <!-- jar 包名称 -->
        <finalName>${artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <!-- 必须添加, 否则无法 jar 包无法运行 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <!-- maven 镜像仓库地址, 防止下载依赖失败 -->
    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</project>

验证接口连通性

打包完成后, 上传到 linux, 直接 java -jar 启动, 并访问一个接口, 查看是否请求成功, 如果请求不成功需要解决, 比如防火墙问题

jenkins + gitee 部署 Sprint Boot_spring_02

脚本启动

目录结构

[laolang@localhost app]$ tree
.
├── boot-shop.jar
├── conf
│   ├── application.yml
│   └── logback-spring.xml
└── sbin
    └── 

2 directories, 4 files
[laolang@localhost app]$

配置文件

application.yml 

server:
  port: 8094
  servlet:
    context-path: /

spring:
  application:
    name: boot-shop

logging:
  level:
    org.springframework.web.servlet.DispatcherServlet: DEBUG
    com.laolang.jx: info
  config: classpath:logback-spring.xml
  file:
    path: ../logs/boot-shop

logback-spring.xml 

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">

    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->

    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <!--    <property name="log.path" value="/home/laolang/gitosc/km-boot/km-boot/logs/km-bbs/dev"/>-->

    <springProperty name="LOG_PATH" source="logging.path" defaultValue="../logs/boot-shop"/>
    <!-- <property name="LOG_FILE" value="shop-boot" /> -->

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>


    <!-- 输出到控制台 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!-- 日志输出到文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志文件输出格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 日志文件保留天数 -->
            <maxHistory>150</maxHistory>
        </rollingPolicy>
    </appender>

    <!--开发环境:打印控制台-->
    <!--<springProfile name="dev">-->
    <!--<logger name="com.laolang" level="debug"/>-->
    <!--</springProfile>-->

    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

启动脚本

#!/bin/bash
# 不添加此行,远程执行脚本环境变量不生效
source /etc/profile
source /home/laolang/.bashrc
APP_NAME=boot-shop.jar
OPTIONS=-Dspring.config.location=/home/laolang/app/conf/application.yml

#使用说明
usage() {
	echo "Usage: sh 执行脚本.sh [start|stop|restart|status]"
	exit 1
}

# 检查程序是否在运行
is_exist(){
	pid=$(pgrep -f $APP_NAME)
	# 如果不存在返回1,存在返回0
	if [ -z "${pid}" ]; then
		return 1
	else
		return 0
	fi
}

# 启动方法
start(){
	is_exist
	if [ $? -eq "0" ]; then
		echo "${APP_NAME} is already running. pid=${pid}. "
	else
		nohup java -jar $OPTIONS  ../$APP_NAME > /dev/null 2>&1 &
		echo "${APP_NAME} is running..."
	fi
}

# 停止方法
stop(){
	is_exist
	if [ $? -eq "0" ]; then
		kill -9 $pid
		echo "${APP_NAME} is stoped"
	else
		echo "${APP_NAME} is not running"
	fi
}

# 输出运行状态
status(){
	is_exist
	if [ $? -eq "0" ]; then
		echo "${APP_NAME} is running. Pid is ${pid}"
	else
		echo "${APP_NAME} is not running"
	fi
}

# 重启
restart(){
	stop
	start
}

# 根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
	"start")
		start
		;;
	"stop")
		stop
		;;
	"status")
		status
		;;
	"restart")
		restart
		;;
	*)
		usage
		;;
esac

测试

sbin 目录执行 ./console start , 然后使用 ./console status 查看服务状态, 最后请求一个接口并使用 tail -f 命令查看日志

jenkins + gitee 部署 Sprint Boot_maven_03


自由风格

直接远程执行命令

这种方式最好是把构建过程写在远程服务器脚本里面, 不然就要添加很多构建步骤, 每个构建步骤执行一条命令

安装插件 Publish over SSH

jenkins + gitee 部署 Sprint Boot_jar_04

配置

http://localhost:8080/jenkins/manage/configure

jenkins + gitee 部署 Sprint Boot_maven_05

timeout 设置为 0

jenkins + gitee 部署 Sprint Boot_spring_06

测试连接

jenkins + gitee 部署 Sprint Boot_spring_07

远程脚本准备

#!/bin/bash
source /etc/profile
source ~/.bashrc
# 停止项目
cd /home/laolang/app/sbin && ./ stop
# 删除 jar 包
rm -rf /home/laolang/app/boot-shop.jar
# 拉取代码
cd /home/laolang/gitee/boot-shop && git pull
# 打包
cd /home/laolang/gitee/boot-shop && mvn clean package
# 复制 jar 包到 app 目录
cp /home/laolang/gitee/boot-shop/target/boot-shop.jar /home/laolang/app/boot-shop.jar
# 启动项目
cd /home/laolang/app/sbin && ./ start

创建项目

点击 新建 Item

jenkins + gitee 部署 Sprint Boot_spring_08



jenkins + gitee 部署 Sprint Boot_jar_09

配置构建步骤

丢弃旧的构建

jenkins + gitee 部署 Sprint Boot_jenkins_10


源码管理: 无

jenkins + gitee 部署 Sprint Boot_spring_11

添加构建步骤

jenkins + gitee 部署 Sprint Boot_maven_12

设置超时为0

jenkins + gitee 部署 Sprint Boot_maven_13

执行构建

 随便改一点东西, 然后推送代码, 点击构建

jenkins + gitee 部署 Sprint Boot_jar_14


maven 方式构建


安装插件

gitee

在 https://gitee.com/profile/personal_access_tokens 添加一个令牌

jenkins + gitee 部署 Sprint Boot_jar_15


然后访问: http://localhost:8080/jenkins/manage/configure

jenkins + gitee 部署 Sprint Boot_jenkins_16

jenkins + gitee 部署 Sprint Boot_spring_17

Maven Integration

jenkins + gitee 部署 Sprint Boot_spring_18

配置

新建项目

jenkins + gitee 部署 Sprint Boot_jenkins_19

配置仓库地址

jenkins + gitee 部署 Sprint Boot_maven_20

构建前 clean

jenkins + gitee 部署 Sprint Boot_jenkins_21

maven 构建命令

jenkins + gitee 部署 Sprint Boot_spring_22


构建成功后再执行其他步骤

jenkins + gitee 部署 Sprint Boot_jenkins_23

构建后停止服务

脚本内容

#!/bin/bash
source /etc/profile
source ~/.bashrc
# 停止项目
cd /home/laolang/app/sbin && ./ stop

jenkins + gitee 部署 Sprint Boot_jar_24

上传文件

jenkins + gitee 部署 Sprint Boot_jenkins_25

效果

jenkins + gitee 部署 Sprint Boot_jenkins_26