本文介绍基于 Drone 自动化部署 Java 应用的流程,应该不止一种方式,我写的这种是目前我在用的可行方案。

之前在做 Java 程序部署的时候,上网上找了各种文章,但是实际在我这边没有非常合适的能成功的方案。最后尝试了许多次,找到一条能通的路,在这里分享一下

Drone 基础

不过多介绍,可以参考其他文章:Blog All Process

实现思路

基于 Drone 在处理 Java 应用的时候,有一个非常困难的事情:启动部署都是基于 Docker 的,容器都是一次性的,就导致我们之前在固定机器上写的脚本,没办法正常使用。因为重新启动 Java 服务之前,需要先停掉(因为映射到宿主机的端口就一个)。但是怎么停掉呢?

如果使用的是 k8s,应该还好一点,可以用到 k8s 命令去完成一部分功能(k8s 我还没尝试,有点儿大)

但是针对普通的一个 Java 应用怎么做呢?


首先,编译这一步没有什么困难的,就不多说了,最终的目标就是能在宿主机的指定目录中生成一个要启动的 Jar 文件,比如放在了这里:/root/dockers/light-task/jars/JavaApp.jar

剩余要做的就是使用新的 Jar 文件启动服务,当然,启动之前要把之前运行的给干掉(无论是干掉容器还是干掉容器中运行的 Java 进行)

而这里面最难的就是把之前运行中的停了,我想到的一个停掉运行中的 Java 服务的方式就是在本机使用 docker-compose

那么发布的简单过程就是:

docker-compose down
docker-compose up -d

但这个很明显需要在宿主机执行,怎么才能够在宿主机执行脚本命令呢?

方式一

使用 Drone 提供的 EXEC 方式

也就是在 .drone.yml 中,将 type 改为: exec

官方文档:https://docs.drone.io/pipeline/exec/overview/

这样的话直观的意思就是会在宿主机上直接执行,我去试了,各种问题

贴上一个没看太明白的反馈地址:https://community.harness.io/t/exec-runner-404-error-on-ping/11070

不是很确定是不是 Drone 的 bug,困惑了我很久最后还是放弃了

这种方式大概意思就是,我们需要在主机上安装一个 exec-runner,让这个 runner 能连到 done-server,但是一直没能成功

大家感兴趣的可以去试试

方式二

既然不能直接在宿主机上执行脚本,那么换一种,Drone 还提供了一种 SSH 的方式,与上面的 EXEC 类似,把 type 改为:ssh 就行了,官方上面提示说可以在这里通过 ssh 在远程机器上执行命令脚本

官方文档:https://docs.drone.io/pipeline/ssh/overview/

我也去试了,参考上面吧,跟上面一样,耽误了很久,还是没有成功

大家感兴趣可以去试试

方式三

既然不能直接用,那就曲线救国吧,如果大家看了我那个Blog All Process,应该能看到里面有涉及到在 Drone 的 Docker 类型中使用过 ssh 登录远程机器执行脚本的经历

同样把这个拿过来这样用,这种是可以的,虽然曲折了点,但是能达到目的。整理一下操作流程:

image-20230504165756275

最终方案

以上方案确定了之后,其实就简单多了,不详细介绍了

这种方案有很明显的好处:不用考虑停止运行中的 Java 程序,直接基于 docker-compose 的重启即可

所以脚本就可以写的很简单了

只贴一下 .drone.yml 代码,对应的 docker-compose.yml 按自己的来就行

kind: pipeline
type: docker
name: light-task-build
steps:
  - name: build&publish
    image: maven:3.8.1-jdk-8-slim
    volumes:
      - name: jars
        path: /jars
      - name: mvn_repo
        path: /root/.m2
    commands:
      - mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true -B -V
      - rm -f /jars/*.jar
      - cp target/light_task-0.0.1-SNAPSHOT.jar /jars/
volumes:
  - name: jars
    host:
      path: /root/dockers/light-task/jars
  - name: mvn_repo
    host:
      path: /root/.m2
---

kind: pipeline
type: docker
name: light-task-publish

steps:
  - name: exec
    image: appleboy/drone-ssh
    settings:
      host:
        - xxx.xxx.xxx.xxx
      username: root
      password:
        from_secret: EXEC_PASSWD
      port: 22
      command_timeout: 10m
      script: echo "hello world" && cd /root/dockers/light-task && echo "down before" && docker-compose down && echo "up before" && docker-compose up -d && echo "up after"
depends_on:
  - light-task-build

亲测可行,截图留证

image-20230504170257008

Bye ~