Continuous Deploy With Dockerhub

2019-09-21

准备工作

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

整体流程

具体步骤

code

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

1
2
3
4
5
6
7
/**
* hello 接口
*/
@GetMapping("/hello")
public String hello(){
return "hello";
}
1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
4
5
6
7
8
/**
* hook在server上运行,当Dockerhub中hello image有变动,
* 将触发该接口,该接口将会执行auto_deploy脚本
*/
@GetMapping("/hook")
public void hook(){
Runtime.getRuntime().exec("/root/code/auto_deploy.sh");
}
1
2
3
4
5
6
7
8
#! /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解决方案