Openstack工程的持续集成实践1--tox

Openstack工程的持续集成实践1--tox

写在最前面
以keystone工程为例,其他工程类似
内容包括:打源码包(sdist)、单元测试(UT)、测试覆盖率(coverage)、代码格式检查(pep8,flake)

1、引子

接触了一段时间openstack社区,并提交了几个bug之后,就发现社区中,从bug提交、问题确认、到bug修复,代码review,自动构建、单元测试、静态检查、再到代码合入,也就是我们经常说的持续集成(CI),是一个非常简单和高效的过程。
开发人员都是懒人,这点我从来都没有怀疑过,怎么让一群懒人(还是一大群)将CI的这么多步骤做规范,并且不觉得是一个麻烦的过程,需要很高的技巧和聪明才智。
我认为持续集成(CI)有两个重点需要把握,首先要好上手,简单易学,开发都是懒人,不好用的东西,很难养成习惯使用;其次做且仅做应该做的事,也就是CI检查的范围要确定,保持CI的高速,写完代码10分钟之内,要出ut和coverage的结果。
来让我们看看openstack社区的持续集成都包括哪些内容,使用了哪些工具。

2、tox

对openstack几个核心工程代码比较熟悉的朋友,可能都会注意到代码根目录下都有个tox.ini文件,tox其实就是openstack持续集成中非常重要的一个工具,tox.ini就是tox的配置文件。
tox的官方对于tox的定义是这样的:
Tox as is a generic virtualenv management and test command line tool
也就是一个通用的虚拟环境管理和测试命令行工具。
所谓的虚拟环境,就是可以在一个主机上,自定义出多套的python环境,多套环境中使用不同的python拦截器,环境变量设置,第三方依赖包,执行不同的测试命令,最重要的是各个环境之间互不影响,相互隔离。
最典型的应用就测试在不同python版本下代码的兼容性,我们可以为py2.4,py2.5,py2.6,py2.7创建不同的虚拟环境,都可以用tox统一管理;也可以在tox.ini中自定义虚拟环境,例如:testevn:pep8,代码格式检查;testenv:cover,测试覆盖率。
我们以最新的H版的keystone的tox.ini为例:

首先定义tox的全局配置,列出了需要执行的虚拟环境列表,在命令行中直接执行tox,就会依次执行py26,py27,pep8

  1. [tox] 
  2. envlist = py26,py27,pep8 
[tox]
envlist = py26,py27,pep8
然后定义了虚拟环境的配置
  • setenv列出了虚拟机环境中生效的环境变量,一些配色方案和单元测试标志;
  • deps列出了虚拟环境需要的第三方依赖包,也就是keystone根目录下的requirements.txt和test-requirements.txt其中包括了keystone运行和单元测试时,需要用到的依赖包,每个虚拟环境创建的时候,会通过pip install -r requirements.txt和pip install -r test-requirements.txt安装依赖包到虚拟环境;
  • commands就是在当前虚拟环境中需要执行的命令,python tools/patch_tox_venv.py就是安装了redhat-eventlet.patch补丁;nosetests {posargs}就是执行nose进行单元测试,{posargs}参数就是可以将tox的参数传递给nosetests,例如:tox -- --with-coverage执行的时候就是nosetests --with-coverage
  1. [testenv] 
  2. setenv = VIRTUAL_ENV={envdir} 
  3.          NOSE_WITH_OPENSTACK=1 
  4.          NOSE_OPENSTACK_COLOR=1 
  5.          NOSE_OPENSTACK_RED=0.05 
  6.          NOSE_OPENSTACK_YELLOW=0.025 
  7.          NOSE_OPENSTACK_SHOW_ELAPSED=1 
  8.          NOSE_OPENSTACK_STDOUT=1 
  9. deps = -r{toxinidir}/requirements.txt 
  10.        -r{toxinidir}/test-requirements.txt 
  11. commands = python tools/patch_tox_venv.py 
  12.            nosetests {posargs} 
[testenv]
setenv = VIRTUAL_ENV={envdir}
         NOSE_WITH_OPENSTACK=1
         NOSE_OPENSTACK_COLOR=1
         NOSE_OPENSTACK_RED=0.05
         NOSE_OPENSTACK_YELLOW=0.025
         NOSE_OPENSTACK_SHOW_ELAPSED=1
         NOSE_OPENSTACK_STDOUT=1
deps = -r{toxinidir}/requirements.txt
       -r{toxinidir}/test-requirements.txt
commands = python tools/patch_tox_venv.py
           nosetests {posargs}
自定义了一个pep8的代码静态检查的虚拟环境,执行flake8 --filename=keystone* bin

  1. [testenv:pep8] 
  2. commands = 
  3.   flake8 
  4.   flake8 --filename=keystone* bin 
[testenv:pep8]
commands =
  flake8
  flake8 --filename=keystone* bin
