高效部署Springboot的三种方式。

文章目的: 自动化,提升生产效率。

第一种方式:使用Idea deployment工具半自动化。

idea new 一个 springboot项目, 勾选 spring web依赖。

(1):编写一个Controller,记得在要启动函数的同一子包下面,否则扫包找不到,须要手动添加扫包地址。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloCtl {

    @GetMapping("/hello")
    private String hello(){
        return "来自idea deployment的问候";
    }
}
复制代码

(2):配置devployment地址和文件关系映射。

使用Maven打包一下。 链接成功便可配置文件映射关系。java

便可完成上传,不知道idea为啥不能检测到jar的更新,并自动上传新jar包,可是代码的更新就能够作到自动上传,有人知道如何解决吗?python

java -jar ***.jar
复制代码

自行访问下 主机:8080/hello。 至于如何自动化启动新jar包,能够经过shell或python脚本解决。git

  • while循环判断文件是否更新。
  • 更新及kill当前springboot进程,并重启新jar包。
  • 好像不是特别规范,这样更新。

第二种:经过Docker

(1):一样新建一个Springboot,配置docker,配置dockerfile。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloCtl {
    
    @GetMapping
    public String hello(){
        return "来自docker的问候";
    }
    
}
复制代码

配置idea的dockergithub

将Springboot打成jar包,maven package。并提早把openjdk:8这个镜像pull下来

docker pull openjdk:8
复制代码

在target目录下添加Dockerfile文件。web

FROM openjdk:8
COPY demo-0.0.1-SNAPSHOT.jar /tmp/app.jar WORKDIR /tmp ENTRYPOINT ["java", "-jar", "app.jar"] 复制代码

记住上面的 demo-0.0**.jar包是对应你本身的jar包记得修改下。spring

(2):添加一个docker 运行的上下文环境。

配置好运行环境后,点击运行便可
使用浏览器访问 localhost:8080,便可收到来自docker的问候。

(3):push 构建好的Image到docker hub或docker私服,在服务器端部署

docker pull 你的镜像
docker run -p 8080:8080 你的镜像
复制代码

第三种方式(推荐方式): CI(持续集成) Jenkins+Gitlab+Docker

这种方式简单来讲,传统部署流程中 git Push新代码->拉取新代码->Maven构建产生新Image->拉取新Image->删除旧Image,删除旧容器->运行新Image->经过http或者浏览器检查项目是否正常。而CI中,开发人员只须要关心git Push新代码和检查项目是否运行正常,中间繁琐重复的劳动由自动化构建工具Jenkins+Gitlab+Docker完成,开发人员只须要经过简单配置,实现高度定制的的自动化部署。docker

(1)(可选,能够选择不搭,直接用已有github或者其余git平台):搭gitlab私服,我想搭github来着,找了半天没有解决。

docker pull gitlab/gitlab‐ce:latest
复制代码

