- Jenkins 持续集成系统工具
- LeanCloud 测试和生产部署环境
- DaoCloud 测试和生产部署环境
- Github 代码库以及版本控制工具
一个持续集成环境需要包括三个方面要素:代码存储库、构建过程和持续集成服务器。这里代码存储库我们采用的Github,持续集成服务器是Senz项目下的AliYun 服务器,你可以登陆Senz项目[Jenkins管理端][]来查看和管理当前的Jenkins Job(每一个job都是一连串的交互操作,需要在管理端进行相应的配置,以实现项目自动化测试和部署),构建过程即为部署在持续集成服务器上的开源工具 Jenkins。 Jenkins提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
[LeanCloud][]是国内针对移动应用的一站式BaaS云端服务。在可见的未来,我们大部分的NodeJS后端服务和部分独立的Python(django或者flask)后端服务都会部署在LeanCloud环境下。LeanCloud为我们的移动应用产品提供完整的数据存储、代码测试环境、生产环境(docker容器)等服务,并且提供了一键式的deploy和publish项目API。 [LeanCloud]: https://leancloud.cn/
[DaoCloud][]是国内首个Docker Hub镜像服务,提供互联网应用的持续集成、镜像构建、发布管理、容器托管解决方案。 目前,我们所有大计算量的算法子服务均会部署在DaoCloud环境上。DaoCloud的优点是界面友好,操作简单,容易上手,因此即使是不懂docker的新手来操作也能分分钟搞定。 [DaoCloud]: https://www.daocloud.io/
我们推荐任何一个开发项目都持有两个branch,分别是master和dev,日常的项目开发和bug调试都在dev下进行,只有当代码可以运行,需要进行测试的时候才merge到master branch上。 当然你也可以直接在master上进行开发,但是我们并不推荐这么做,因为每次master branch上的代码发生变化都会触发Jenkins的testJob执行。 同样的,每当项目阶段性的开发结束后,需要发布release版,要求(不是推荐)git tag vX.X.X,因为每次git tag都会触发Jenkins的publishJob执行。
- 使用LeanCloud提供的最新LeanEngine环境开发;
- 在github上创建代码库,每当需要发布最新的release版本时,使用git tag + 版本号(版本号统一使用vX.X.X的形式);
- 在[Jenkins管理端][]创建testJob,每当代码库git push到master分支时,自动触发该项目test事件,执行test脚本,报告测试结果;
- 在[Jenkins管理端][]创建publishJob,每当git tag发布最新release版本时,自动触发该项目的publish事件,首先会执行所有的test脚本,测试通过后再请求LeanCloud的deploy和publish API,启动项目部署到开发环境中。 [Jenkins管理端]: http://182.92.72.69:8080/
- 使用flask进行开发;
- 编写配置flask和所需依赖环境的Dockerfile;(具体可以参照[这个项目][]的Dockerfile,或者想深入了解如何编写Dockerfile可以参考[docker book][]);
- 编写DaoCloud.yml文件,具体参见[DaoCloud.yml文档][]和[DaoCloud.yml示例][];
- 在DaoCloud上创建新的项目,根据提示从代码库导入项目文件,开始进行测试和部署流程。 [这个项目]: https://github.com/petchat/senz.template.docker.flask/blob/master/flask_app/test.py [docker book]: http://yeasy.gitbooks.io/docker_practice/content/ [DaoCloud.yml文档]: https://github.com/DaoCloud/daocloud-doc/blob/master/DaoCloudCI.md [DaoCloud.yml示例]: https://github.com/DaoCloud?utf8=%E2%9C%93&query=sample
首先需要登录到我们的Senz Jenkins管理端,账号和密码见trello的Account Card
-
testJob本质上是一个Jenkins Job,登录后首先点击左上角的New Item,来创建一个新的Jenkins Job;
-
输入Item name,以格式
senz.xxx.xxx_Test
选择freestyle project;
-
进入configure页面,项目名即为刚刚设定的Item name;
-
输入github对应代码库url,来指定项目代码库;
-
勾选Restrict where this project can be run,以限定该job最终运行环境为我们指定的机器,因为是testJob,所以部署在我们的aliyun 1服务器上,Label Expression内填python_main_server。你可以在主页左下方上查看Senz项目的主机情况,每个主机都有一个对应的label;
-
Source Code Management选择github,并填写相应的信息,Branch Specifier内填写*/master,以指定只检查master branch下的变化;
-
Build Triggers选择Build when a change is pushed to GitHub,每次master branch上的代码发生变化时触发build下的操作;
-
Build下的Excute shell中填写执行测试用例的shell脚本,例如:
pip install -r ./flask_app/requirements.txt nosetests ./flask_app/test.py
-
点击save和apply来保存和生效配置信息
-
配置完成后如果你想立即运行,可以点击左侧的Build Now来立即执行一遍生效的Job,同时在console output查看服务器的运行输出
publishJob本质上是两个JenkinsJob,第一个Job和testJob几乎一样,除了:
- 项目名为:
senz.xxx.xxx_Pretest ```;
- Branch Specifier内填写refs/tags/*,以指定一旦有新的tag产生则触发build操作;
- 以及Post-build Actions的Build other projects中Projects to build填写第二个Job的项目名,并选择Trigger only if build is stable,以指定该Job完成后执行Publish Job。
第二个Job用来在生产环境部署代码,操作也很简单,主要区别如下:
- 第二个项目名称为:
senz.xxx.xxx_Publish
- 指定项目的代码库,和master branch
- Restrict where this project can be run和Build Triggers均不用选择。需要说明的是publishJob的build操作仅用向LeanCloud发送很轻量的HTTP请求即可,因此不用指定具体哪一台机器来执行这个Job,其次;而build的触发由上一个pretestJob来触发,因此不由其他触发源触发,因此也不用特殊指定。
- Build下的Excute shell里填写请求LeanCloud后台的脚本,用curl即可。
- fuck