定义了和CI server jenkins的集成配置,指定了pip的下载cache目录,提高构建虚拟环境的速度

  1. [tox:jenkins] 
  2. downloadcache = ~/cache/pip 
[tox:jenkins]
downloadcache = ~/cache/pip
定义一个cover的虚拟环境,就是指定了一些环境变量,使单元测试的时候,自动应用coverage,并定义了coverage生成的html报告目录

  1. [testenv:cover] 
  2. setenv = VIRTUAL_ENV={envdir} 
  3.          NOSE_WITH_COVERAGE=1 
  4.          NOSE_COVER_HTML=1 
  5.          NOSE_COVER_HTML_DIR={toxinidir}/cover 
[testenv:cover]
setenv = VIRTUAL_ENV={envdir}
         NOSE_WITH_COVERAGE=1
         NOSE_COVER_HTML=1
         NOSE_COVER_HTML_DIR={toxinidir}/cover
这个不太明白,也许就是创建一个虚拟机环境,执行一个自定义的命令行,以备扩展

  1. [testenv:venv] 
  2. commands = {posargs} 
[testenv:venv]
commands = {posargs}
定义了flake8静态检查的一些细节配置

  1. [flake8] 
  2. show-source = true 
  3.  
  4. # H304: no relative imports. 
  5. ignore = H304 
  6.  
  7. builtins = _ 
  8. exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,tools,vendor,.update-venv 
[flake8]
show-source = true

# H304: no relative imports.
ignore = H304

builtins = _
exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,tools,vendor,.update-venv

3、使用过程中的一些改进

直接使用keystone自带的tox.ini执行单元测试和静态检查时,也遇到了一些问题:

  • 每次执行tox命令的时候,所有的虚拟环境都会重建,重新用pip下载依赖包,时间都浪费在了下包上,recreate=False也不能解决,后来想了个招儿,先手动用pip将requirements.txt和test-requirements.txt都安装在系统python库下,然后将sitepackages=True,继承系统的依赖包。这样似乎打破了虚拟环境相互隔离的好处,但是能节省非常多的时间,大概70%。大家自己权衡是否需要使用这种方法。
  • 执行单元测试的时候,顺便生成单元测试报告,并检查测试覆盖率,并生成覆盖率报告。直接执行tox是不行的,只能进行单元测试,需要给tox增加扩展参数,如下:tox -- --cover-erase -- --with-coverage -- --cover-html
  • 一开始执行tox的时候,生成的coverage覆盖率报告都是0%,百思不得其解,后来发现keystone根目录下有个.coveragerc文件,这个文件是coverage的配置文件,会影响coverage的行为,将文件中的source = keystone注释掉之后,正常生成覆盖率报告。
### 安装 OpenStack Nova 组件 可以通过 `yum` 命令来安装 OpenStack Nova 的相关组件,具体命令如下: ```bash yum -y install openstack-nova-api openstack-nova-conductor openstack-nova-scheduler openstack-nova-novncproxy ``` 此命令将会自动下载并安装所需的依赖项以及指定的服务组件[^1]。 --- ### 配置 OpenStack Nova 服务 完成安装后,需要对这些服务进行必要的配置。以下是主要步骤说明: #### 修改主配置文件 编辑 `/etc/nova/nova.conf` 文件以调整调度器的行为。例如,为了实现定期扫描计算节点的功能,可以在 `[scheduler]` 节下添加以下参数: ```ini [scheduler] discover_hosts_in_cells_interval = 300 ``` 这表示每隔 300 秒(即 5 分钟)扫描一次计算节点中的主机状态[^4]。 保存更改后重启 API 服务以使新配置生效: ```bash systemctl restart openstack-nova-api.service ``` --- ### 启动与设置开机自启 安装完成后,需手动启动各个 Nova 相关服务,并将其设为随系统启动而运行: ```bash systemctl start openstack-nova-api openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy systemctl enable openstack-nova-api openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy ``` 以上操作确保了所有核心服务正常运行并能够在下次系统启动时自动加载[^2]。 --- ### 创建管理接口端点 如果尚未创建 Nova 的管理员服务端点,则可通过以下命令完成初始化工作: ```bash openstack endpoint create --region RegionOne nova admin http://<control_node_ip>:8774/v2.1 ``` 其中 `<control_node_ip>` 应替换为实际的控制器节点 IP 地址。成功执行该命令后,将返回包含字段及其对应值的结果表单,确认端点已正确注册到 Keystone 中[^3]。 --- ### 总结 综上所述,通过 Yum 源安装 OpenStack Nova 组件的过程涉及以下几个方面: 1. 使用 `yum` 工具批量安装所需软件包; 2. 编辑配置文件优化功能选项; 3. 手动激活各子服务并将它们加入系统的引导序列; 4. 注册相应的访问入口至身份验证框架内。 按照上述指导即可顺利完成基础环境搭建任务。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值