手动部署 

部署也可以称为“发布”、“发版”、“上线”,一个接口,一个模块,一个功能,一个项目都能称之为部署。

开发周期

  • 大版本一到俩个月
  • 小版本小到一俩天,多到一俩周

可以使用jar包部署,借助docker镜像部署

1、项目打包

# maven原生方式打包 jar包中只有当前项目的文件 springboot项目使用springboot maven插件打成jar包:所有依赖的第三方的jar包会打包到一起

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

引入上述maven插件后,package打包

jenkins打包Springboot项目 jenkins springboot自动打包_spring boot

打包后的效果

jenkins打包Springboot项目 jenkins springboot自动打包_maven_02

把该jar包拖到桌面上,进入命令行窗口。下面是写的比较完整版的。额外加了一些jvm参数和指定端口号了

jenkins打包Springboot项目 jenkins springboot自动打包_jenkins_03

浏览器访问,没有一点毛病

jenkins打包Springboot项目 jenkins springboot自动打包_docker_04

我们这是在本机(windows)上部署的,是前台启动的方式


2、linux手动部署

linux 就可以使用nohup &,后台启动,以下是模板,比较全

# nohup:后台启动
# -Xmx500m -Xms500m: 堆内存大小配置
# -XX:+HeapDumpOnOutOfMemoryError: oom保存dump文件 
#  -jar xxx.jar  运行的jar包必须是springboot mvn插件打包的jar包
#   >xxx.log 2>&1  挑选2级别和1级别的输出日志到xxx.log中 
#  & 表示命令结束
nohup java   -Xmx500m -Xms500m -XX:+HeapDumpOnOutOfMemoryError   -jar xxx.jar >xxx.log 2>&1   &

找个目录,把我们的jar包使用xftp拖过去,进入该目录后

jenkins打包Springboot项目 jenkins springboot自动打包_spring boot_05

 貌似-jar这个参数可以放到前面也不影响

jenkins打包Springboot项目 jenkins springboot自动打包_java_06

nohup java -jar -Xmx500m -Xms500m -XX:+HeapDumpOnOutOfMemoryError hello-world-0.0.1-SNAPSHOT.jar &

浏览器访问

jenkins打包Springboot项目 jenkins springboot自动打包_spring boot_07

停止运行的jar

ps -ef | grep java

jenkins打包Springboot项目 jenkins springboot自动打包_jenkins_08

根据进程号pid,结束进程(前面那个)

jenkins打包Springboot项目 jenkins springboot自动打包_maven_09

kill -9 22116


jenkins自动部署

程序员只需要关心写代码即可,剩下的代码编译 测试 打包 生成制品(将生成不同版本的包保存到仓库中) 将jar包和他需要的环境一起打包成docker镜像保存到镜像仓库 需要部署的服务器拉取镜像 部署运行 运行失败生成警报发送给程序员

1、devops 开发|运维

为了减少 开发和运维之间的沟通成本

jenkins打包Springboot项目 jenkins springboot自动打包_docker_10

开发流程:

1、获取任务:(获取任务和bug)

禅道(项目管理软件 开源项目管理软件 免费项目管理软件 - 禅道开源项目管理软件)

2、开发

借助IDEA

3、提交到远程仓库

github/gitlab/gitee /svn

4、构建

使用工具对仓库中的代码进行构建(clean compile test package)

mvn jenkins

5、单元测试

unit test

6、生成报告+制作制品

单元测试报告处理

制作制品:将项目打包按照本次的版本号提交到 mvn仓库中

7、制作docker镜像

使用6的制品 根据Dockerfile 构建镜像(要执行的jar包 和依赖的镜像 和其他的环境参数)

推送镜像到远程镜像仓库

8、远程服务器

pull镜像 运行容器

9、监控

监控容器运行的情况,可以发送警告给开发者

闭环


2、安装&初始化jenkins

jenkins打包Springboot项目 jenkins springboot自动打包_java_11

Jenkins

安装jenkins

