14项目发布

0 阅读13分钟

项目发布

基础知识

项目交付

基础知识

项目交付是一个涉及到多团队共同协作的事情,它包括 产品团队设计产品、研发团队开发产品、测试团队测试代码、运维团队发布代码和维护站点等工作

image.png

项目交付的过程中,每个团队都有自己特有的一些特殊工作

image.png

一般情况下,项目交付在软件工程人员眼中的基本逻辑

image.png

代码发布

所谓的代码发布,其实就是一句话:将我们的代码放到一台公司的互联网服务器上。那么我们应该怎么来理解这句话呢?我们从三个方面来理解他

发布什么?
	代码		经过测试,功能完善,没有问题的代码
发布到哪里?
	服务器		所有人都能访问的到的一台服务器(有公网IP)
				idc机房、阿里云、亚马逊、腾讯云、华为云、....
发布的效果?
	web网页	对外展示
常见的代码发布方式有两种:手工方式和脚本方式。
样式1:手工发布代码
	慢、干扰因素多、不安全
样式2:脚本发布代码
	快、干扰因素少、安全

发布解读

基本流程

这里面的代码发布过程是侧重于手工级别的代码发布流程,在其他的一些基础设施环境中,虽然有一些区别,但是整个流程脉络是一样的

image.png

功能解读:
	获取代码 - 为什么? - 代码在远端服务器上
	打包代码 - 为什么? - 代码量太多,不好传输
	传输代码 - 为什么? - 本地主机没有代码
	关闭应用 - 为什么? - 防止用户访问出错
	解压代码 - 为什么? - 拉过来的是压缩包
	更新代码 - 为什么? - 要发布项目
	开启应用 - 为什么? - 刚才关闭了
	检查效果 - 为什么? - 万一失败了呢?
	对外开放 - 为什么? - 发布过程,没有让网上用户看到

流程详解

获取代码

一般情况下,软件项目的网站代码都存放在一个稳定的代码服务器上,这个网站服务器叫代码仓库

image.png

仓库分类
	公有仓库 - 使用互联网的代码服务器
	私有仓库 - 内部服务器或者公网服务器
	
实现方式
	集中式:svn的几乎所有操作命令,受本地主机和代码仓库的网络连接状态限制
	分布式:git的几乎所有操作命令,不受代码仓库的网络连接状态限制

打包代码

所谓的打包代码,其实就是将获取的项目源代码进行打包操作

image.png

目的:
	减少传输文件数量
	减小传输文件大小
	增强传输速率
		
常见打包方式:
	windows:	zip、rar...
	linux:	   tar、zip...

传输代码

在一个临时的服务器环境上,进行项目代码的部署测试,如果没有问题的话,可以将该代码传输到生产服务器上
常见的传输方式如下:
有网情况下
	多种方式: git、ftp、scp、共享挂载 cp、rsync
没有网情况下
	物理方式: U盘或者硬盘

image.png

关闭应用

发布代码的时候,肯定会对生产服务器上运行的项目产生影响,为了避免对互联网用户产生不必要的干扰,我们会将应用关闭

问题1:关闭什么应用
	代码所在的服务用到了什么应用,就关闭什么应用
问题2:应用相互依赖的情况下,如何确定关闭的顺序
	站在用户访问的角度,先关闭离客户近的,后关闭离客户远的。

解压代码

这一步不是必须的,有些场景下,需要代码压缩包解压,有些不用

更新代码

为了避免我们在放置代码过程中,对老文件造成影响,所以我们放置代码一般分为两步:备份老文件和放置新文件

备份老文件:防止更新失败,导致旧有的成功运行的代码被覆盖
放置新文件:将新代码放置到旧代码的位置

注意:
	两个文件的名称是一样的,只是内容不同
	对整个应用项目来说,两个文件没有区别

image.png

开启应用

在代码放置完毕后,将刚才关闭的应用,开启就可以了

开启的顺序:
	先开启离客户远的,后开启离客户近的

image.png

检查效果

为了防止发布后的效果不成功,我们手工方式或者其他方式检测网站的功能是否可以正常的访问

对外开放

项目内部人员检查这次发布没有问题后,开放应用的流量入口,让用户使用新版本的服务

技术要点

解压缩

简介

文件的压缩
	压缩格式:tar zcvf 压缩后的文件名  将要压缩的文件
文件的解压
	解压格式:tar xf 压缩后的文件名
