Sunkz

基于Github+Docker的自动化部署

准备工作

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

整体流程

具体步骤

1. code /hello 代码

创建 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"]

2. 在 Github 创建仓库

创建hello repository

3.1 在 Dockerhub 创建 image 并绑定 Github 仓库

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

3.2 在 Dockerhub 为 image 创建 webhook

dockerhub hello repository添加 webhook (指向 server中的 hook 钩子)

4.1 在 server 编写 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 image 并启动

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

4.2 在 server 上启动该 hook 服务

5. 触发流水线

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

curl 请求测试

扩展

  • Github Actions将支持CI/CD到自定的Server
  • 配合Nginx使用可实现 ‘零停机’ 更新
  • 第三方云厂商提供了大量模板式Serverless的DevOps解决方案
  • 省略 dockerhub 直接基于 springboot jar包 ⬇️
#! /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