为什么要有一键式搭建测试脚本开发环境?
回想读着安装配置文档,一步一步搭建环境的经历,是否是这样的:
- 粗心大意型: 装了几个小时,突然发现少走了一步,导致安装错误,不得不在出错后,重新搭。
- 文档过时型: 文档虽然有,可是好久没人维护,不能工作了。
- 环境差异型: 明明按照文章一步一步走,为啥还是错了? 经过了各种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/trusty64
box创建虚拟机。
$ 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上的源码
任务主要包含几个部分:
- 指定在哪个用户下执行task。
- 添加nodejs的安装源
- 添加oracle-java-8的安装源
- 设置自动确认java安装的license。
- 为Appium安装依赖(nodejs, java8 等等)
- 安装Appium
- 下载安装android sdk 23 及 platform工具
- 设置环境变量
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
最后: 文章以后将同步在微信公众号中,欢迎大家关注~~