Openstack研发工程师需要懂得的一点点集成测试

Openstack开发工程师,都是在开源的基础上来进行二次开发,修改代码的时候就有可能造成改动引发,而众所周知的,研发工程师都是很懒的,不想写测试用例,也不懂得基本的集成测试。

Openstack的集成测试框架用的是tempest了,我依然沿用开源的方式来搭建我自己的集成测试框架。我使用集成测试框架为jenkins + Docker + tempest,来我们一步一步开始搭建我的集成测试环境。

概述

openstack中控制台booting from hard disk openstack debug_Docker

我们在跑tempest集成测试案例的整个流程如上图所示,我们是jenkins来作为管理,我们有两个任务,第一个任务A启动docker作为slave,并且触发B任务,B任务中执行tempest案例;B任务为tempest任务,此任务执行在A任务创建的docker环境中,执行tox –e smoke 来跑我们的测试案例,执行完案例之后,A任务会删掉创建的docker,回收资源。

安装docker

Ubuntu环境下安装docker:

apt-get update 
sudo apt-get install apt-transport-https ca-certificates 
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D 
echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" >>/etc/apt/sources.list.d/docker.list 
sudo apt-get update 
sudo apt-get purge lxc-docker 
apt-cache policy docker-engine 
  
sudo apt-get update 
sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual 
  
sudo apt-get update 
#安装docker 
sudo apt-get -y install docker-engine 
  
#默认让docker启动 
chkconfig docker on 
  
#修改docker启动选项,添加host
vi /etc/default/dockerDOCKER_OPTS="-H=unix:///var/run/docker.sock -H=0.0.0.0:6732" 
service docker restart

centos下安装docker:

一条命令搞定:

yum install –y docker 
  
#修改docker启动选项,添加host
vi /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald -H=unix:///var/run/docker.sock -H=0.0.0.0:6732' service docker restart

搭建jenkins环境

安装完成docker之后,就需要搭建jenkins环境了,有了docker,当然我们jenkins也要在docker中了,所以部署jenkins就是非常容易的事了。

 

chown -R 1000 /home/my_jenkins/
docker run --name myjenkins -p 8080:8080 -p 50000:50000 --privileged=true -v /home/my_jenkins:/var/jenkins_home jenkins

 

我们把jenkins工程跑到本地/home/my_jenkins/目录下,需要给他赋值1000的权限,否则运行jenkins可能会出错。

jenkins docker运行起来,就可以通过http://<host_ip>:8080登录了,在登录的界面中,会选择安装插件,设置初始用户名与密码了。最后就进入了如下图所示的界面。搭建jenkins环境完成。

 

openstack中控制台booting from hard disk openstack debug_python_02

添加节点

系统管理à管理节点à新建节点,然后输入必要的信息,如下图所示。

注意:你添加的的节点需要要java-jdk,需要安装docker服务。

只有安装了docker服务,才能在这个节点启docker。

openstack中控制台booting from hard disk openstack debug_python_03

安装jenins的docker插件

系统管理à管理插件,选择可选插件,在搜索框中输入docker,如下图所示,安装docker plugin.

openstack中控制台booting from hard disk openstack debug_Docker_04

建议把插件Parameterized Trigger Plugin安装上,如下图所示,这个插件非常好用,可以阻塞的触发其他的job。

openstack中控制台booting from hard disk openstack debug_Docker_05


安装完docker插件之后,需要配置云。

系统管理à系统设置,拉倒最下面,会看到如下图所示的界面,点击新增一个云,选择docker。

 

openstack中控制台booting from hard disk openstack debug_docker_06


 

增加云之后,需要配置云的基本信息,如下图所示

openstack中控制台booting from hard disk openstack debug_python_07


name: tempest_slave 云的名称,自己定义。

Docker URL: http://162.3.160.50:6732 这个是docker的rest api的访问地址,在我们安装docker的步骤中,我们在docker启动选项中添加了host,就是因为可以通过rest api操作我们的docker。

Docker Image : 162.3.160.50:5000/tempest:10 这个就是你的镜像名称,也可以是其他的镜像,比如社区上evarga/jenkins-slave

 

配置好了,就可以跑我们的第一个任务了,如下图所示,选择 构建一个自由风格的软件项目。点击ok。

openstack中控制台booting from hard disk openstack debug_Docker_08


ok之后,就如下图所示的配置页面