查看压缩文件内容
	查看格式:zcat 压缩文件
命令参数详解
    z	指定压缩文件的格式为 tar.gz(表示通过gzip指令处理备份文件)
    c	创建新的备份文件(表示压缩)
    v	显示指令执行过程
    f	指定备份文件
    x	解压
    C   切换到指定的目录(指定解压位置)

解压缩实践

# 压缩实践
mkdir tar_dir
echo nihao > tar_dir/nihao.txt

tar -zcvf nihao.tar.gz tar_dir/
tar_dir/
tar_dir/nihao.txt

# 查看压缩文件
zcat nihao.tar.gz
tar_dir/0000755000000000000000000000000014543214566011212 5ustar  rootroottar_dir/nihao.txt0000644000000000000000000000000614543214566013045 0ustar  rootrootnihao

# 解压文件
tar xf nihao.tar.gz -C /tmp/

cat /tmp/tar_dir/nihao.txt
nihao

传输

简介

scp传输工具:
	命令格式:scp  要传输的文件 要放置的位置
	
远程目标样式:
	远端主机文件放置位置的表示形式:
		远程连接的用户@远程主机:远程主机的目录路径
	远端主机文件位置的表示形式:
		远程连接的用户@远程主机:远程主机的文件路径
传输示例:
	将本地文件推送到远程主机
		scp file.tar.gz root@192.168.91.102:/root/
	将远程主机的文件拉取到本地
		scp root@192.168.91.102:/root/file.tar.gz ./

传输文件实践

# 本地文件传输远程,这里配置了免密不需要再输入密码了
scp nihao.tar.gz root@192.168.91.102:/tmp/
nihao.tar.gz                                           100%  157   148.9KB/s   00:00

# 远程文件拉到本地
rm -f nihao.tar.gz
scp root@192.168.91.102:/tmp/nihao.tar.gz ./
nihao.tar.gz                                           100%  157   169.4KB/s   00:00

zcat nihao.tar.gz
tar_dir/0000755000000000000000000000000014543214566011212 5ustar  rootroottar_dir/nihao.txt0000644000000000000000000000000614543214566013045 0ustar  rootrootnihao

备份

简介

文件的备份要有一定的标志符号,我们就使用目前通用的时间戳的形式来表示,关于时间戳,我们可以借助于 date命令来进行获取

date命令详解:
    命令格式:date [option]
    常见参数:
        %F		显示当前日期格式,%Y-%m-%d
        %T		显示当前时间格式,%H:%M:%S
备份命令效果格式:
    方式一:复制备份-源文件不动
    	cp nihao nihao-$(date +%Y%m%d%H%M%S)
    方式二:移动备份-源文件没了
   		mv nihao nihao-$(date +%Y%m%d%H%M%S)

备份实践

# 复制备份
cp nihao.tar.gz nihao.tar.gz-$(date +%Y%m%d%H%M%S)
# 移动备份
mv nihao.tar.gz nihao.tar.gz-$(date +%Y%m%d%H%M%S)

ls nihao.tar.gz-*
nihao.tar.gz-20231228150436  nihao.tar.gz-20231228150439

手工发布

方案解读

基础知识

案例需求

实现一套业务环境的项目发布流程,基本的网站架构效果如下:

image.png

架构解读:
	负载均衡采用Nginx服务,基于请求内容进行后端跳转
	动态应用使用的nginx 或者 uwsgi服务
	后端服务应用有多套编程语言研发的web项目。
		有基于java语言的sprintCloud框架开发的
		有基于python语言的django框架开发的
	我们要发布的是django后端服务代码

方案分析

项目部署分析

分析:
		2、python环境		--->  3、python虚拟环境
		1、django环境部署
			4、django软件安装
			5、项目基本操作
			6、应用基本操作
			7、view和url配置
				8、问题:只有本机能访问
					9、方案代理---- 10、nginx
		11、nginx实现代理
			12、nginx软件安装
			13、nginx基本操作
			14、nginx代理的配置
				15、目录结构
				16、查看配置文件
				17、找到对应的代理配置项
		18、启动django
		29、启动nginx
		20、整个项目调试

环境部署方案

环境部署方案
一、django环境部署
	1.1 python虚拟环境
	1.2 django环境部署
		1.2.1 django软件安装
		1.2.2 项目基本操作
		1.2.3 应用基本操作
		1.2.4 view和url配置