docker run \
    -u root \
    --restart=always \
    --name=myjenkins \
    -d \
    -p 8080:8080 \
    -p 50000:50000 \
    -v jenkins-data:/var/jenkins_home \
    -v /var/run/docker.sock:/var/run/docker.sock \
    jenkinsci/blueocean

# 查看jenkins容器日志,从日志中获取到初始化密码 docker logs 容器名称

docker logs myjenkins

 如下:

jenkins打包Springboot项目 jenkins springboot自动打包_jenkins_12

浏览器访问jenkins: http://虚拟机ip:8080

输入上一步查询到的密码,点击继续

jenkins打包Springboot项目 jenkins springboot自动打包_java_13

选中安装推荐的插件:

jenkins打包Springboot项目 jenkins springboot自动打包_maven_14

安装插件如果遇到以下错误(我没发生这个错)

jenkins打包Springboot项目 jenkins springboot自动打包_jenkins_15

解决方案:

拷贝cloudbees-folder.hpi到 Jenkins 容器的插件目录中即可:
docker cp /opt/cloudbees-folder.hpi jenkins容器名称:/var/jenkins_home/war/WEB-INF/detached-plugins
 # 重启jenkins容器
docker restart jenkins容器名
如果还有插件安装失败,可以访问下面的地址 手动下载,按照上面的步骤下载插件上传到jenkins容器
https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/
新建用户
新建用户选择新建并完成

jenkins打包Springboot项目 jenkins springboot自动打包_maven_16

一路按照默认下一步,最后选择重启jenkins  

使用新建账户登录

jenkins打包Springboot项目 jenkins springboot自动打包_maven_17

登录后界面

jenkins打包Springboot项目 jenkins springboot自动打包_spring boot_18


3、部署流水线

jenkins打包Springboot项目 jenkins springboot自动打包_maven_19

1.新建任务 

jenkins打包Springboot项目 jenkins springboot自动打包_jenkins_20

2.流水线任务配置

记得选择 Hello World

jenkins打包Springboot项目 jenkins springboot自动打包_docker_21

3.执行流水线任务

这有点乱,自己找的点点吧

jenkins打包Springboot项目 jenkins springboot自动打包_maven_22

 使用Blue Ocean

jenkins打包Springboot项目 jenkins springboot自动打包_spring boot_23

 

jenkins打包Springboot项目 jenkins springboot自动打包_docker_24

莫名其妙就成功了

jenkins打包Springboot项目 jenkins springboot自动打包_java_25

流水线语法

jenkins打包Springboot项目 jenkins springboot自动打包_jenkins_26

jenkins打包Springboot项目 jenkins springboot自动打包_docker_27


springboot项目流水线部署

开发springboot项目,完成后推送项目到gitee远程仓库;

jenkins可以从gitee远程仓库中拉取项目的源码 进行编译测试打包,然后运行jar包

jenkins打包Springboot项目 jenkins springboot自动打包_java_28

热部署

所谓热部署指的就是一旦jenkins通过webhook监听到代码仓库有push操作,自动执行拉取代码编译发布等功能

一般不采用热部署,一般是手动构建项目

1、将项目推送到远程仓库

在项目目录下创建deploy目录,目录下创建jenkinsfile文件,文件内容暂且简单如下

pipeline {
    agent any
    stages {
        stage('pull code') {
            steps {
                sh 'pwd'
                //查看当前所在的位置
                echo 'pull code'
                sh 'ls -l'
            }
        }
    }
}

jenkins打包Springboot项目 jenkins springboot自动打包_spring boot_29


2、jenkins配置远程仓库

选择配置git远程仓库地址

jenkins打包Springboot项目 jenkins springboot自动打包_jenkins_30

 注意:指定使用的jenkins脚本路径

jenkins打包Springboot项目 jenkins springboot自动打包_spring boot_31

保存任务并执行构建

jenkins打包Springboot项目 jenkins springboot自动打包_jenkins_32


3、安装jenkins安装docker插件

jenkins打包Springboot项目 jenkins springboot自动打包_docker_33

把前面4个下载

jenkins打包Springboot项目 jenkins springboot自动打包_jenkins_34

 重启成功后,只要在系统管理中看到docker代表安装成功:

jenkins打包Springboot项目 jenkins springboot自动打包_jenkins_35

流水线语法中也多了:使用docker容器构建运行

jenkins打包Springboot项目 jenkins springboot自动打包_maven_36


4、准备mvn配置文件

在项目deploy目录下创建settings.xml配置文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
 <localRepository>/mvn/repository</localRepository>
  <mirrors>
	 <mirror>
		<id>nexus-aliyun</id>
		<mirrorOf>central</mirrorOf>
		<name>Nexus aliyun</name>
		<url>http://maven.aliyun.com/nexus/content/groups/public</url>
	</mirror>
  </mirrors>
  <profiles>
	<profile>
		<id>jdk-1.8</id>
		<activation>
			<activeByDefault>true</activeByDefault>
			<jdk>1.8</jdk>
		</activation>
		<properties>
			<maven.compiler.source>1.8</maven.compiler.source>
			<maven.compiler.target>1.8</maven.compiler.target>
			<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
		</properties>
	</profile>
  </profiles>
</settings>

5、在项目deploy下创建Dockerfile

通过Dockerfile打包docker镜像

jenkins打包Springboot项目 jenkins springboot自动打包_maven_37

# 基于openjdk:8镜像创建新镜像
FROM openjdk:8
# 镜像作者
MAINTAINER atguigu
# 创建镜像时的jar
COPY target/*.jar /demo.jar
# 声明需要暴露的端口 
EXPOSE 9527
# 执行命令运行jar包(也可以使用RUN)
ENTRYPOINT ["nohup" ,"java" ,"-jar" ,"/demo.jar" ,"--server.port=9527" ,"&"]

6、准备jenkins脚本

//定义Jenkins如何自动化部署这个项目; groovy 脚本  gradle(groovy脚本)[maven]
pipeline {
    agent any  //使用任意一个安装了Jenkins的服务器执行下面脚本
    parameters { //参数化构建
        string(name: 'vernum', defaultValue: 'v1.0', description: '输入此次发布版本?')
    }
    stages {  //定义很多阶段
        stage('项目打包') {
            steps {
                //步骤  mvn clean package
                sh 'echo 项目正在打包'
                withDockerContainer(args: '-v /mvn/repository:/mvn/repository', image: 'maven:3.8-openjdk-8') {
                    // some block
                    //在maven中运行以下命令
                    sh 'mvn -v'
                    sh 'ls -al'
                    sh 'mvn -s "deploy/settings.xml" clean package  -DskipTest' //打包不用测
                    sh 'ls -al target'
                }
            }
        }
        stage('项目测试') {
            steps {
                //
                sh 'echo 项目正在测试'
                withDockerContainer(args: '-v /app/mvn:/mvn/repos', image: 'maven:3.8-openjdk-8') {
                    // some block
                    //在maven中运行以下命令
                    sh 'ls -al'
                    sh 'mvn -s "deploy/settings.xml" test' //进行测试。并且生成测试报告
                }
            }
        }

        stage('制作镜像') {
            steps {
                sh 'echo 项目正在部署'
                sh 'ls -al'
                sh 'ls -al target'
                sh "docker build -f deploy/Dockerfile -t demo:${vernum} ."
                sh 'docker images|grep demo'
            }
        }
        stage('项目部署') {
            steps {
                sh 'echo 项目正在部署'
                sh "docker run -p 9527:9527 --restart=always -d --name=demo01 demo:${vernum}"
            }
        }
    }
}

7、执行jenkins任务

运行jenkins任务

jenkins打包Springboot项目 jenkins springboot自动打包_java_38

输入版本号,将项目打包按照本次的版本号提交到 mvn仓库中

jenkins打包Springboot项目 jenkins springboot自动打包_java_39

经过一段时间

jenkins打包Springboot项目 jenkins springboot自动打包_maven_40

jenkins打包Springboot项目 jenkins springboot自动打包_maven_41

在浏览器访问测试

jenkins打包Springboot项目 jenkins springboot自动打包_spring boot_42