9.1 TDD及部署的危险区域
- 静态文件(css、JavaScript、图片等)
web服务器往往需要特殊配置才能伺服静态文件
- 数据库
可能会遇到权限和路径问题,在多次部署之间不能丢失数据
- 依赖
要保证服务器上安装了网站依赖的包且版本正确
解决方案:
- 使用与生产环境一样的基础架构部署过渡网站(staging site),这么做可以测试部署过程,确保部署真正的网站时操作正确。
- 可以在过渡网站中运行功能测试,确保服务器中安装了正确的代码和依赖包,而且为了测试网站的布局,我们编写了冒烟测试,以获知是否正确加载了CSS。
- 与在本地设备上一样,当服务器上运行多个Python应用时,可以使用虚拟环境管理包和依赖。
- 最后,一切操作都自动化完成。使用自动化脚本部署新版本,使用同一个脚本把网站部署到过渡环境和生产环境,这么做能尽量保证过渡网站和线上网站一样。
9.2 一如既往,先写测试
functional_tests/tests.py
import os
MAX_WAIT = 10
class NewVisitorTest(StaticLiveServerTestCase):
def setUp(self): # 测试执行前
self.browser = webdriver.Firefox()
staging_server = os.environ.get('STAGING_SERVER')
if staging_server:
self.live_server_url = 'http://' + staging_server
运行功能测试:python manage.py test functional_tests
没有问题,再运行:STAGING_SERVER=127.0.0.1 python manage.py test functional_tests #域名或IP地址
Ran 3 tests in 16.612s
FAILED (failures=1, errors=2)
提交一下:git commit -am 'Hack FT runner to be able to test staging'
9.3 注册域名
9.4 手动配置托管网站的服务器
9.4.1 选择在哪里托管网站
9.4.2 搭建服务器
9.4.3 用户账户、SSH和权限
9.4.4 安装Nginx
参照:centos下安装Nginx_Marvin_Wind的博客-CSDN博客
9.4.5 安装Python3.6
参照:centos 安装 pyhon3_Marvin_Wind的博客-CSDN博客
安装git :
查看版本验证安装:git --version
yum安装:yum install git -y
卸载:yum remove git
9.4.6 解析过渡环境和线上环境所用的域名
9.4.7 使用功能测试确认域名可用而且Nginx正在运行
测试结果:AssertionError: 'To-Do' not found in 'Welcome to nginx!'
9.5 手动部署代码
之后按照以下结构存放代码
/home/user/sites
├── www.live.my-website.com
│ ├── database
│ ├── source
│ ├── static
│ └── virtualenv
└── www.staging.my-website.com
├── database
├── source
├── static
└── virtualenv
9.5.1 调整数据库位置
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, '../database/db.sqlite3'),
}
}
mkdir ../database
python manage.py migrate --noinput
提交git commit -am 'move sqlite database outside od main source tree'
Git push origin master #推到github仓库
服务器:
/home/user/sites
export SITENAME=superlists-staging.com #声明临时变量
mkdir -p ./$SITENAME/database
mkdir -p ./$SITENAME/static
mkdir -p ./$SITENAME/virtualenv
克隆远程仓库:
git clone https://github.com/username/TDD_django.git ./$SITENAME/source
git clone git://github.com/username/TDD_django.git ./$SITENAME/source
服务器:python manage.py runserver
9.5.2 手动创建虚拟环境,使用requirements.txt
echo 'django==1.11' > requirements.txt
git add requirements.txt
git commit -m 'Add requirements.txt for virtualenv'
git push
服务器:git pull
创建虚拟环境:cd /home/sites/superlists-staging.com/source
python3 -m venv ../virtualenv
激活虚拟环境:source ../virtualenv/bin/activate。但无需这么做。直接调用bin目录下可执行文件:pip、python等。
../virtualenv/bin/pip install -r requirements.txt #虚拟环境安装依赖包
../virtualenv/bin/python manage.py runserver #虚拟环境运行
网页出现:
DisallowedHost at /
Invalid HTTP_HOST header
settings.py ->
ALLOWED_HOSTS = ['*']
Nginx配置目录: /usr/local/nginx/conf/
创建staging-site.conf,写入:
server {
listen 80;server_name “域名”;
location / {
proxy_pass http://localhost:8000;
}
nginx.conf最后一个}前:
include /usr/local/nginx/conf/sites/*.conf;
所有网站conf放在/usr/local/nginx/conf/sites
重启:/usr/local/nginx/sbin/nginx –s reload
进行功能测试:STAGING_SERVER=域名 python manage.py test functional_tests
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="id_list_table"]
9.5.4 使用迁移创建数据库
../virtualenv/bin/python manage.py migrate --noinput #禁止输入确定
重启服务器
Ran 3 tests in 24.146s
OK
9.6 部署成功