jenkins+docker+ansible自动化部署

jenkins+docker+ansible实现自动化部署

jenkins工作流程示意图

环境准备

资源 路径
jenkins服务器 10.100.2.12
python项目所在服务器 10.200.1.37

两台服务器上均装有docker和ansible

流程

第一步

为项目添加Dockerfile文件,DockerFile放在项目的根路径,DockerFile文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 基于什么镜像进行构建
FROM lucascosta/serverless-python3.6
# 设置容器环境变量时区为东八区
ENV TZ="Asia/Shanghai"
# Add a yinghuo user to run our application so that it doesn't need to run as root
RUN adduser --disabled-password yinghuo
# 安装python项目所需依赖
RUN pip3 install flask
# 将项目添加到容器中
ADD ./* /home/yinghuo/ai_voice_engine/
# 设置权限
RUN chmod -R 777 /home/yinghuo/ai_voice_engine/
# 等同于cd /home/yinghuo的意思
WORKDIR /home/yinghuo
USER yinghuo
# 启动项目
ENTRYPOINT ["python3", "ai_voice_engine/hello.py"]
# 容器暴露对外的端口号,需要在docker run时添加容器跟服务器的映射关系
EXPOSE 5000

添加完DockerFile后项目结构如下:

第二步

创建jenkins新任务,使用自由风格构建模式,源码管理使用git。

构建选择使用shell构建

shell脚本

1
2
3
4
5
6
7
8
9
# 删除原有的打包文件
rm -rf ai_voice_engine.tar
# 将当前工作目录进行打包成一个文件
tar -cvf ai_voice_engine.tar ./
# 将打包的文件发送至python项目服务器
ansible -i devops/provision/inventories/development/hosts all -m copy -a "src=$WORKSPACE/ai_voice_engine.tar dest=/root/project/ mode=0777"
# 执行python项目服务器上的脚本
ansible -i devops/provision/inventories/development/hosts all -m shell -a "/service/ai_voice_engine/deploy.sh"

注意: 打包是为了加快文件的传输速度,如果不打包,且ansibel没有使用免密传输的话,ansible的copy命令传输每一个文件时都会去进行一遍用户名密码的校验,速度会很慢。

第三步

在python项目服务器中添加执行脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 将原有的文件删除
rm -rf /service/ai_voice_engine/ai_voice_engine/*
# 将jenkins服务器传输过来的文件移动到指定目录下
mv -f /root/project/ai_voice_engine.tar /service/ai_voice_engine/ai_voice_engine/
# 解压文件到指定目录下,必须指定绝对路径,如果不指定,会默认解药到deploy.sh脚本所在目录
tar xvf /service/ai_voice_engine/ai_voice_engine/ai_voice_engine.tar -C /service/ai_voice_engine/ai_voice_engine/
REG_URL=10.200.1.37
NODE_URL=10.200.1.37
JOB_NAME=ai_voice_engine
WORKSPACE=/service/ai_voice_engine/
TAG=$REG_URL/$JOB_NAME/`date +%Y%m%d-%H-%M`
# 构建docker镜像
docker build -t $TAG $WORKSPACE/ai_voice_engine/.
# 登录docker 私服仓库
docker login -u admin -p Harbor12345 10.200.1.37
# 推送docker镜像到私服仓库
docker push $TAG
# 移除原有在运行的docker容器
if docker ps -a | grep -i $JOB_NAME ; then
docker rm -f $JOB_NAME
fi
# 启动docker容器
docker run -d --name $JOB_NAME --restart always -p 8888:5000 $TAG

第四步

完成以上三步后可在jenkins中点击构建,构建完成后在python服务器查看日志,看项目是否启动成功。

1
2
docker ps #查看容器id
docker logs 容器id #查看容器中的日志