准备工作
- Github
- Dockerhub
- Server (没有服务器的话,本机使用内网穿透也可以)
整体流程

具体步骤
code
创建springboot工程提供一个接口, 并编写 dockerfile
1 2 3 4 5 6 7
|
@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
|
@GetMapping("/hook") public void hook(){ Runtime.getRuntime().exec("/root/code/auto_deploy.sh"); }
|
1 2 3 4 5 6 7 8
| #! /bin/bash
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解决方案
1 2 3 4 5 6 7 8 9 10
| #! /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
|