二、nginx代理django
	2.1 nginx软件安装
		2.1.1 nginx软件安装
		2.1.2 nginx基本操作
	2.2 nginx代理配置
		2.2.1 目录结构查看
		2.2.2 配置文件查看
		2.2.3 编辑代理配置项
三、项目调试
	3.1 启动软件
		3.1.1 启动django
		3.1.2 启动nginx
		3.2 整个项目调试
1、施工方案的分析原理:基于需求关键点-查依赖-查流程
2、施工方案编写的流程:基于需求分析的流程,按结点输出方案

环境部署

基础环境

python软件部署

# python软件部署
yum install python3 -y

python3 --version
Python 3.6.8

# pip环境配置
mkdir ~/.pip
cat > ~/.pip/pip.conf << EOF
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF

python3 -m pip install --upgrade pip

python虚拟环境

# 安装虚拟环境软件
yum install python-virtualenv -y
# 准备虚拟环境目录
mkdir /data/virtual -p
cd /data/virtual
# 创建虚拟环境
virtualenv -p /usr/bin/python3.6 venv
source venv/bin/activate

python --version
Python 3.6.8

其他相关命令

# 退出虚拟环境
deactivate
# 删除虚拟环境
rm -rf venv/

代码环境

准备sqlite环境

# 查看默认版本
/usr/bin/sqlite3 -version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668

# 更新sqlite版本为3.9+版本
yum -y install gcc g++ make
wget https://www.sqlite.org/2022/sqlite-autoconf-3390000.tar.gz
tar xf sqlite-autoconf-3390000.tar.gz
cd sqlite-autoconf-3390000
./configure
make && make install

sqlite3 --version
3.39.0 2022-06-25 14:57:57 14e166f40dbfa6e055543f8301525f2ca2e96a02a57269818b9e69e162e98918

echo 'export LD_LIBRARY_PATH="/usr/local/lib"' >> ~/.bashrc
source ~/.bashrc

# 虚拟环境,系统环境变量设置
source /data/virtual/venv/bin/activate
echo 'export LD_LIBRARY_PATH="/usr/local/lib"' >> ~/.bashrc
source ~/.bashrc

django环境

# 进入python虚拟环境部署django环境
source /data/virtual/venv/bin/activate
pip install Django==3.2.0

# 查看软件安装效果
pip list
Package           Version
----------------- ------------
asgiref           3.4.1
Django            3.2
pip               21.3.1
pytz              2023.3.post1
setuptools        28.8.0
sqlparse          0.4.4
typing_extensions 4.1.1
wheel             0.29.0

# 创建项目
mkdir /data/server -p
cd /data/server/
django-admin startproject web_site

tree web_site/
web_site/
├── manage.py
└── web_site
    ├── asgi.py
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 6 files

# 创建应用
cd web_site/
python manage.py startapp app1

tree
.
├── app1
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── web_site
    ├── asgi.py
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   └── settings.cpython-36.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

4 directories, 15 files

# 注册应用
sed -i "/staticfiles/a\    'app1'," web_site/settings.py

# 定制访问页面的逻辑
cat > app1/views.py << EOF
from django.shortcuts import render
from django.http import HttpResponse

def hello(resquest):
   return HttpResponse("web_site V1.0\n")
EOF

# 定制访问页面的路由
sed -i '/t path/a\from app1.views import *' web_site/urls.py
sed -i "/admin.site/a\    path('hello/', hello)," web_site/urls.py

# 启动djang应用
python  manage.py runserver >> /dev/null 2>&1 &
[1] 4054

# 检查效果
curl localhost:8000/hello/
web_site V1.0

web环境

ngix环境

# 退出虚拟环境
deactivate

# 安装nginx
yum -y install epel-release
yum -y install nginx
systemctl start nginx

# 创建配置文件
cat > /etc/nginx/default.d/django.conf << EOF
  location /hello/ {
    proxy_pass http://localhost:8000;
  }
EOF

# 测试配置文件
/usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

# 重载nginx服务
systemctl reload nginx

# 测试访问效果
echo 'hello nginx' > /usr/share/nginx/html/index.html

curl localhost
hello nginx

# nginx反向代理django,可能会遇到 failed (13: Permission denied) while connecting
# 可以通过配置SeLinux解决这个问题

# 第一种方式关闭SeLinux
# 临时关闭,立即生效
setenforce 0
# 永久关闭,重启生效
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 第二种方式修改SeLinux配置,开启httpd网络链接
# 临时配置,立即生效
setsebool httpd_can_network_connect=1
# 永久配置,重启生效
setsebool -P httpd_can_network_connect 1