openstack中控制台booting from hard disk openstack debug_python_09


我们选定在162.3.160.50这个节点运行我们的docker slave,因为在添加节点章节,已经把这个节点加入了,并且安装了java与docker服务。

在构建中,我们有两个步骤:

  1. Start/Stop Docker Containers 如下图所示,Docker Cloud name:tempest_slave,就是我在系统设置设置cloud名称
    Template ID: 162.3.160.50:5000/tempest:10 ,就是我设置的镜像名称
  2. Trigger/call builds on other projects 如下图所示,我们触发另外一个任务tempest,此任务跑在步骤1启动的docker中。

openstack中控制台booting from hard disk openstack debug_docker_10


我们在来看一下另外一个任务tempest,如下图所示,最重要的要设置Restrict where this project can be run 为template ID 为162.3.160.50:5000/tempest:10 的label。

 

openstack中控制台booting from hard disk openstack debug_docker_11


点击任务tempest_docker的立即构建,就可以跑起来了。如下图所示。

openstack中控制台booting from hard disk openstack debug_Docker_12


 

至此,我们就可以跑我们的tempest了。整个流程就是,任务tempest_docker 启动docker,作为一个docker slave, 并且触发另外一个任务tempest,任务tempest就跑在docker slave中,就可以执行我们tempest命令了。每次执行都是一个全新的tempest环境。动动手指,每天就可以跑tempest,还可以跟上库触发跑tempest,每天都可以知道自己上库的代码是否有改动引发了。

制作tempest镜像

在我们配置jenkins时,用到了一个tempest镜像,这个镜像的制作Dockfile如下:

FROM centos:7 
MAINTAINER laoyi <yibo_grace@163.com> 
  
# install dep lib 
  
RUN yum -y install epel-release 
RUN yum clean all && yum list && yum repolist all 
RUN yum install -y gcc git libxslt-devel openssl-devel libffi-devel python-devel python-pip python-virtualenv 
RUN pip install junitxml 
  
RUN git clone https://github.com/openstack/tempest.git && cd tempest && python setup.py install 
RUN mkdir -p ~/.pip && echo -e "[global]\ntrusted-host=pypi.douban.com\nindex-url = http://pypi.douban.com/simple/" >>~/.pip/pip.conf 
RUN cd tempest && pip install -r requirements.txt 
RUN cd tempest && pip install tox && tox -egenconfig 
RUN cd tempest && mkdir -p /etc/tempest && ls -l /etc/tempest && ls -l etc && cp etc/tempest.conf.sample /etc/tempest/tempest.conf 
  
RUN yum install -y java 
RUN yum install -y openssh-server 
  
RUN mkdir -p /var/run/sshd 
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' 
  
# Set user jenkins to the image 
RUN useradd -m -d /home/jenkins -s /bin/sh jenkins &&\ 
 echo "jenkins:jenkins" | chpasswd 
  
# Standard SSH port 
EXPOSE 22 
  
# Default command 
CMD ["/usr/sbin/sshd", "-D"]

分享镜像

创建好了镜像,要懂得分享镜像,现在国家都提倡共享经济,咱也要紧跟共产党的指示来分享我们的镜像。

按照安装docker的步骤中的,找到启动选项配置文件,增加--insecure-registry <REGISTRY_HOSTNAME>:5000 参数,修改docker启动选项为:
OPTIONS='--selinux-enabled --log-driver=journald -H=unix:///var/run/docker.sock -H=0.0.0.0:6732 --insecure-registry <REGISTRY_HOSTNAME>:5000'
修改完成之后,重启docker。
启动docker registry服务:
docker run -p 5000:5000 -v <HOST_DIR>:/tmp/registry-dev registry
启动完registry服务之后,我们需要上传镜像:
docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
tempest                     latest              5f81c45f13d9        45 hours ago        870.6 MB
jenkins                     latest              753c2e1bdef7        2 weeks ago         715.4 MB

上传tempest镜像的方法:
docker tag 5f81c45f13d9 <REGISTRY_HOSTNAME>:5000/tempest:latest
docker push <REGISTRY_HOSTNAME>:5000/tempest:latest

 

总结

我们只是用了jenkins最简单的部分功能,但是依然显示了它的强大。程序员都很懒,所以我们需要自动化测试工具。能够自动化的,绝不人工操作。科技的进步,都是懒人造出来的,我怎么觉得这句话还是有一点对呢?你说呢?