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