curl localhost/hello/
web_site V1.0

# 定制访问域名
echo '192.168.91.101 django.demo.com' >> /etc/hosts

curl django.demo.com
hello nginx

curl django.demo.com/hello/
web_site V1.0

手工发布

基础知识

为了合理的演示生产环境的项目代码发布,同时又兼顾实际实验环境的资源,我们这里将 B主机和C主机 用一台VM主机来实现,A主机单独实现。这两台主机的ip地址相关内容如下:
A主机:192.168.91.101   B主机: 192.168.91.102

image.png

	为了体现整个实践操作的标准化,在这里进行所有目录的统一规划:
		代码存储目录: /data/codes/django
		打包文件目录: /data/codes
		脚本相关目录: /data/scripts
		备份文件目录: /data/backup/django
		项目代码目录: /data/server/web_site

简单实践

# 192.168.91.102

# 代码准备
mkdir /data/codes -p
cd /data/codes/
mkdir django
scp root@192.168.91.101:/data/server/web_site/app1/views.py django/

# 代码获取
# 我们借助于sed的方式模拟代码获取修改后的代码
sed -i 's#1.0#2.0#' django/views.py
grep web_site django/views.py
   return HttpResponse("web_site V2.0\n")

# 打包代码
# 打包文件
tar zcf django.tar.gz django/
# 确认文件信息
zcat  django.tar.gz
django/0000755000000000000000000000000014543421340011016 5ustar  rootrootdjango/views.py0000644000000000000000000000021114543421340012517 0ustar  rootrootfrom django.shortcuts import render
from django.http import HttpResponse

def hello(resquest):
   return HttpResponse("web_site V2.0\n")
# 192.168.91.101

# 传输代码
# 在指定的目录下获取远程代码目录
mkdir /data/codes -p
cd /data/codes/
scp root@192.168.91.102:/data/codes/django.tar.gz ./

# 关闭应用
# 前端准备数据迁移配置
mkdir /etc/nginx/conf.d
cat > /etc/nginx/conf.d/update.conf << EOF
server {
  listen 6666;
  location / {
    index index.html;
    root /usr/share/nginx/update/;
  }
}
EOF
# 准备数据迁移文件
mkdir /usr/share/nginx/update -p
echo '数据迁移中,请耐心等待,抱歉!!!' >> /usr/share/nginx/update/index.html
# 使用数据迁移配置
cat > /etc/nginx/default.d/django.conf << EOF
location /hello/ {
  # proxy_pass http://localhost:8000;
  proxy_pass http://localhost:6666/;
}
EOF
# 测试配置文件
/usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 重启nginx服务
systemctl restart nginx
# 查看nginx监听的端口
netstat -tnulp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5637/nginx: master
tcp        0      0 0.0.0.0:6666            0.0.0.0:*               LISTEN      5637/nginx: master
tcp6       0      0 :::80                   :::*                    LISTEN      5637/nginx: master
# 检查效果
curl localhost/hello/
数据迁移中,请耐心等待,抱歉!!!
# 关闭后端的django服务
kill $(lsof -Pti :8000)
netstat -tnulp | grep 8000

# 解压代码
cd /data/codes
tar xf django.tar.gz

# 备份文件
# 备份老文件
mkdir /data/backup/django -p
mv /data/server/web_site/app1/views.py /data/backup/django/views.py-$(date +%Y%m%d%H%M%S)
# 放置新文件
mv /data/codes/django/views.py /data/server/web_site/app1/
grep web_site /data/server/web_site/app1/views.py
   return HttpResponse("web_site V2.0\n")

# 开启应用
# 开启后端django服务
source /data/virtual/venv/bin/activate
cd /data/server/web_site/
python manage.py runserver >> /dev/null 2>&1 &
deactivate
# 检查效果
netstat -tnulp | grep 8000
tcp        0      0 127.0.0.1:8000          0.0.0.0:*               LISTEN      5700/python
# 修改前端nginx服务入口
cat > /etc/nginx/default.d/django.conf << EOF
location /hello/ {
  proxy_pass http://localhost:8000;
  # proxy_pass http://localhost:6666/;
}
EOF
# 重载nginx服务
systemctl reload nginx

# 内部检查
# 检查效果
curl django.demo.com/hello/
web_site V2.0

# 对外开放
# 接收外部用户流量即可