Sunkz

基于Github+Docker的自动化部署

准备工作

  • Github
  • Dockerhub
  • Server (没有服务器的话,本机使用内网穿透也可以)

整体流程

具体步骤

code

创建springboot工程提供一个接口, 并编写 dockerfile

/**
 * hello 接口
 */
 @GetMapping("/hello")
 public String hello(){
     return "hello";
 }
FROM openjdk:11

WORKDIR /workspace/app

COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
COPY src src

RUN ./mvnw package -DskipTests

ENTRYPOINT ["java","-jar","target/hello-0.0.1-SNAPSHOT.jar"]

Github

创建hello repository

Dockerhub

创建hello repository并关联上Github的hello repository

hook

编写hook服务,当 dockerhub hello image 更新时,会触发该hook

/**
 * hook在server上运行,当Dockerhub中hello image有变动,
 * 将触发该接口,该接口将会执行auto_deploy脚本
 */
@GetMapping("/hook")
public void hook(){
    Runtime.getRuntime().exec("/root/code/auto_deploy.sh");
}
#! /bin/bash

# 销毁旧的容器,从dockerhub拉取最新hello images并启动

docker stop hello
docker rm hello
docker pull sunkezheng/hello
docker run --name hello -p8080:8080 -d sunkezheng/hello

在server上启动该hook服务

webhook

dockerhub hello repository添加webhook指向 server中的hook服务

触发流水线

至此整条流水线已经建立

将hello springboot工程提交到Github hello repository, 触发整条流水线.

curl 请求测试

扩展

  • Github Actions将支持CI/CD到自定的Server
  • 使用Jenkins可以简化Hook部分
  • 配合Nginx使用可实现 ‘零停机’ 更新
  • 第三方云厂商提供了大量模板式Serverless的DevOps解决方案
#! /bin/bash

# 基于Jar包的hook

lsof -i:8080 | grep java | awk '{print $2}' | xargs kill -9
rm -rf http/
git clone git@github.com:sunkz/http.git
cd http
mvn clean package -DskipTests
java -jar ./target/http-0.0.1-SNAPSHOT.jar