一、背景介绍

在互联网应用快速更新迭代的大背景下,传统的人工手动或简单脚本已经不能适应此变化,此时Devops为我们提供了良好的解决方案,应用好CI/CD可以大大的方便我们的日常工作,自动化快速的持续集成/持续交付为我们带来了应用开放的更快速度、更好的稳定性和更强的可靠性。

二、拓扑环境

2.1 架构拓扑

如上图实例,简单花了下流程拓扑:

  • 当研发push本地代码到gitlab-server后,webhook自动触发jenkins构建应用
  • 在docker host上部署应用git clone来自gitlabserver源码,并启动应用
  • 前端可以放置lb来做高可用
  • 数据库连接云数据库
  • 可将日志存储在log后期投递到elk实现日志可视化
  • 构建完成邮件通知相关人员(测试或开放)

2.2 系统软件版本

名称 版本
Linux系统 CentOS7.3 64位
Docker 1.13
Django 2.0

三、安装部署

3.1 Jenkins安装部署

Jenkins安装部署可参考:jenkins笔记

  • 安装完成后添加Docker目标服务器

  • 配置邮件发送服务器

3.2 Docker安装部署

Docker安装部署及Dockerfile编写可参考:容器Docker详解

3.3 Gitlab安装部署

GitLab安装在公网Linux服务器运行一些命令即可,如果没有公网需要手动修改 /etc/gitlab/gitlab.rb文件的external_url 'http://自己的内网IP'

yum install -y libsemanage-static libsemanage-devel policycoreutils openss
h-server openssh-clients postfix
systemctl enable postfix && systemctl start postfixwget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-8.0.
0-ce.0.el7.x86_64.rpm
rpm -i gitlab-ce-8.0.0-ce.0.el7.x86_64.rpm
# 获取公网IP
PUBLICIP=$(curl http://ipv4.icanhazip.com)
# 修改
sed -i "s/gitlab-server/${PUBLICIP}/g" /etc/gitlab/gitlab.rbgitlab-ctl reconfigure
gitlab-ctl restartecho "Username:root"
echo "Password:5iveL!fe"

3.4 配置发布流程

  • Jenkins新建构建一个自由风格的软件项目

  • 利用参数化构建方便后续部署Docker传入映射的源端口和release

  • 源代码来自gitlab的django项目

  • 利用webhook关联gitlab和jenkins

jenkins安装插件:

生成随机token值

将jenkins生成的GitLab webhook URL配置到gitlab

  • 当开发者在本地push代码后自动触发jenkins构建项目,有Dockerfile内写的git pull代码,再次不用将代码由jenkins分发到docker宿主机,jenkins作为触发docker构建使用

  • 配置构建完成后的邮件

邮件模版,邮件类型选择:
内容类型选择:HTML
邮件主题填写:构建通知:${BUILD_STATUS} - ${PROJECT_NAME} - Build # ${BUILD_NUMBER} !
构建通知模版:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head><body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"offset="0"><table width="95%" cellpadding="0" cellspacing="0"style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif"><tr><td>(本邮件是程序自动下发的,请勿回复!)</td></tr><tr><td><h2><font color="#0000FF">构建结果 - ${BUILD_STATUS}</font></h2></td></tr><tr><td><br /><b><font color="#0B610B">构建信息</font></b><hr size="2" width="100%" align="center" /></td></tr><tr><td><ul><li>项目名称 : ${PROJECT_NAME}</li><li>构建编号 : 第${BUILD_NUMBER}次构建</li><li>SVN 版本: ${SVN_REVISION}</li><li>触发原因: ${CAUSE}</li><li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li><li>构建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li><li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li><li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li></ul></td></tr><tr><td><b><font color="#0B610B">Changes Since LastSuccessful Build:</font></b><hr size="2" width="100%" align="center" /></td></tr><tr><td><ul><li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li></ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat="    %p"}</td></tr><tr><td><b>Failed Test Results</b><hr size="2" width="100%" align="center" /></td></tr><tr><td><prestyle="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre><br /></td></tr><tr><td><b><font color="#0B610B">构建日志 (最后 100行):</font></b><hr size="2" width="100%" align="center" /></td></tr><!-- <tr><td>Test Logs (if test has ran): <ahref="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a><br /><br /></td></tr> --><tr><td><textarea cols="80" rows="30" readonly="readonly"style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea></td></tr></table>
</body>
</html>

