实现一个简易的自动部署web控制台

发布于 2021-07-04  69 次阅读


概述

只做一个简易的自动部署的控制台,核心流程就是
1、指明代码仓库及分支
2、编写部署脚本
3、web控制台以按钮的形式触发这个脚本

手动部署一个springboot的项目步骤

一、需要一个可部署的web项目

1.1、包含远程仓库地址

1、获取到git的远程仓库地址 git_url
2、需要运行的源代码
目录结构如下
项目目录结构

1.2、包含一个Dockerfile文件

Dockerfile文件可以说是一个配置文件,用来告诉docker服务器该怎么构建一个docker镜像。所以需要指明该镜像的构建流程,一般来说需要考虑以下几个问题
1、指明镜像的运行环境,一般来说都需要,如果不需要可选scratch不以任何镜像为基础。

# 如果运行的是java程序,一般会依赖java镜像
# 这里选择依赖java8的镜像,是在此镜像的基础上进行再定制
FROM java:8

2、怎么将需要运行的程序或文件放入镜像(目前主流部署方式是jar包,其他方式请参照google),可以借助COPY、ADD命令

# 将上下文中 catguild-1.0-SNAPSHOT.jar 文件拷贝到镜像的 /catguild.jar里面
COPY catguild-1.0-SNAPSHOT.jar /catguild.jar

那么此时镜像的样子如下
容器镜像内容
ps:如何将宿主机中的文件上传到docker服务器上,参照镜像构建命令
3、如何运行这个jar包

# CMD基本等同是在执行shell命令,注意这个命令在根目录 / 下执行的,所以需要注意上一步jar放置的位置路径
CMD java -jar catguild.jar

一般到这就可以了,这已经是一个最基本的Dockefile配置了
4、怎么将程序的运行的端口与宿主机的端口关联起来,可以在运行容器的时候指定端口映射

# 声明容器运行时提供服务的端口,仅仅只是声明(jar包启动的端口)
EXPOSE 20000

5、容器中产生的运行数据怎么持久化,容器启动的时候指定挂载位置,但这里可以定义匿名卷防止未指定的情况

# 指定匿名卷的挂载位置,这是指定的是容器内的位置,至于宿主机映射的目录,如果没指定则会自动创建
VOLUME /data

怎么找到自动挂载的匿名卷位置?找到指定的容器id

docker inspect container_id

匿名挂载卷目录
那么这个Dockerfile最后写成这样

FROM java:8
COPY catguild-1.0-SNAPSHOT.jar /catguild.jar
VOLUME /data
EXPOSE 20000
CMD java -jar catguild.jar

2、shell命令部署

2.1 确认需要部署的代码

1、获取代码仓库

git clone git_url

2、切换分支,比如dev

git checkout -b dev origin/dev

3、更新代码

git pull

2.2 获取可运行的jar包

本示例是gradle项目,在项目根目录下执行./gradle时会提示没有权限执行,所有需要先更变项目跟目录的权限。注意如果是第一次build怎么不能clean,否则会报错。

sudo chmod +x gradlew
./gradlew [-p] [项目根路径] clean build

运行效果如下
构建jar包

2.3 构建容器

docker build -f Dockerfile文件路径 -t 镜像名称 上下文目录(这个目录下的文件会上传到docker服务器上去)

docker build -f /root/test/src/main/docker/Dockerfile -t catguild:1.0 /root/test/build/libs

2.4 启动容器

docker run -it --name catguild -v /root/data:/data -p 20000:20000 --restart=always -d catguild:1.0

2.5 完整的命令

#./bin/bash
sudo chmod +x /root/.automatic_deployment/catguild/catguild/gradlew
/root/.automatic_deployment/catguild/catguild/gradlew -p /root/.automatic_deployment/catguild/catguild clean build
docker build -f /root/.automatic_deployment/catguild/catguild/src/main/docker/Dockerfile -t catguild:1.0 /root/.automatic_deployment/catguild/catguild/build/libs
docker run -it --name catguild -v /root/my-project/data:/data -p 20000:20000 --restart=always -d catguild:1.0

创建一个web控制台来触发这个流程

一、实现的业务流程

1、web端输入部署脚本并将该脚本保存至服务器
2、web端点击部署
3、web服务器执行git命令:clone、checkout、pull等选择并更新需要部署的分支
4、web服务器执行部署脚本:build执行的Dockerfile文件,并启动该容器
5、web服务器执行命令检查容器是否启动成功,curl测试服务是否部署成功
6、最终响应至web控制台部署结果

二、技术栈

语言:python
web框架:Flask
第三方库:GitPython(运行git命令)

三、主要代码实现

四、部署web控制台

五、运行效果

参考
使用 Dockerfile 定制镜像