使用Ansible与Vagrant构建一键式Appium自动化测试脚本开发环境 - part 1

为什么要有一键式搭建测试脚本开发环境?


回想读着安装配置文档,一步一步搭建环境的经历,是否是这样的:

  • 粗心大意型: 装了几个小时,突然发现少走了一步,导致安装错误,不得不在出错后,重新搭。
  • 文档过时型: 文档虽然有,可是好久没人维护,不能工作了。
  • 环境差异型: 明明按照文章一步一步走,为啥还是错了? 经过了各种Google,Stackoverflow,才发现,由于自己机器了曾经装了XXX,与现有的程序不兼容。。。

怎么破?

有人参与的过程,就可能有错误,人会受到外界的影响,如身体状态,情绪等,但是机器不会啊,如果能自动安装,既避免了人为错误,当脚本可读性很高时,还可以当活文档。此时,不得不提到自动化运维工具,puppet, Chef, Ansible 和 Salt。通过使用它们,我们可以通过简单的内置脚本命令,方便的自动化安装环境。

puppet和Chef出现的比较早,非常成熟,且功能强大;Ansible和Salt作为新秀,以简单,直观迅速崛起,而且这两种脚本的可读性都很高。

基于本文的需求,我决定在Ansible和Salt选择一个。在简单的实验后,发现Salt文档较少,出了问题后,Google不是很方便,因此最终选定了ansible(但是个人非常喜欢Salt的脚本风格)。

此时,粗心大意和文档过时的问题有了方案,那环境差异呢?

如果每个都有完全一致的环境,就可以避免写文档的人与搭建环境的人都是做了同样的操作,却得到不同的结果。

虚拟机就是其中一个解决方案。Vagrant提供了便利的创建VM的途径。而且Vagrant提供了系统镜像市场(vagrant中镜像被称为box),仅仅只要两条命令就可以创建一个虚拟机(包括Linux,Windows, Mac OSX).

# 创建一个Linux虚拟机, box为ubuntu/trusty64
$ vagrant init ubuntu/trusty64
$ vagrant up

Vagrant同时支持shell,puppet,Chef, Ansible和Salt的provision,当虚拟机启动时 自动运行上述工具的脚本,实现软件安装,服务启动,配置等等功能,从而实现一键式构建环境的目的。

如何实现


1. 安装Vagrant和Ansible

Vagrant是安装包安装,下载地址。

由于Vagrant仅仅作为虚拟机管理工具,我们还需要虚拟机工具,我们采用免费的vitualbox,下载地址。

Ansible通过官方教程安装教程安装

2. 创建Vagrantfile

vagrant通过配置文件Vagrantfile创建虚拟机,每个为vagrant创建的项目仅有一个Vagrantfile。它定义了虚拟机的类型,配置(如内存,网络等),以及使用哪种工具对虚拟机进行自动化安装配置。

Vagrantfile可以通过vagrant init命令创建。
下面我们将一步一步教大家创建环境,完整的程序在我的github里,源码在这

首先,我们为项目创建一个文件夹,并基于ubuntu/trusty64box创建虚拟机。

$ mkdir vagrant-ansible
$ cd vagrant-ansible
$ vagrant init ubuntu/trusty64

其次,Vagrantfile生成后,通过编辑器打开它。(我使用的编辑器为atom)
修改两个部分:配置内存为1024以及provision为ansible方法。

修改内存如下,幸运的是Vagrantfile中已经帮我们提供内存修改的方法,当被注释了,我们要做的就是取消注释既可:

  # Example for VirtualBox:
  #
  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
    # vb.gui = true

    # Customize the amount of memory on the VM:
    vb.memory = "1024"
  end
  #

修改provision为ansible如下,Vagrantfile中提供了shell方式,我们参考它创建ansible即可:

  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   sudo apt-get update
  #   sudo apt-get install -y apache2
  # SHELL
  config.vm.provision :ansible do |ansible|
    ansible.playbook = "playbook.yml"
  end

ansible同样也是采用基于配置文件来运行自动化安装脚本,该配置文件默认名为playbook.yml,格式为YAML格式。

3. 创建ansible playbook

ansible playbook的具体语法,见ansible中文网站

在创建Vagrantfile的路径下创建playbook.yml

$ touch playbook.yml

打开playbook,添加如下内容:

  • 指定运行ansible脚本的机器(hosts)与何种用户权限执行

    对于vagrant,我们制定hosts为all,为了方便,运行权限为sudo。

---
- hosts: all
  become: yes
  • 指定运行哪些任务

    任务以tasks开头。

---
- hosts: all
  become: yes
  tasks:
    - user: name=vagrant group=vagrant
    - name: Add source for nodejs
      shell: 'curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -'

具体见我github上的源码

任务主要包含几个部分:

  1. 指定在哪个用户下执行task。
  2. 添加nodejs的安装源
  3. 添加oracle-java-8的安装源
  4. 设置自动确认java安装的license。
  5. 为Appium安装依赖(nodejs, java8 等等)
  6. 安装Appium
  7. 下载安装android sdk 23 及 platform工具
  8. 设置环境变量

4. 启动虚拟机与自动化环境安装

一条命令可以搞定:

$ vagrant up

然后等待虚拟机下载box,并自动执行ansible的provision即可。

成功后,通过

$ vagrant ssh

登陆虚拟机,启动appium。

$ appium

遇到的问题


1. nodejs版本问题

ubuntu/trusty64系统的apt-get install的nodejs版本太老,无法支持appium 1.5.3版本。

解决:利用二进制版本安装,安装教程

2. oracle java 8安装

ubuntu/trusty64系统的apt-get install所安装的java为openjdk。

解决:添加oracle java 8的安装源。

oracle java安装时需要确认license。 可以通过命令行自动确认

3. appium 安装被中断

在安装appium过程中,系统kill了安装进程。搜索了一圈后发现,原来是系统内存不足导致。

解决:增加虚拟机内存为1024MB

4. android sdk 命令行安装platform-tool:

解决: 更改android安装目录权限为vagrant用户,并通过--no-ui --filter 安装platform-tools,参考

5. npm 安装appium 失败,返回码为1

appium 1.5.3 使用npm install -g appium安装时,如果通过ansible, Salt,甚至时shell脚本来调用安装,则会返回安装错误,具体问题见appium的issue。
 
解决: 与appium团队成员沟通后,给出了一个临时方案,可以将安装命令true相与。即

npm install -g appium || true

参考文献

Setting up Vagrantified Android Appium environment provisioned with Ansible

最后: 文章以后将同步在微信公众号中,欢迎大家关注~~

使用Ansible与Vagrant构建一键式Appium自动化测试脚本开发环境 - part 1_第1张图片
Paste_Image.png

你可能感兴趣的:(使用Ansible与Vagrant构建一键式Appium自动化测试脚本开发环境 - part 1)