{ "info": { "author": "SohuTech", "author_email": "thefivefire@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: BSD License", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "# \u4ecb\u7ecd\uff1a \n\n------------------------------------\n\nessay\u662f\u6211\u4eec\u56e2\u961f\u5728\u8fc7\u53bb\u4e24\u5e74Python\u9879\u76ee\u6301\u7eed\u90e8\u7f72\u4e0a\u7ecf\u9a8c\u7684\u603b\u7ed3\uff0c\u6838\u5fc3\u529f\u80fd\u662f\u6253\u5305\u548c\u591aServer\u90e8\u7f72\u3002\u8fd9\u4e2a\u5de5\u5177\u7684\u4e3b\u8981\u529f\u80fd\u662f\u7b80\u5316\u4ece\u5f00\u53d1\u5230\u90e8\u7f72\u7684\u6d41\u7a0b\uff0c\u65b9\u4fbf\u670d\u52a1\u5668\u7684\u6269\u5c55\u3002\u9664\u4e86\u6253\u5305\u548c\u90e8\u7f72\u529f\u80fd\u4e4b\u5916\uff0cessay\u8fd8\u63d0\u4f9b\u4e86\u5176\u4ed6\u7684\u5de5\u5177\uff0c\u5728\u540e\u9762\u7684\u63a5\u53e3\u63cf\u8ff0\u4e2d\u6709\u8be6\u7ec6\u4ecb\u7ecd\u3002\n\nessay\u662f\u57fa\u4e8eFabric\u5f00\u53d1\uff0c\u5728\u4f7f\u7528\u4e0a\u4f9d\u8d56\u4e8epypi Server\u548cgithub/Gitlab\u3002\n\n\n\n# \u5feb\u901f\u5f00\u59cb\n\n------------------------------------\n\n*\u8fd9\u91cc\u4f7f\u7528\u81ea\u5df1\u642d\u5efa\u7684pypiserver\u4f5c\u4e3apypi server\uff0cgithub\u4f5c\u4e3a\u4ee3\u7801\u4ed3\u5e93\u3002*\n\n1. \u5b89\u88c5essay\uff1a ``pip install essay``\n2. github\u4e0a\u521b\u5efa\u9879\u76ee\uff1aessay_demo_webpy\n3. **\u521b\u5efa\u9879\u76ee**\u3002\u7ec8\u7aef\u4e0a\u6267\u884c\uff1a ``es create essay_demo_webpy`` \uff0c\u6839\u636e\u63d0\u793a\u8f93\u5165\u4f60\u65b0\u521b\u5efa\u7684git\u4ed3\u5e93\u5730\u5740\uff0c\u56de\u8f66\u5b8c\u6bd5\u4f60\u4f1a\u53d1\u73b0\u4f60\u7684github\u4e0a\u5df2\u7ecf\u6709\u4e86\u521d\u59cb\u5316\u597d\u7684\u4e00\u4e2a\u9879\u76ee\u7ed3\u6784\n\n\n .\n \u2514\u2500\u2500 essay_demo_webpy\n \u251c\u2500\u2500 MANIFEST.in\n \u251c\u2500\u2500 README.md\n \u251c\u2500\u2500 conf\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 supervisord.conf\n \u251c\u2500\u2500 essay_demo\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 log.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 main.py\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 settings.py\n \u251c\u2500\u2500 fabfile\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u2514\u2500\u2500 setup.py\n\n 4 directories, 9 files\n\n4. **\u6253\u5305\u9879\u76ee**\u3002\u6b64\u65f6\u4f60\u53ef\u4ee5\u5728\u672c\u5730\u7684essay_demo_webpy\u76ee\u5f55\u4e0b\u6267\u884c\uff1a ``fab -l`` \u547d\u4ee4\u67e5\u770b\u54ea\u4e9b\u547d\u4ee4\u53ef\u7528\u3002\u7136\u540e\u6267\u884c ``fab build.build`` \u547d\u4ee4\uff0c\u4f1a\u5e2e\u4f60\u6253\u5305\u6210tar\u7684\u6e90\u7801\u5305\uff0c\u5e76\u6dfb\u52a0\u7248\u672c\u540e\u7f00\uff0c\u5982\uff1aessay_demo_webpy-3.11.20.1.tar.gz\uff0c\u4e4b\u540e\u4f1a\u88ab\u4e0a\u4f20\u5230\u4e0a\u9762\u8bf4\u5230\u5f97pypiserver\u4e0a\u3002\n\n \u5173\u4e8ebuild.build\u6709\u56db\u4e2a\u53ef\u9009\u53c2\u6570,fab build.build:name=fixbug,version=0.1,commit=451a9a2784f,branch=master,\u4e5f\u53ef\u4ee5\u4f7f\u7528\u4f4d\u7f6e\u53c2\u6570: ``fab build.build:fixbug,0.1,451a9a2784f,master`` \u3002\u5176\u4e2dcommit\u548cbranch\u4e0d\u80fd\u540c\u65f6\u8bbe\u7f6e,commit\u4f18\u5148\u4e8ebranch\u8d77\u4f5c\u7528\u3002\n\n \u5404\u53c2\u6570\u8be6\u89e3\uff1a\n\n name, \u7248\u672c\u7684\u540e\u7f00\uff0c\u5982\u4e0a\u4f8b\u7684\u7ed3\u679c\u662f: essay_demo_webpy-0.1-fixbug.tar.gz\n varsion, \u7248\u672c\u53f7\uff0c\u5982\u679c\u4e3a\u7a7a\u5219\u4f1a\u4ea7\u751f\uff1aessay_demo_webpy-3.11.20.1-fixbug.tar.gz\u3002\u89c4\u5219\u662f\uff1a\u5e74.\u6708.\u65e5.\u6b21\n commit, \u662f\u8981\u6253\u5305\u7684commit\u8282\u70b9\n branch, \u8981\u6253\u5305\u7684\u5206\u652f\uff0c\u9ed8\u8ba4\u4e3afabfile\u4e0b__init__.py\u4e2d\u7684\u914d\u7f6e\n\n5. **\u90e8\u7f72\u9879\u76ee**\u3002\u8fd9\u65f6\u5728pypiserver\u4e0a\u5df2\u7ecf\u6709\u4e86\u6253\u597d\u7684\u5305\uff0c\u5047\u8bbe\u4e3a: essay_demo_webpy-3.11.20.1.tar.gz \u3002\u7136\u540e\u5f00\u59cb\u5b89\u88c5\uff0c\u6267\u884c\uff1a ``fab -R dev deploy:3.11.20.1,a,test`` \u628a\u9879\u76ee\u5b89\u88c5\u5230fabfile\u91cc\u8bbe\u7f6e\u7684dev\u8fd9\u4e2arole\u7684\u670d\u52a1\u5668\u4e0a\uff0c\u53ef\u4ee5\u662f\u4e00\u4e2a\u6216\u8005\u591a\u4e2aserver\u3002\n \n *deploy\u53c2\u6570\u89e3\u91ca\uff1a*\n \n deploy\u540e\u9762\u6709\u4e09\u4e2a\u53c2\u6570\uff0c\u5206\u522b\u8868\u793a\uff1a\u7248\u672c\u53f7\uff0c\u865a\u62df\u73af\u5883\u76ee\u5f55\u540d\uff0cprofile\uff08\u4f1a\u4f20\u9012\u5230supervisord.conf\u4e2d\uff09\n \u7248\u672c\u53f7\u5728\u4e0a\u9762\u5df2\u7ecf\u63d0\u5230\uff0c\u4e0d\u8d58\u8ff0\u3002\n \u865a\u62df\u73af\u5883\u76ee\u5f55\u540d\uff1a\u4f9d\u8d56\u4e8efabfile\u4e2d\u8bbe\u7f6e\u7684 env.VIRTUALENV_PREFIX='~/essay_demo_webpy' \uff0c\u8fd9\u91cc\u53c2\u6570\u4e3aa\uff0c\u8868\u793a\u5c06\u5728\u670d\u52a1\u5668\u5bb6\u76ee\u5f55\u4e0b\u5f97essay_demo_webpy\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u76ee\u5f55\u4e3a a \u7684virtualenv\u73af\u5883\u3002\n profile\uff1a\u7528\u6765\u63a7\u5236\u7a0b\u5e8f\u5904\u4e8e\u4ec0\u4e48\u72b6\u6001\uff0c\u6bd4\u5982\u53ef\u4ee5\u4f20\u9012debug\u8fdb\u53bb\uff0c\u9700\u8981\u7a0b\u5e8f\u81ea\u5df1\u5904\u7406\u3002\u53c2\u6570\u4f1a\u88ab\u4f20\u9012\u5230supervisord.conf\u4e2d\u3002\n\n> 0.0.7 \u65b0\u589e\uff1a\n> \u53ef\u4ee5\u5728fabfile\u4e2d\u589e\u52a0:\n\n def pre_deploy(version, venv, profile):\n do_something()\n env.DEPLOY_PRE_DEPLOY = pre_deploy\n\n def post_deploy(version, venv, profile):\n do_something()\n env.DEPLOY_POST_DEPLOY = post_deploy\n\n> \u6765\u5904\u7406\u90e8\u7f72\u524d\u540e\u7684\u64cd\u4f5c\uff0c\u4e24\u4e2ahook\u5747\u4f1a\u5728\u865a\u62df\u73af\u5883\u6fc0\u6d3b\u72b6\u6001\u4e0b\u6267\u884c\n\n deploy\u7684\u5185\u90e8\u7684\u8fc7\u7a0b\u662f\uff1a\u767b\u5f55-R\u6307\u5b9a\u7684\u670d\u52a1\u5668\uff0c\u5728\u914d\u7f6e\u7684VIRTUALENV_PREFIX\u76ee\u5f55\u4e0b\u521b\u5efaa\u865a\u62df\u73af\u5883\uff0c\u4e4b\u540e\u5728\u6b64\u73af\u5883\u4e2d\u901a\u8fc7pip\u5b89\u88c5\u5df2\u6253\u5305\u597d\u7684\u9879\u76ee\uff0c\u6700\u540e\u901a\u8fc7supervisord\u6765\u542f\u52a8\u7a0b\u5e8f\u8fdb\u7a0b\u3002\n\n6. **\u5feb\u901f\u90e8\u7f72** \u9488\u5bf9\u9700\u8981\u76f4\u63a5\u90e8\u7f72\u67d0\u4e2a\u5206\u652f\u6216\u8005commit\u7684\u9700\u6c42\uff0c\u8be5\u529f\u80fd\u662f\u57fa\u4e8e\u4e0a\u9762\u7684\u4e24\u4e2a\u529f\u80fd\uff1a ``build`` \u548c ``deploy``\u3002\n\n *\u4f7f\u7528\u65b9\u6cd5:*\n fab -R deploy.quickdeploy:venv_dir,profile,branch\n\n \u53c2\u6570\u89e3\u91ca::\n venv_dir: \u865a\u62df\u73af\u5883\u540d\u79f0\n profile\uff1a \u8fd0\u884c\u73af\u5883\u914d\u7f6e\uff0c\u540c\u4e0a\u9762\n branch\uff1a \u8981\u90e8\u7f72\u7684\u5206\u652f\n\n*\u53ef\u4ee5\u53c2\u8003Demo\uff1ahttps://github.com/SohuTech/essay_demo_webpy \u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e*\n\n\n# \u914d\u7f6e\u6587\u4ef6\u8be6\u89e3\n\n------------------------------------\n\n\u4ecb\u7ecd\u4e3b\u8981\u7684\u4e24\u4e2a\u914d\u7f6e\u6587\u4ef6fabfile\u548csupervisord\n\n### fabfile\u914d\u7f6e\n\n** myproject/fabfile/__init__.py **\n\n\u6240\u6709env\u914d\u7f6e\u9879\uff0c\u53ef\u6839\u636e\u81ea\u8eab\u4e1a\u52a1\u5220\u9664/\u6dfb\u52a0\n\n\n\t\t1. git\u670d\u52a1\u5668\n\n\t\t\tenv.GIT_SERVER = 'https://github.com/' # ssh\u5730\u5740\u53ea\u9700\u8981\u586b\uff1agithub.com\n\n\t\t2. \u9879\u76ee\u540d\uff08\u4e0egit\u4e0a\u9879\u76ee\u540d\u4fdd\u6301\u4e00\u81f4\uff09 \n\t\t\n\t\t\tenv.PROJECT = 'project_name'\n\t\t\n\t\t3. \u9879\u76ee\u5728\u6253\u5305\u670d\u52a1\u5668\u4e0a\u7684\u8def\u5f84\uff0c\u4f1a\u5728\u6b64\u76ee\u5f55\u4e0b\u6267\u884c\u6253\u5305\u64cd\u4f5c\n\t\t\n\t\t\tenv.BUILD_PATH = '/opt/deploy/'\n\t\t\n\t\t4. \u9879\u76ee\u6240\u6709\u8005\uff08\u4e0egit\u4fdd\u6301\u4e00\u81f4\uff09\n\t\t\n\t\t\tenv.PROJECT_OWNER = 'EssayTech'\n\t\t\n\t\t5. git\u9ed8\u8ba4\u5206\u652f\n\t\t\n\t\t\tenv.DEFAULT_BRANCH = 'master'\n\t\t\n\t\t6. pypi-server\u5730\u5740\n\t\t\n\t\t\tenv.PYPI_INDEX = 'http://pypi.python.org/simple/'\n\t\t\t\n\t\t\u90e8\u7f72\u76f8\u5173\uff1a\n\t\t\n\t\t7. \u90e8\u7f72\u542f\u52a8\u8fdb\u7a0b\u6570\u76ee\n\t\t\n\t\t\tenv.PROCESS_COUNT = 2 #\u90e8\u7f72\u65f6\u542f\u52a8\u7684\u8fdb\u7a0b\u6570\u76ee, \u4f1a\u4f20\u9012\u5230supervisord.conf\u4e2d\n\t\t\n\t\t8. \u670d\u52a1\u5668\u89d2\u8272, \u6253\u5305\u6216\u90e8\u7f72\u65f6\u901a\u8fc7 ``-R`` \u53c2\u6570\u6307\u5b9a\u670d\u52a1\u5668\u89d2\u8272, \u6bcf\u4e2a\u89d2\u8272\u53ef\u4ee5\u5b9a\u4e49\u591a\u7ec4\u670d\u52a1\u5668\n\t\t\t\n\t\t\tenv.roledefs = {\n\t\t\t'build': ['username@buildserverip:port'], # \u6253\u5305\u670d\u52a1\u5668\u914d\u7f6e\n\t\t\t'dev': ['eassay@127.0.0.1:2202'],\t#\u90e8\u7f72\u670d\u52a1\u5668\u914d\u7f6e\n\t\t\t}\n\n\t\t9. \u865a\u62df\u73af\u5883\u76ee\u5f55, \u90e8\u7f72\u65f6\u4f1a\u5728\u670d\u52a1\u5668\u4e0a\u6b64\u76ee\u5f55\u4e0b\u521b\u5efa\u865a\u62df\u73af\u5883\n\t\t\t\n\t\t\tenv.VIRTUALENV_PREFIX = '/home/SohuTech/project_name'\n\t\t\n\t\t12. supervisor\u914d\u7f6e\u6587\u4ef6\u5730\u5740, PROJECT_ROOT\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\n\t\t\n\t\t\tenv.SUPERVISOR_CONF_TEMPLATE = os.path.join(PROJECT_ROOT, 'conf', 'supervisord.conf')\n\t\t\t\n\t\t13. \u6839\u636e\u5de5\u7a0b\u786e\u5b9a\u9879\u76ee\u7f16\u53f7, \u4e0d\u540c\u865a\u62df\u73af\u5883\u76d1\u542c\u4e0d\u540c\u7684\u7aef\u53e3\uff0c\u7528\u6765\u914d\u7f6e\u4e00\u4e2a\u540c\u4e00\u673a\u5668\u591a\u4e2a\u865a\u62df\u73af\u5883\u3002\u901a\u8fc7port\u53c2\u6570\u4f20\u5230supervisord.conf\u4e2d\u3002\n\t\t\t\t\n\t\t\tPROJECT_NUM = 88\n\t\t\tenv.VENV_PORT_PREFIX_MAP = {\n\t\t\t'a': '%d0' % PROJECT_NUM,\n\t\t\t'b': '%d1' % PROJECT_NUM,\n\t\t\t'c': '%d2' % PROJECT_NUM,\n\t\t\t'd': '%d3' % PROJECT_NUM,\n\t\t\t'e': '%d4' % PROJECT_NUM,\n\t\t\t'f': '%d5' % PROJECT_NUM,\n\t\t\t'g': '%d6' % PROJECT_NUM,\n\t\t\t'h': '%d7' % PROJECT_NUM,\n\t\t\t'i': '%d8' % PROJECT_NUM,\n\t\t\t}\n\n\n nginx\u914d\u7f6e\u7528\u4e8e\u542f\u52a8\u3001\u505c\u6b62\u3001\u91cd\u542f\u3001\u4fee\u6539\u914d\u7f6e\u6587\u4ef6:\n\n\t\t14. nginx\u6267\u884c\u6587\u4ef6\u5730\u5740\n\t\t\t\n\t\t\tenv.NGINX_BIN = '/usr/local/nginx/bin/nginx'\n\t\t\t\n\t\t15. nginx\u914d\u7f6e\u6587\u4ef6\u5730\u5740\n\t\t\n\t\t\tenv.NGINX_CONF = '/usr/local/nginx/conf/nginx.conf'\n\t\t\t\n\t\t16. \u5207\u6362nginx\u73af\u5883(\u5173\u4e8e\u6b64\u9879\uff0c\u8bf7\u770b\u4e0b\u65b9essay\u9ad8\u7ea7\u529f\u80fd\u7528\u6cd5)\n\n\t\t\tenv.NGINX_SWITCH_CONF = '/etc/nginx/nginx.conf'\n\n### supervisord\u914d\u7f6e\n\n** myproject/conf/supervisor.conf **\n\n**\u51e0\u4e2a\u88ab\u66ff\u6362\u7684\u5b57\u6bb5**\n\n\t\t\u4ee5\u4e0b\u53c2\u6570\u5728fab deploy\u7684\u65f6\u5019\u4f1a\u66ff\u6362\u4e3afabfile\u91cc\u914d\u7f6e\u7684\u5b57\u6bb5\n\t\t\n\t\t1. {{ run_root }} \u865a\u62df\u73af\u5883\u5730\u5740,\u5bf9\u5e94\u4e8efabfile/__init__.py\u91cc\u7684env.VIRTUALENV_PREFIX\n\t\t\n\t\t2. {{ username }}\tessay.task.util\u81ea\u52a8\u751f\u6210\u7528\u6237\u540d\n\t\t\n\t\t3. {{ password }}\tessay.task.util\u81ea\u52a8\u751f\u6210\u5bc6\u7801\n\t\t\n\t\t4. {{ project }}\t\u9879\u76ee\u540d,\u5bf9\u5e94\u4e8efabfile/__init__.py\u91cc\u7684env.PROJECT\n\t\t\n\t\t5. {{ port }} \u53d6env.VENV_PORT_PREFIX_MAP\u5bf9\u5e94\u865a\u62df\u73af\u5883\u7684\u7aef\u53e3\u53f7\n\t\t\n\t\t6. {{ process_count }} \u5bf9\u5e94\u4e8efabfile\u914d\u7f6e\u4e2d\u7684PROCESS_COUNT\n\t\t\n\t\t\n**\u5177\u4f53\u914d\u7f6e**\n\t\t\n\t\t#\u9879\u76ee\u540d\uff08\u88ab\u81ea\u52a8\u66ff\u6362\uff09\n\t\t[program:{{ project }}]\t\t\n\t\t\n\t\t#\u8fd0\u884c\u547d\u4ee4\n\t\tcommand={{ venv_dir}}/bin/{{ project }} --profile={{ profile }} \t\n\t\t\n\t\t#\u8fdb\u7a0b\u540d\uff0c\u793a\u4f8b\uff1atest_2\n\t\tprocess_name=%(program_name)s_%(process_num)d\t\n\t\t\n\t\t#\u8bbe\u7f6e\u8fdb\u7a0bumask\uff0c\u5373\u6743\u9650\u4e3a755\n\t\tumask=022\t\n\t\t\n\t\t#\u542f\u52a8\u540e10\u79d2\u5185\u6ca1\u6709\u5f02\u5e38\u5219\u8ba4\u4e3a\u542f\u52a8\u6210\u529f\n\t\tstartsecs=10\t\t\n\t\t\n\t\t#\u7b49\u5f850\u79d2\u9000\u51fa\n\t\tstopwaitsecs=0\t\n\t\t\n\t\t#\u91cd\u5b9a\u5411\u65e5\u5fd7\u8f93\u51fa\u5730\u5740\n\t\tredirect_stderr=true\t\n\t\t\n\t\t\n\t\t#\u65e5\u5fd7\u8f93\u51fa\u5730\u5740\n\t\tstdout_logfile={{ run_root }}/logs/process_%(process_num)02d.log\n\t\t\n\t\t\t\n\t\t#\u542f\u52a8\u8fdb\u7a0b\u6570\n\t\tnumprocs={{ process_count }}\t\n\t\t\n\t\t#\u5982\u679c\u5f00\u542f\u8fdb\u7a0b\u6570\u5927\u4e8e1\uff0c\u5219\u6307\u5b9a\u4ece\u5e8f\u53f7\u4e3a0\u7684\u8fdb\u7a0b\u5f00\u59cb\n\t\tnumprocs_start=0\t\n\n\n\n# \u53ef\u7528\u547d\u4ee4\u6e05\u5355\u53ca\u8be6\u89e3\n\n------------------------------------\n\n**1. \u521b\u5efa\u672c\u5730\u5de5\u7a0b,\u7136\u540e\u540c\u6b65\u5230git\u670d\u52a1\u5668(\u9700\u8981git\u4ed3\u5e93\u5730\u5740)**\n\n\t\t\u7528\u9ed8\u8ba4\u6a21\u677f\u521b\u5efa\n\t\t\n\t\t1. \u5148\u5728gitlab/github\u4e0a\u521b\u5efa\u5e93\uff1amyprojecti\uff0c\u62ff\u5230git\u5730\u5740\n\t\t\n\t\t2. es create myproject (\u540e\u8fb9\u4e0d\u52a0-t\u53c2\u6570\u4f1a\u4f7f\u7528\u9ed8\u8ba4\u6a21\u677f\u521b\u5efa\u9879\u76ee)\n\t\t\n\t\t3. \u8f93\u5165\u9879\u76eegit\u5730\u5740\n\t\t\n\t\t\u7528django\u6a21\u677f\u521b\u5efa\n\t\t\n\t\tes create myproject -t django\n\n**2. \u521b\u5efa\u672c\u5730\u5de5\u7a0b,\u521b\u5efa\u65f6\u4e0d\u9700\u8981\u8fde\u63a5git\u670d\u52a1\u5668,\u540e\u671f\u9700\u8981\u81ea\u5df1git init**\n\n\t#####\u7528\u6cd5\u4e00\uff1a\n\t\t\n\t\t\u751f\u6210\u5168\u65b0\u9879\u76ee\n\t\t\n\t\t1. es init myproject\n\t\t\n\t\t2. cd myproject\n\t\t\n\t\t3. git init\n\t\t\n\t\t4. git remote add origin [git\u5e93\u5730\u5740]\n\t\t\n\t\t5. \u7136\u540e\u5c31\u53ef\u4ee5commit\u548cpush\u4e86\t\n\n\t#####\u7528\u6cd5\u4e8c\uff1a\n\n\t\t\u5728\u5df2\u5b58\u5728\u9879\u76ee\u4e0b\n\t\t\n\t\t1. cd myproject\n\t\t\n\t\t2. es init\n\t\t\n\t\t\u4f1a\u4e3a\u9879\u76ee\u751f\u6210fabfile, conf, setup.py, MANIFEST.in, README.md\n\n**3. \u6253\u5305**\n\n\t\t1. fab build.build\n\n**4. \u83b7\u53d6\u9879\u76ee\u6700\u65b0\u7248\u672c\u53f7**\n\n\t\t1. cd myproject\n\n\t\t2. fab build.get_latest_version\n\n**5. \u8ba1\u7b97\u9879\u76ee\u4e0b\u4e00\u7248\u672c\u53f7**\n\n\t\t1. cd myproject\n\n\t\t2. fab build.get_next_version\n\n**6. \u90e8\u7f72(\u53c2\u6570: \u9879\u76ee\u7248\u672c\u53f7, \u865a\u62df\u73af\u5883\u540d, profile)**\n\t\n\t\t1. cd myproject\n\t\n\t\t2. fab deploy:3.11.18.2,virtualenv_name,test \n\n**7. \u91cd\u542f\u6307\u5b9a\u865a\u62df\u73af\u5883\u7684supervisor(\u53c2\u6570: \u865a\u62df\u73af\u5883\u540d)**\n\n\t\t1.cd myproject\n\n\t\t2.fab supervisor.reload:virtualenv_name\n\n\n**8. \u91cd\u542f\u865a\u62df\u73af\u5883\u7684\u9879\u76ee\u7684\u7279\u5b9a\u8fdb\u7a0b(\u53c2\u6570: \u8fdb\u7a0b\u540d, \u865a\u62df\u73af\u5883\u540d)**\n\n\t\t1. cd myproject\n\t\t\n\t\t2. fab supervisor.restart_process:process_name,virtualenv_name\n\n**9. \u542f\u52a8\u865a\u62df\u73af\u5883\u7684\u9879\u76ee\u7684\u7279\u5b9a\u8fdb\u7a0b(\u53c2\u6570: \u8fdb\u7a0b\u540d, \u865a\u62df\u73af\u5883\u540d)**\n\n\t\t1. cd myproject\n\n\t\t2. fab supervisor.start_process:process_name,virtualenv_name\n\n**10. \u5173\u95ed\u865a\u62df\u73af\u5883\u7684\u9879\u76ee\u7684\u7279\u5b9a\u8fdb\u7a0b(\u53c2\u6570: \u8fdb\u7a0b\u540d, \u865a\u62df\u73af\u5883\u540d)**\n\n\t\t1. cd myproject\n\n\t\t2. fab supervisor.stop_process:process_name,virtualenv_name\n\n\n**11. \u542f\u52a8nginx(\u53c2\u6570: nginx\u6267\u884c\u547d\u4ee4\u5730\u5740, nginx\u914d\u7f6e\u6587\u4ef6\u5730\u5740)**\n\n\t\t\n\t\t\u6ce8\u610f: nginx_bin, nginx_conf \u53ef\u5728myproject/fabfile/__init__.py\u4e2d\u914d\u7f6e\n\t\t\u4f8b\u5982: env.NGINX_BIN = '/usr/local/nginx/sbin/nginx'\n\t\t\t env.NGINX_CONF = '/usr/local/nginx/conf/nginx.conf'\n\n\t\t1. cd myproject\n\n\t\t2. fab nginx.start\n\t\t\n\t\t\u5982\u679c\u4e0d\u914d\u7f6e__init__.py\n\t\t\n\t\tfab nginx.start:nginx_bin,nginx_conf\n\n**12. \u91cd\u542fnginx(\u53c2\u6570: nginx\u6267\u884c\u547d\u4ee4\u5730\u5740, nginx\u914d\u7f6e\u6587\u4ef6\u5730\u5740)**\n\n\t\t1. cd myproject\n\n\t\t2. fab nginx.reload:nginx_bin,nginx_conf\n\n**13. \u5173\u95ednginx(\u53c2\u6570: nginx\u6267\u884c\u547d\u4ee4\u5730\u5740, nginx\u914d\u7f6e\u6587\u4ef6\u5730\u5740)**\n\n\t\t1. cd myproject\n\n\t\t2. fab nginx.stop:nginx_bin,nginx_conf\n \n\n**14. \u4fee\u6539nginx\u914d\u7f6e\u6587\u4ef6\u5e76\u91cd\u542f(\u53c2\u6570: \u6e90\u6587\u672c, \u76ee\u6807\u6587\u672c, nginx\u6267\u884c\u547d\u4ee4\u4ee4, nginx\u914d\u7f6e\u6587\u4ef6\u5730\u5740)**\n\n\n\t\t1. cd myproject\n\n\t\t2. fab nginx.switch:src_pattern,dst_pattern,nginx_bin,nginx_conf\n\n\n**15. \u83b7\u53d6\u5e2e\u52a9**\n\n\t\tes -h\n\t\t\n**16. \u4ece\u5185\u90e8pypi\u5b89\u88c5\u5305,pypi\u670d\u52a1\u5668\u5730\u5740\u5728project/__init__.py\u4e2d\u53ef\u8bbe\u7f6e**\n\n\t\tes pinstall xxx\n\t\t\n**17. \u4ece\u5b98\u65b9pypi\u5b89\u88c5\u5305(\u652f\u6301pip\u5176\u4ed6\u547d\u4ee4)**\n\n\t\tes install xxx\n\t\t\n\n\n# \u9ad8\u7ea7\u529f\u80fd\u4ecb\u7ecd\n\n------------------------------------\n\n\u4ecb\u7ecdnginx\u670d\u52a1\u5668\u914d\u7f6e\u4ee5\u53caa\uff0cb\u73af\u5883\u5207\u6362\u7684\u5904\u7406\n\n**\u529f\u80fd\uff1a**\n\n 1. \u4fdd\u8bc1\u65b0\u4ee3\u7801\u4e0a\u7ebf\u65f6\uff0c\u91cd\u542f\u67d0\u4e00\u865a\u62df\u73af\u5883\u4e2d\u7684web\u670d\u52a1\uff0c\u4e0d\u4f1a\u5bf9\u7528\u6237\u8bbf\u95ee\u9020\u6210\u4e2d\u65ad\u3002\n 2. \u65b0\u4e0a\u7ebf\u4ee3\u7801\u51fa\u73b0bug\u65f6\uff0c\u53ca\u65f6\u56de\u6eda\u5230\u4e0a\u4e00\u6b21\u7684\u7248\u672c\u3002\n \n**\u573a\u666f\u4ecb\u7ecd**\n \n \u5047\u8bbe\u76ee\u524d\u6709server1\u548cserver2\u4e24\u53f0\u670d\u52a1\u5668\uff0cip\u5206\u522b\u4e3aip1\u3001ip2\u3002\u4e24\u53f0\u670d\u52a1\u5668\u5747\u90e8\u7f72\u4e86\u4e24\u4e2a\u865a\u62df\u73af\u5883a\u548cb\u3002a\u73af\u5883\u8fd0\u884c\u7684\u9879\u76ee\u76d1\u542c\u5728\u7aef\u53e38801\uff0cb\u73af\u5883\u8fd0\u884c\u7684\u9879\u76ee\u76d1\u542c\u5728\u7aef\u53e38811\u3002\n\n\u4e0b\u9762\u662f\u7b80\u5355\u7684nginx\u793a\u4f8b\uff1a\n\n*nginx.conf*\n\n\t\tuser nginx;\n\t\tworker_processes 1;\n\t\t \n\t\t#error_log /var/log/nginx/error.log warn;\n\t\tpid /var/run/nginx.pid;\n\t\t \n\t\tevents {\n worker_connections 1024;\n\t\t}\n\t\t \n\t\thttp {\n include /etc/nginx/mime.types;\n default_type application/octet-stream;\n \n log_format main '$remote_addr - $remote_user [$time_local] \"$request\" '\n '$status $body_bytes_sent \"$http_referer\" '\n '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n \n #access_log /var/log/nginx/access.log main;\n \n sendfile on;\n #tcp_nopush on;\n \n keepalive_timeout 65;\n \n #gzip on;\n \n \n include extra/essay_demo.conf;\n include extra/upstreamA.conf;\n\t\t}\n\t\t\n*extra/essay_demo.conf*\n\t\t\n\t\tserver {\n\t\t\tlisten 80;\n\t\t\tserver_name localhost;\n\t\t\taccess_log /var/log/nginx/essay.access.log main;\n\t\t\tlocation / {\n\t\t\t\tproxy_pass http://essay_demo;\n\t\t\t\tproxy_intercept_errors on;\n\t\t\t\tproxy_redirect off;\n\t\t\t\tproxy_connect_timeout 60;\n\t\t\t\tproxy_set_header Host $host;\n\t\t\t\tproxy_set_header X-Real-IP $remote_addr;\n\t\t\t\tset $cookiesize '0';\n\t\t\t\tif ($http_cookie ~ \"_\"){\n\t\t\t\t\tset $cookiesize 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n*extra/upstreamA.conf*\n\n\t\tupstream essay_demo {\n\t\t\tserver ip1:8801;\n\t\t\tserver ip2:8801;\n\t\t}\n\n*extra/upstreamB.conf*\n\n\t\tupstream essay_demo {\n\t\t\tserver ip1:8811;\n\t\t\tserver ip2:8811;\n\t\t}\n\t\t\n\u76ee\u524dnginx\u4e2d\u914d\u7f6e\u7684\u662fupstreamA.conf\uff0c\u6b64\u65f6\u7528\u6237\u7684\u8bbf\u95ee\u4f1a\u88ab\u53cd\u5411\u4ee3\u7406\u5230ip1\u548cip2\u76848801\u7aef\u53e3\u4e0a\u3002\u73b0\u5728\u53d1\u5e03\u65b0\u7248\u672c\u4e0a\u7ebf\uff0c\u4f7f\u7528\u547d\u4ee4\uff1a ``fab -R dev deploy:<\u7248\u672c\u53f7>,b,test`` ,\u53d1\u5e03\u5230b\u73af\u5883\u3002\n\n\u4e4b\u540e\u901a\u8fc7\u547d\u4ee4\uff1a ``fab -R nginx nginx.switch:upstreamA,upstreamB`` \u628anginx\u4e2d\u7684upstreamA\u66ff\u6362\u4e3aupstreamB\uff0c\u5e76reload nginx\uff0c\u8fd9\u6837\u7528\u6237\u7684\u8bbf\u95ee\u5c31\u4f1a\u88ab\u53cd\u5411\u4ee3\u7406\u5230ip1\u548cip2\u76848811\u7aef\u53e3\u4e0a\uff0c\u4e5f\u5c31\u662f\u521a\u624d\u53d1\u5e03\u5230b\u73af\u5883\u4e2d\u7684\u65b0\u90e8\u7f72\u7684\u9879\u76ee\u3002\n\n**switch\u5b8c\u6574\u547d\u4ee4**\nfab -R nginx nginx.switch:src_pattern,dst_pattern,root,nginx_bin,nginx_conf\n\n*switch\u53c2\u6570\u89e3\u91ca\uff1a*\n\t\n\t\tsrc_pattern: \u539f\u6587\u672c (\u5fc5\u586b)\n\t\t\n\t\tdst_pattern: \u76ee\u6807\u6587\u672c (\u5fc5\u586b)\n\t\t\n\t\troot: \u662f\u5426\u4f7f\u7528root\u7528\u6237, \u662f\uff1aroot \u5426\uff1aNone (\u53ef\u9009\u9879\uff0c\u9ed8\u8ba4\u4e3aNone)\n\t\t\n\t\tnginx_bin: nginx\u6267\u884c\u547d\u4ee4\u8def\u5f84\uff0c\u53ef\u4ee5\u5728fabfile/__init__.py\u4e0b\u8bbe\u5b9a (\u53ef\u9009\u9879)\n\t\t\n\t\tnginx_conf: nginx\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\uff0c\u53ef\u4ee5\u5728fabfile/__init__.py\u4e0b\u8bbe\u5b9a (\u53ef\u9009\u9879)\n\t\t\n\n**\u56fe\u793a**\n\n\n![essay](data/1.png)\n\n### fab -R dev nginx.switch: upstreamA.conf, upstreamB.conf\n\n![essay](data/2.png)\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/SohuTech/essay", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "essay", "package_url": "https://pypi.org/project/essay/", "platform": "", "project_url": "https://pypi.org/project/essay/", "project_urls": { "Homepage": "http://github.com/SohuTech/essay" }, "release_url": "https://pypi.org/project/essay/0.0.8/", "requires_dist": null, "requires_python": "", "summary": "\u6301\u7eed\u90e8\u7f72\u5de5\u5177", "version": "0.0.8" }, "last_serial": 3871004, "releases": { "0.0.2": [ { "comment_text": "", "digests": { "md5": "a70770926ed4e0a054456dd8d3ea8de5", "sha256": "c3f5433080a8a9001607bfeb34e471b6f6c4c66a39451be0b11ace53c035542e" }, "downloads": -1, "filename": "essay-0.0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "a70770926ed4e0a054456dd8d3ea8de5", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 32458, "upload_time": "2017-05-27T02:28:15", "url": "https://files.pythonhosted.org/packages/59/03/8ce2d8115913692b636e419c9e126410083aeae759d36b3756b1d9bffa8a/essay-0.0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "27ba63c88fd2cef3a1950af08febc045", "sha256": "be5531c19109f727fd077758b71222010725a1ec5275a3c0c6d7e8c8f5fdafda" }, "downloads": -1, "filename": "essay-0.0.2.tar.gz", "has_sig": false, "md5_digest": "27ba63c88fd2cef3a1950af08febc045", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15452, "upload_time": "2017-05-27T02:28:18", "url": "https://files.pythonhosted.org/packages/69/48/3842d309e9bd139a2ada46f29259d925f7f91983c9881d98f2688f7b66de/essay-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "042d7f519089df131645297a0bd3ab16", "sha256": "a9ebe12605c882016971646b22fcfea94b2360679d883fe8fef23c365c73a837" }, "downloads": -1, "filename": "essay-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "042d7f519089df131645297a0bd3ab16", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 33034, "upload_time": "2017-06-13T10:40:51", "url": "https://files.pythonhosted.org/packages/96/65/0462c5504d6abde7ba36e6b8a28e3213b7eeedfee70212fe7b105f5c8ef6/essay-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3031aaf064c61cc12bfd4895f6bc708", "sha256": "d520c6b4a842658bf1d75b35db59cf85cd3bd9275ce9b947c2830abd066f92c5" }, "downloads": -1, "filename": "essay-0.0.3.tar.gz", "has_sig": false, "md5_digest": "a3031aaf064c61cc12bfd4895f6bc708", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15913, "upload_time": "2017-06-13T10:40:53", "url": "https://files.pythonhosted.org/packages/89/c2/8641f6935d8e0d172fda36706bfd6361c21ce60746e9d125a92b0b4500fa/essay-0.0.3.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "0b94d17567fc2ba7cfc50e7079b52022", "sha256": "da8ae2e73361de1f32471c776cc1199baf32b697a1164734071edcdae03d08f5" }, "downloads": -1, "filename": "essay-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0b94d17567fc2ba7cfc50e7079b52022", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 33278, "upload_time": "2017-12-14T08:13:44", "url": "https://files.pythonhosted.org/packages/58/a7/04523829ec3332dba8a995b0cdc97b89179222c587f9ee59a563fc7603b2/essay-0.0.5-py2.py3-none-any.whl" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "e39b88933d54914060e52fe221a72cbf", "sha256": "464152ceaa8a56756ea953fbf17d62bb3558cc46d2c824da0a542c30f345565b" }, "downloads": -1, "filename": "essay-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e39b88933d54914060e52fe221a72cbf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 33321, "upload_time": "2018-05-10T11:49:28", "url": "https://files.pythonhosted.org/packages/52/f2/d1eefb010a7585eaeeaab8aae4da713a8092c2ac49a44a17247487d4dced/essay-0.0.6-py2.py3-none-any.whl" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "9ebc6e8bf9040ce5cccfff8765dcfc5d", "sha256": "a4e8ae9762668bd284800ad967bd62cb6b379600a72a23fc63b08cacf6624964" }, "downloads": -1, "filename": "essay-0.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9ebc6e8bf9040ce5cccfff8765dcfc5d", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 32085, "upload_time": "2018-05-14T11:36:50", "url": "https://files.pythonhosted.org/packages/aa/df/6df4722806b4a0906affd14389376b9b643c72c66eaccabaab0bef39a3c5/essay-0.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b664b26389c295c4118522e2012409df", "sha256": "633f80d49a5d3737b5d608734a9c43cbb59cc088d786b914a2c280da7e5088e7" }, "downloads": -1, "filename": "essay-0.0.7.tar.gz", "has_sig": false, "md5_digest": "b664b26389c295c4118522e2012409df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21582, "upload_time": "2018-05-14T11:36:47", "url": "https://files.pythonhosted.org/packages/5e/1c/e19c1434d13925f47ceddaf82466645efd4a9dd697bf83570b16e2f8371e/essay-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "2d8442090948839c1c752d5be1ca01bd", "sha256": "a6e2546a1193d9ccd7ff74fb6fec5bdb8a784dc6a8f8de4aee41595796856c19" }, "downloads": -1, "filename": "essay-0.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2d8442090948839c1c752d5be1ca01bd", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 37719, "upload_time": "2018-05-17T04:46:24", "url": "https://files.pythonhosted.org/packages/5d/3b/a805857cb6b7ab9965e7709a0d84de125ac3c6e2a64a1b37f06814ce71be/essay-0.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e016f8f140b6c98e0555eac907f5f170", "sha256": "626b726ace3f4d46f290f86296e097468412c8aaadbf725daf6dbf5330985e0b" }, "downloads": -1, "filename": "essay-0.0.8.tar.gz", "has_sig": false, "md5_digest": "e016f8f140b6c98e0555eac907f5f170", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24534, "upload_time": "2018-05-17T04:46:20", "url": "https://files.pythonhosted.org/packages/3d/21/67cd579902f6a3b8c67f888a58f159c05c3b3ab091224540f73e10417056/essay-0.0.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2d8442090948839c1c752d5be1ca01bd", "sha256": "a6e2546a1193d9ccd7ff74fb6fec5bdb8a784dc6a8f8de4aee41595796856c19" }, "downloads": -1, "filename": "essay-0.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2d8442090948839c1c752d5be1ca01bd", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 37719, "upload_time": "2018-05-17T04:46:24", "url": "https://files.pythonhosted.org/packages/5d/3b/a805857cb6b7ab9965e7709a0d84de125ac3c6e2a64a1b37f06814ce71be/essay-0.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e016f8f140b6c98e0555eac907f5f170", "sha256": "626b726ace3f4d46f290f86296e097468412c8aaadbf725daf6dbf5330985e0b" }, "downloads": -1, "filename": "essay-0.0.8.tar.gz", "has_sig": false, "md5_digest": "e016f8f140b6c98e0555eac907f5f170", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24534, "upload_time": "2018-05-17T04:46:20", "url": "https://files.pythonhosted.org/packages/3d/21/67cd579902f6a3b8c67f888a58f159c05c3b3ab091224540f73e10417056/essay-0.0.8.tar.gz" } ] }