Jenkins集成Django
前言
将Django集成到Jenkins,Djaong和Jenkins都部署在Docker中
一、Jenkins配置
1、创建项目
- 新建Item
- 选择Freestyle project(自由风格)
2、配置
- 源码管理
操作:我使用的码云,直接填上码云地址,再新建Credentials选中即可。 - 构建触发器
我勾选的Poll SCM,填的*/1 * * * *。这样每分钟就去检测,如果代码有提交就会构建
3、构建环境
无
4、构建
- 新增步骤,选择一类
操作:我选择的是:Send files or execute commands over SSH - SSH Server
操作:需要提前创建好,这里选中就行
详细:Manage Jenkins => System Configuration => Publish over SSH(需要先安装这个插件) - Exec command
docker exec -i 550633944f8f bash /home/start.sh
exit 0
备注1:参数是-i不是-it,使用-t会报错
备注2:/home/start.sh是容器中的文件(我是将目录挂载到了服务器)
二、Shell脚本
1、Start.sh脚本
#!/bin/bash
cd /home
#uwsgi --stop uwsgi.pid #停止服务,实际运行的时候,会一次失败,一次成功,具体原因还没搞明白
ps -ef | grep uwsgi.ini | grep -v grep | awk '{print $2}' | head -n 1 | xargs kill -9 #杀掉进程
uwsgi --ini uwsgi.ini #重启服务
exit #一定要加上,不然服务启动不了
2、更新文件
- ssh命令
\cp -rf /home/jenkins/workspace/TeamPlayAdmin/PageInfo/* /root/Django/TeamPlayAdmin/PageInfo
docker exec -i 550633944f8f bash /home/start.sh
exit 0
第一句就是就用将Jenkins获取到的文件覆盖容器中的文件,来达到更新的效果。我Jenkins和Django项目都挂载了本地目录。/home/jenkins是jenkins挂载的本地目录;/root/Django/TeamPlayAdmin是Django项目挂载的本地目录。
- 备注
如果需要复制复制多个文件或者整个项目复制,直接批量修改第一句命令即可
3、待完善
- 备份之前文件在进行复制
- 关闭uwsgi进程命令可以优化。参考链接
三、总结
1、我做了一件什么事?
- 在Docker中,将Django集成到了Jenkins中
2、这件事有什么用?
- 在开发过程中,我代码提交后,能直接部署(当前我是测试环境),省略了发布这一个过程。加快了开发效率。
3、出现了哪些问题?是否解决?是否明确了问题出现的根本原因?
- 不熟悉Jenkins,不熟悉Jenkins继承Django。对Jenkins集成心中没有数。经过这次操作,有了初步的了解。
- 之前使用docker exec -ti ContainerId进入到容器中。在Jenkins中执行命令时,不然使用-t参数,不然会报错。-t参数具体的意义还没详细去看。
- 在使用【uwsgi --stop uwsgi.pid】命令停止服务时,每隔一次构建会出现一次失败,具体原因未知。解决方法是将停止服务命令改为【ps -ef | grep uwsgi | grep uwsgi.ini | awk ‘{print $2}’ | head -n 1 | xargs kill -9】
4、学到了哪些知识点?
- Jenkins集成服务的思路。比如Jenkins集成Django,流程是 ①Jenkins获取新代码 ②将新代码覆盖旧代码(Jenkins和Django目录都在同一个服务器上) ③进入到Django容器中,重启服务
- 类推Jenkins集成.NetCore服务的思路。①Jenkins获取最新代码 ②覆盖.NetCore项目代码 ③进入到.NetCore容器中编译项目 ④更新编译后文件 ⑤重启容器
- 总结Jenkins集成其他服务:Jenkins负责获取最新代码,其他服务容器负责编译(.NetCore项目),重启(Django)等。于特定相关的操作,放到相应的容器中进行操作。不在Jenkins容器中操作,Jenkins负责发送命令。
- cp命令前加\,即\cp,意思是不用linux默认引用的。
- 杀掉ps命令显示的第一个pid:ps -ef | grep uwsgi | grep uwsgi.ini | awk ‘{print $2}’ | head -n 1 | xargs kill -9
- docker命令执行shell脚本:docker exec -i 550633944f8f bash /home/start.sh。最后的start.sh是个shell脚本,指向docker容器中的目录