gitlab有点大,须要耐心等下。
docker 加速(可选)shell

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["你的docker加速地址,好比https://skdgjskd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
复制代码

加速地址领取地址https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors。json

建立挂载文件夹和启动容器浏览器

#建立挂载文件夹
mkdir -p /opt/gitlab/etc
mkdir -p /opt/gitlab/log
mkdir -p /opt/gitla/data
#gitlab
docker run \
    --detach \
    --publish 8443:443 \
    --publish 8090:80 \
    --name gitlab \
    --restart always \
    -v /opt/gitlab/etc:/etc/gitlab \
    -v /opt/gitlab/log:/var/log/gitlab \
    -v /opt/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab‐ce:latest
#修改配置
 vi /opt/gitlab/etc/gitlab.rb
 #打开以后修改 external_url 'http://{这里填你的宿主机的ip地址}' 
vi /opt/gitlab/data/gitlab-rails/etc/gitlab.yml
#打开之后找到
# gitlab:
# ## Web server settings (note: host is the FQDN, do not include http://)
# host: {这里填你的宿主机地址}
# port: {这里填8090}
# https: false

#最后浏览器访问 主机ip地址:8090,便可验证是否搭建成功。
#设置root密码,并能够用root帐户登陆
复制代码

(2) 搭建Jenkins,必需要搭。

docker run -p 8080:8080 -p 50000:50000 -v jenkins_data:/var/jenkins_home -v jenkinsci/blueocean 
#jenkin容器启动须要时间
复制代码

#上面说到要你去输入jenkin密码,须要咱们进入jenkin容器进行查看。
docker exec -it 7f485bd95c3b  /bin/bash 进入jenkins容器 
cat /var/jenkins_home/secrets/initialAdminPassword
复制代码

输入密码后,进入jenkins,选择推荐安装,能够选择直接使用admin帐户登陆,密码就是上面cat到的。

(3) 搭建docker私服(可选,能够用公服)

docker run ‐‐name docker‐registry ‐d ‐p 5000:5000 registry
vi /etc/docker/daemon.json
#添加如下内容
#{ "insecure‐registries":["宿主机IP地址:5000"]}
#添加完成后,systemctl restart docker并启动容器便可。
复制代码

(4) 配置Jenkins JDK,Maven,Docker, Git及插件环境。

#进入jenkins容器
ssh-keygen -t rsa
cat /var/jenkins_home/.ssh/id_rsa.pub 
复制代码

添加cat到的公钥

配置jenkin的jdk, Maven, Docker,gitlab插件, Maven插件, SSH插件,设置完保存便可

下载安装ssh是为了等下远程登陆docker宿主机,关闭旧容器,启动新容器作的。安装gitlab插件是为了等下有个触发器。若是你用的是github请安装github的插件。安装maven是为了那些不使用docker部署的人,来自动化构建项目。安装插件选项在Manage Jenkins里。 在jenkins中新建一个item

(5)配置gitlab Webhook,配置Jenkin匿名登录.

在Gitlab上建立一个项目,在mytest的配置项中配置远程仓库地址,以及用户名和密码。

配置Jenkins的匿名登录。
点击系统管理->全局安全配置->勾选 匿名用户具备可读权限

点击系统管理->系统设置->点掉图中圈出的。

到此对于Webhook Jenkin所须要配置的就完成了。

在Gitlab上配置你的Webhook。
取消对本地url的限制(由于个人jenkins和gitlab搭建在同一个机器上)

在Gitlab仓库中进行Webhook的设置。url为你的jenkin地址/project/你的jenkins项目名。

(6)配置Jenkins的构建脚本。

第一个脚本主要干这几件事情

  • ssh登陆docker宿主机
  • 中止并删除旧的Springboot容器
  • 删除旧Springboot Image

首先给Jenkins配置ssh凭证

在SSH 插件配置,hostname填docker宿主机的地址(就是你springboot 容器跑的苏主机地址)。

配置完成后,给你的mytest项目进行构建的配置。

第一个脚本模板为

#!/bin/bash 
result=$(docker ps | grep "{指定你的旧springboot容器名字,或者id}") 
if [[ "$result" != "" ]] 
then 
echo "stop old container" 
docker stop {指定你的旧容器} 
fi
result1=$(docker ps ‐a | grep "{指定你的旧springboot容器名字,或者id}") 
if [[ "$result1" != "" ]] 
then 
echo "rm old container" 
docker rm {容器名} 
fi
result2=$(docker images | grep "{旧Image名}")
if [[ "$result2" != "" ]] 
then 
echo "rm old image" 
docker rmi {旧Image名}
fi
复制代码

还有两个脚本,咱们待会再说。相信看到这里了,大概了解了Jenkins是个啥东西了,其实就是一个可视化的调度工具,帮我门管理一些构建过程。
好接下来咱们建立一个idea中springboot项目,添加代码。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloCtl {

    @GetMapping("/hello")
    private String hello(){
        return "来自jenkins的问候";
    }
}
复制代码

配置pom,添加docker打包插件(Google开源Java容器管理工具 Jib,更多详细配置参考github官网 github.com/GoogleConta…

<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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>1.7.0</version>
                <configuration>
                    <!--配置基本镜像-->
                    <from>
                        <image>openjdk:8-jdk-alpine</image>
                    </from>
                    <!--配置最终推送的地址,仓库名,镜像名-->
                    <to>
                        <!--这里我配置的是私服,如何配置公服地址请参考个人《如何使用docker打包Springboot的四种方式》文章 -->
                        <image>192.168.208.102:5000/test1</image>
                        <tags>
                            <tag>idea</tag>
                        </tags>
                    </to>
                    <!--这里是必需要配置的,由于私服是http不是https,默认jib不给你推送到非https的私服-->
                    <allowInsecureRegistries>true</allowInsecureRegistries>
                </configuration>
            </plugin>
        </plugins>
    </build>
复制代码

将Maven项目推送到Docker宿主机,在docker宿主机内尝试构建。在Pom目录下,输入构建命令

mvn compile jib:build
复制代码

能够看到,构建Image成功,并推送到私服。

好的,如今咱们的代码没问题了,接下来,咱们编写后两个任务脚本。 继续打开mytest的Jenkins任务配置表。

其中最后一个脚本任务为

  • 从私服拉取新Image
  • 运行新Image
#idt 是指定拉取地址
docker run --name {本身取名字,与第一个脚本要能够对应起来} -p 8081:8081 -idt 192.168.101.64:5000/{这里填你本身的Imaga:Tag}
docker log -f test1
复制代码

配置完后咱们保存,到这里,咱们push咱们以前写好的代码上私服,即刻看到Jenkins自动帮咱们执行3个脚本,实现了全自动化部署。

最后总结

ssh方式过于简单我就不说了。 idea可视化构建Docker,也是比较简单的,只须要你去配置,并且都是可视化的。 docker+jenkins+gitlab,jenkins其实就是个可视化构建脚本的管理工具,你们只须要按照我给出的步骤去配置就能够了。 有啥问题,留言就完事了。 若是这篇文章对你有所帮助,给小小的点赞能够吗?