基于 jenkins 的持续集成、持续部署方案
文章目录
- 工具介绍
- 项目代码仓库
- CentOS7 环境准备及构建测试
- 创建 jenkins 项目,配置构建
- jenkins执行自动构建流程
- 持续开发,提交入库
工具介绍
- python3.12 + fastapi 0.92.0 + uvicorn 开发部署web项目;
- git + gitee 实现代码版本管理;
- jenkins + docker 实现持续集成、持续部署;
- centos7 作为jenkins服务器 & 部署服务器;有条件的可以再启动一台服务器作为部署测试的服务器;
项目代码仓库
仓库地址
这里已准备部分web项目代码;后续可以持续开发、持续集成、持续部署;
编写Dockfile脚本:
# 指定基础镜像
FROM python
# 拷贝项目数据 到容器中.../home/
RUN mkdir /home/web_app
COPY src/* /home/web_app
COPY tests/* /home/web_app
COPY requirements.txt /home/web_app
COPY setup.py /home/web_app
# *****装python依赖*****
# 切换工作目录
WORKDIR /home/web_app
RUN python3 -m pip install -r requirements.txt
# 端口映射 同 -p 8083:8083
EXPOSE 8083
# 目录映射 同 -v /home/web_app:/home/web_app
VOLUME /home/web_app
# 执行前台命令,防止端口被占用
CMD ["python3", "app.py"]
CentOS7 环境准备及构建测试
iso镜像安装
问题解决及软件安装
# 安装git
sudo yum install -y git
# 配置ssh公钥
ssh-keygen -t rsa # 回车
# 在~/.ssh/id_rsa.pub 复制公钥,并配置在gitee个人仓库
# 拉取代码仓库开发分支
git clone -b develop git@gitee.com:laufing/web_app.git
# 进入仓库目录
cd web_app
# 执行构建,生成docker image
docker build -t "web_app_image" .
# -t 执行构建镜像的名称
# . 在当前目录下找Dockerfile 脚本
# 构建完成后查看
docker images
# 启动容器
docker run -d -p 8083:8083 -v /root/web_app:/home/web_app --name=web_app web_app_image
# 查看容器是否启动
[root@centos web_app]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d975824bfca6 web_app_image "python3 app.py" 4 minutes ago Up 4 minutes 0.0.0.0:8083->8083/tcp, :::8083->8083/tcp web_app
局域网内通过http地址访问:
linux下的8083端口被占用时,容器会启动失败!!!
# 查看端口
lsof -i:8083 # 或者netstat -ano | grep -iE "8083"
# 杀掉
kill -s SIGTERM pid1 pid2 ...
创建 jenkins 项目,配置构建
- centos中启动jenkins
# 使用java 虚拟机启动
java -jar jenkins.war --httpPort=8081 --httpListenAddress=0.0.0.0
-
windows下浏览器中访问http://ip:8081
-
创建项目:New Item
-
配置项目
-
添加项目描述;
-
添加仓库地址、分支;
-
选择触发的方式 poll SCM;
-
添加构建的step,注意docker服务必须开启,且可以正常拉取镜像;基于Dockerfile构建镜像,然后基于镜像启动容器;若容器名称已存在,则删除后再启动容器,避免因重名而启动失败;
-
-
手动构建
-
构建结果成功;
也可以测试下提交代码后,触发自动构建!
jenkins执行自动构建流程
- 工作目录 .jenkins/workspace/项目item ;
- 拉取仓库(根目录)下的内容,放入项目item中,如图:
- 执行构建脚本,构建镜像、启动容器;
- 执行构建后的动作,如发送邮件等;
持续开发,提交入库
在当前项目代码中加入一个接口,并提交入库,触发自动构建,并浏览器中测试新接口。
请求方法: get
请求路由:/user/info
请求响应:{“code”: 200, “msg”: {“name”: “jack”, “age”: 23}}
@app.get("/user/info")
def user_info():
return {"code": 200, "msg": {"name": "jack", "age": 23}}
构建完成后, 浏览器测试:
后续持续开发即可,持续的集成、持续的构建、持续的测试交给jenkins来做;