触发类型可根据自身需要填写,这里填写always无论成功还是失败都发送邮件

  • 查看远程Docker服务器内的文件

  • django部署已经利用conda打包好了项目的Python3.6的环境包自制了Docker镜像

之前利用的是纯净的Python3.6系统,在每次构建的时候利用pip安装requirements.txt的模块,但是长此以往由于环境变化很少,每次需要pip安装耗时,所以利用conda将打包好的Python环境自制成定制化环境,以此来减少环境部署时间,也可以通过docker镜像制作是-v参数将本地磁盘挂载在环境内,每次构建本地的conda即可,完成快速环境部署。

查看Dockerfile

FROM 87a69025db6a
MAINTAINER kaliarch# 定义docker中工作目录
ENV WORK_DIR /work/
# 创建docker内工作目录
RUN mkdir $WORK_DIR
# 定义映射端口EXPOSE 80WORKDIR $WORK_DIR
RUN git clone http://123.xxxx.xxxxx.245/Devops/go2cloud.git# 添加启动服务脚本
ADD *.sh ${WORK_DIR}CMD `which bash` /work/start_all.sh && tail -f /work/logs/server-$(date +%F).log

查看Django启动脚本

#!/bin/bashBASEPATH=$(cd `dirname $0`;pwd)PY_CMD=/python3/bin/python# 服务入口文件
#MAIN_APP=${BASEPATH}/go2cloud/manage.py
# 迁移脚本入口文件
SCRIPTS_APP=${BASEPATH}/go2cloud/scripts/migrate_task_schdule.py
# 删除脚本入口文件
DELETE_APP=${BASEPATH}/go2cloud/scripts/delete_transfer_server.py# 日志目录LOG_DIR=${BASEPATH}/logs/
[ ! -d ${LOG_DIR} ] && mkdir ${LOG_DIR}# 启动服务
#nohup ${PY_CMD} -u ${MAIN_APP} runserver 0.0.0.0:80 >> ${LOG_DIR}server-$(date +%F).log 2>&1 &
# 启动脚本迁移调度脚本
echo "---------$0 $(date) excute----------" >> ${LOG_DIR}task-script-$(date +%F).log
nohup ${PY_CMD} -u ${SCRIPTS_APP} >> ${LOG_DIR}script-$(date +%F).log 2>&1 &# 启动迁移删除脚本
echo "---------$0 $(date) excute----------" >> ${LOG_DIR}delete-script-$(date +%F).log
nohup ${PY_CMD} -u ${DELETE_APP} >> ${LOG_DIR}delete-script-$(date +%F).log 2>&1 &

查看jenkins部署脚本

#!/bin/bashrelease=$1
port=$2BASEPATH=$(cd `dirname $0`;pwd)# 构建go2cloud-platform 镜像
cd /dockerwork
docker build -t go2cloud-platform-mini:$release .IMGNAME=$(docker images|awk -v release=$release '{if($1=="go2cloud-platform-mini" && $2==release) print $3}')echo $IMGNAME
# 启动容器
docker run -d -p ${port}:80 -v /testlog/:/work/logs ${IMGNAME}

利用-v参数将日志持续化存储到docker 宿主机之上

四、测试展示

4.1 测试构建

手动构建测试

4.2 查看log



4.3 查看docker容器

4.4 测试app

五、反思改进

  • 目前数据库连接的为云服务器搭建的数据库,后期数据库也利用docker,多组采用docker-compose统一部署管理
  • 后期可以利用利用公有云k8s集群进行方便测试
  • 目前docker容器产生的日志在docker宿主机上,后期可以将其存储在cos上,再投递到elk集群日志可视化处理
  • 将镜像统一管理制作本地镜像仓库
  • gitlab添加code review并结合自动测试

转载于:https://blog.51cto.com/kaliarch/2337551

