基于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