转载

高效部署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 "来自idea deployment的问候";
    }
}
复制代码

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

高效部署Springboot的三种方式。
高效部署Springboot的三种方式。

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

高效部署Springboot的三种方式。
高效部署Springboot的三种方式。

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

高效部署Springboot的三种方式。
java -jar ***.jar
复制代码

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

  • 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的docker

高效部署Springboot的三种方式。

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

docker pull openjdk:8
复制代码

在target目录下添加Dockerfile文件。

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包记得修改下。

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

高效部署Springboot的三种方式。
高效部署Springboot的三种方式。
高效部署Springboot的三种方式。

配置好运行环境后,点击运行即可

高效部署Springboot的三种方式。

使用浏览器访问 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完成,开发人员只需要通过简单配置,实现高度定制的的自动化部署。

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

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

gitlab有点大,需要耐心等下。

docker 加速(可选)

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。

创建挂载文件夹和启动容器

#创建挂载文件夹
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容器启动需要时间
复制代码
高效部署Springboot的三种方式。
#上面说到要你去输入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 
复制代码
高效部署Springboot的三种方式。

添加cat到的公钥

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

高效部署Springboot的三种方式。
高效部署Springboot的三种方式。
高效部署Springboot的三种方式。
高效部署Springboot的三种方式。
高效部署Springboot的三种方式。
高效部署Springboot的三种方式。

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

高效部署Springboot的三种方式。

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

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

高效部署Springboot的三种方式。
高效部署Springboot的三种方式。

配置Jenkins的匿名登陆。

点击系统管理->全局安全配置->勾选 匿名用户具有可读权限

高效部署Springboot的三种方式。

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

高效部署Springboot的三种方式。

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

在Gitlab上配置你的Webhook。

取消对本地url的限制(因为我的jenkins和gitlab搭建在同一个机器上)

高效部署Springboot的三种方式。

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

高效部署Springboot的三种方式。

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

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

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

首先给Jenkins配置ssh凭证

高效部署Springboot的三种方式。

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

高效部署Springboot的三种方式。

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

高效部署Springboot的三种方式。

第一个脚本模板为

#!/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成功,并推送到私服。

高效部署Springboot的三种方式。
高效部署Springboot的三种方式。

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

高效部署Springboot的三种方式。

其中最后一个脚本任务为

  • 从私服拉取新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其实就是个可视化构建脚本的管理工具,大家只需要按照我给出的步骤去配置就可以了。

有啥问题,留言就完事了。

如果这篇文章对你有所帮助,给小小的点赞可以吗?

原文  https://juejin.im/post/5dba68c8e51d453eaf467e60
正文到此结束
Loading...