Docker+Jenkins+Gitlab+Django应用部署实践相关推荐

  1. SpringCloud+Docker+Jenkins+GitLab+Maven实现自动化构建与部署实战

    作者:寅务 www.jianshu.com/p/bdb0642b7495 1.前言与初衷 本文章会涉及Docker常见命令基础知识点结合不同场景实操一起使用. 本文章会涉及结合工作过程中部署不同环境服 ...

  2. jenkins+gitlab实现自动化部署平台

    文章目录 jenkins+gitlab实现自动化部署平台 git gitlab gitlab介绍 安装 jenkins jenkins介绍 CI/CD介绍 Jenkins安装 gitlab+jenki ...

  3. Jenkins+Gitlab+Ansible自动化部署(四)

    Jenkins+Gitlab+Ansible自动化部署(2021-08-11) 一.Jenkins Linux Shell 集成 登录Jenkins web管理页,点击新建任务 添加描述信息 添加构建 ...

  4. Jenkins+Gitlab实现自动部署

    Jenkins自动部署配置其实就是前后端部署步骤,前后端分离项目如何部署可以借鉴另一篇文章:Docker部署前后端分离项目 一.新建任务 二.源码管理 三.构建触发器 注意:需要下载Gitlab插件 ...

  5. 基于Jenkins+Gitlab的自动化部署实战

    故事背景 一个中小型企业,是典型的互联网公司,当初期的时候可能运维只能标配到2~3人,此时随着公司的发展,项目会逐渐增多.前期部署项目可能都是手动的, 俗称"人肉部署",这简直是无 ...

  6. jenkins+gitlab自动化编译部署方案探索及服务端编译webpack实战

    一. 背景 之前我们的开发流程为在本地进行webpack打包编译,然后svn提交源代码和编译后的代码.同时每次提交前也会从svn更新源代码和编译后的代码.这样做有几个缺点: 1. svn 更新和提交编 ...

  7. Jenkins + Gitlab+ Docker + SpringBoot 构建流水线

    1 环境 192.168.38.80 docker jenkins gitlab 2 Spring Boot 2.1 HelloController @RestController public cl ...

  8. git自动部署代码到服务器windows,Jenkins-在windows上配置自动化部署(Jenkins+Gitlab+IIS)...

    Jenkins-在windows上配置自动化部署(Jenkins+Gitlab+IIS) web部署样例 windows服务部署样例 系统备份 在服务器上创建后缀名为.ps1的文件,例:BackUpD ...

  9. 使用jenkins流水线完成自动部署服务到K8s

    说明 通过本文章,您可以轻松入门cicd过程.本地测试环境为springboot微服务项目.用户提交代码到gitlab,触发jenkins拉取gitllab上的代码,然后完成编译构建成jar包,同步完 ...

最新文章

  1. 红帽linux登陆错误,xmanager连接RedHat出错:/usr/X11R6/bin/xterm: No such file or directory
  2. 14招保你ERP选型成功
  3. python基础语法-对文件的操作
  4. mysql 创建账号权限_mysql创建用户,并指定用户的权限(grant命令)
  5. 申请评分卡(A卡)的开发过程(1)
  6. 给初学者的RxJava2.0教程(三)
  7. set 集合容器实现元素的插入与中序排序
  8. JavaScript闭包
  9. 分配甲、乙、丙、丁四人去完成五项任务,每人完成各项任务的时间如下表所示
  10. 序列试题---最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离 .
  11. 【BJOI 2019】排兵布阵
  12. Warning: Failed prop type: Invalid prop `enablesReturnKeyAutomatically` of type `string` supplie
  13. 华为KubeEdge在边缘计算的实践
  14. 足乐商城~~~~~~青龙脚本
  15. php仿制网站,网站仿制合法吗,仿制别人网站注意事项
  16. camera360android版有全景功能吗,用软件拍摄360全景照片 安卓机也可以
  17. 公司位置怎么上地图,区域网格分布图怎么做
  18. python除数为0报错_浅谈pandas dataframe对除数是零的处理
  19. Linux基本功十二:shell脚本流程控制
  20. PHP 为项目设置谷歌身份验证器

热门文章

  1. This XML file does not appear to have any style information associated with it. The document tree is
  2. 类中定义自身类的对象
  3. Centos7安装Python3.7
  4. linux opencv cmake,OpenCV基础篇之使用CMake管理工程
  5. 概率论-2.6 随机变量函数的分布
  6. JVM 调优参数详解
  7. Spring架构设计-增强MultiActionController
  8. WordCount 实例
  9. linux-git服务搭建
  10. Jmeter+ant运行脚本,得到HTML报告