Openstack研发工程师需要懂得的一点点集成测试
Openstack开发工程师,都是在开源的基础上来进行二次开发,修改代码的时候就有可能造成改动引发,而众所周知的,研发工程师都是很懒的,不想写测试用例,也不懂得基本的集成测试。
Openstack的集成测试框架用的是tempest了,我依然沿用开源的方式来搭建我自己的集成测试框架。我使用集成测试框架为jenkins + Docker + tempest,来我们一步一步开始搭建我的集成测试环境。
概述
我们在跑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环境完成。
添加节点
系统管理à管理节点à新建节点,然后输入必要的信息,如下图所示。
注意:你添加的的节点需要要java-jdk,需要安装docker服务。
只有安装了docker服务,才能在这个节点启docker。
安装jenins的docker插件
系统管理à管理插件,选择可选插件,在搜索框中输入docker,如下图所示,安装docker plugin.
建议把插件Parameterized Trigger Plugin安装上,如下图所示,这个插件非常好用,可以阻塞的触发其他的job。
安装完docker插件之后,需要配置云。
系统管理à系统设置,拉倒最下面,会看到如下图所示的界面,点击新增一个云,选择docker。
增加云之后,需要配置云的基本信息,如下图所示
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。
ok之后,就如下图所示的配置页面
我们选定在162.3.160.50这个节点运行我们的docker slave,因为在添加节点章节,已经把这个节点加入了,并且安装了java与docker服务。
在构建中,我们有两个步骤:
- Start/Stop Docker Containers 如下图所示,Docker Cloud name:tempest_slave,就是我在系统设置设置cloud名称
Template ID: 162.3.160.50:5000/tempest:10 ,就是我设置的镜像名称 - Trigger/call builds on other projects 如下图所示,我们触发另外一个任务tempest,此任务跑在步骤1启动的docker中。
我们在来看一下另外一个任务tempest,如下图所示,最重要的要设置Restrict where this project can be run 为template ID 为162.3.160.50:5000/tempest:10 的label。
点击任务tempest_docker的立即构建,就可以跑起来了。如下图所示。
至此,我们就可以跑我们的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最简单的部分功能,但是依然显示了它的强大。程序员都很懒,所以我们需要自动化测试工具。能够自动化的,绝不人工操作。科技的进步,都是懒人造出来的,我怎么觉得这句话还是有一点对呢?你说呢?