背景:目前参与的项目是一个多平台项目,需要多个平台下编译的版本:具体包含windows下的版本,linux-x86下的版本(由于最终使用的平台不同又分为两个版本),linux-arm下的版本。因此需要多个编译环境。由于项目比较大,每次到发布新的安装包时就会耗费比较多的时间从svn上检出,编译,制作。因此希望能够用一台电脑自动实现这个过程,可以每天晚上固定的时间从svn上检出,如果有变化就自动编译,制作安装包,再由人工确定是否需要测试及发布。
该工程希望分为四期进行。
一期工程首先实现定时从svn上检出,然后编译。
二期工程实现对svn上检出结果的判断,自动制作安装包。
三期工程实现与testtrack的对接,自动发布release note。
四期工程增加自动单元测试功能和自动发送编译结果的功能。
本篇中只谈论一期工程。
由于有window版本的编译,所以主机会使用windows,编译环境有三种方案
1. 使用windows版的gcc和linaro在windows下编译
2. 安装linux虚拟机,在虚拟机上共享主机目录,在虚拟机上设置定时任务。
3. 使用docker,在主机设置定时任务调用docker容器来编译。
下面简述方案3.
具体步骤如下
1. 安装docker。
1.1最好的方案是在win10下直接安装docker for windows,
https://docs.docker.com/engine/installation/#desktop
有详细介绍。
但是部署用的机器可能采用的是win7,所以安装了docker toolbox,会安装virualbox,一个终端,还有gui工具kitematic。
1.2安装之后启动终端,会首先自动下载一个名为default的virualbox虚拟机,然后登陆进去,就可以输入docker命令了。
在开机后首次打开终端由于需要启动虚拟机会比较慢,有时候会停在waitingforip,等一下,敲一下回车就好了。
Docker的使用参考github上的文档docker从入门到实践
https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md
2. 制作镜像
需要用到三个linux的版本,分别为centos6.5,centos4.3,ubuntu12.4(用于编译arm版)。
2.1最好的办法是从dockerhub上下载基础镜像,然后在其基础上制作自己的镜像。但是无奈这几个版本太老了或者是中间版本,docker hub上并没有官方版本。
好在在openvz.org上找到了ubuntu12.4的最小包镜像。下载下来可以直接用。在另一篇中介绍了镜像包的制作。
ubuntu12.4镜像包的下载地址
https://download.openvz.org/template/precreated/
2.2下载后不要解压,直接放到用户目录下。
在终端中找到压缩文件所在的目录利用docker镜像导入的功能导入
$docker import ubuntu-12.04-x86_64-minimal.tar.gz openvz/ubuntu:12.04
输入$docker images 可以查到现有的镜像。
可以通过输入
$docker run -it openvz/ubuntu:12.04 bash
来打开一个容器,尝试操作安装gcc的步骤,为制作镜像做准备。
用到的命令
#echo"deb http://mirrors.aliyun.com/ubuntu precise main restricted universe"> /etc/apt/sources.list
# echo "deb http://mirrors.aliyun.comubuntuprecise-update main restricted universe" >> /etc/apt/sources.list
#apt-get update
# apt-get install g++-arm-linux-gnueabihf -y
# apt-get clean
根据这些命令写Dockerfile文件,制作镜像。
文件内容为:
FROM openvz/ubuntu:12.04
RUN echo "deb http://mirrors.aliyun.com/ubuntu precise mainrestricted universe" > /etc/apt/sources.list \
&&echo "deb http://mirrors.aliyun.comubuntu precise-update main restricteduniverse" >> /etc/apt/sources.list \
&&apt-get update\
&&apt-get install g++-arm-linux-gnueabihf -y\
&&apt-get clean
放在一个新的目录下。
然后cd到该目录下
$docker build -t mygcc/ubuntu:armgcc .
构建镜像。
通过$docker images可以查看到新的镜像是否生成。
2.3如果centos的镜像中没有包含g++,则可以用同样的方法制作centos的镜像,如果最初制造的镜像中包含了g++,这一步可以省略。
Dockefile文件如下
FROMcentos:6
RUN yuminstall -y gcc-c++ make\
&& yum cleanall
3. 使用容器
3.1创建容器
首先在主机上代码目录下写一个脚本makecomp1.sh内容
cd/mnt/path-to-code
make
最好在linux下创建和写脚本,否则执行时有可能报找不到路径的错误
然后可以直接创建容器,容器中直接调用这个脚本
docker run --name compile1 --mount type=bind,source="/c/Users/path-to-code",target=/mnt –-env ACE_ROOT=/mnt/path-to-ace myimage /path-to-makecomp
其中包含了与主机数据共享,环境变量设置。
也可以创建可以互动的容器。
dockerrun -it --name compile1it --mounttype=bind,source="/c/Users/path-to-code",target=/mnt –-envACE_ROOT=/mnt/path-to-ace myimage bash
3.2 使用容器
可以直接使用$dockerstart compile1来执行一次编译操作。
如果是使用可以互动的容器,可以用
$docker startcompile1it来启动容器,然后用
$docker exec -itcompile1it bash 来开启终端。
3.3 其他版本
分别为每个版本创建一个脚本,一个容器。
4. 发布镜像
3.1可以将制作好的镜像保存成文件,然后在要部署的机器上直接导入。
使用$docker image save mygcc/ubuntu:armgcc|gzip> ubuntu-armgcc.tar.gz
生成文件,然后将文件拷贝到要部署的机器上执行
$docker image load -i ubuntu-armgcc.tar.gz
就可以使用镜像了。
这种方式会保留之前的所有对镜像操作的历史记录和元数据。也会保存标签
3.2另一种方法是保存容器快照,然后在要部署的机器上直接导入
首先创建一个容器
$docker run --name mygcc mygcc/ubuntu:armgcc bash
然后
$docker export mygcc | gzip>ubuntu-armgcc.tar.gz
生成容器快照
然后在部署机器上用
$docker image import ubuntu-armgcc.tar.gz ubuntu:armgcc导入
3.2使用docker hub
首先在http://cloud.docker.com/上注册用户,
然后$docker login登录
修改标签
$ docker tag my_image $DOCKER_ID_USER/my_image
上传镜像
$ docker push $DOCKER_ID_USER/my_image
参考https://docs.docker.com/docker-cloud/builds/push-images/
5. 编写windows脚本调用docker
4.1开启power shell权限
Power shell是windows下的增强版的命令行终端。Ps1文件是其脚本文件,类似于bat文件。但是脚本的运行权限默认权限是关闭的。需要开启。
通过ps C:>Get-ExecutionPolicy 获得当前的权限。
可以设置权限为只执行本地脚本。
Ps c:> Set-ExecutionPolicy RemoteSigned参考http://www.cnblogs.com/studyzy/p/6113221.html
4.2在powershell中操作docker
启动虚拟机
Ps c:> docker-machine.exe start default
把当前的PowerShell和虚拟机里面的Docker Linux建立的连接,以便在PowerShell中使用docker命令。
Ps c:> docker-machine.exe env default|Invoke-Expression
PS C:\Users\name > docker start compile1
将这两行代码写到一个ps1文件中,就可以执行了。
6. 利用脚本来编译windows版本。
Visual studio2010提供了命令行编译工具devenv位置在安装目录的common7\IDE下面,可以在命令行中输入 .\devenv /help查看帮助(这个不是正确的参数,但是会出现帮助)
命令的格式为
devenv 解决方案文件.sln /build [ 解决方案配置 ] [ /project 项目名称或文件 [ /projectconfig 名称 ] ]
PS>C:\ProgramFiles (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv "C:\path-to-code\appname.sln" /build Release
7. 编写windows脚本实现svn自动检出
因为已经安装了TortoiseSVN,提供了命令行的工具。可以直接使用
TortoiseProc.exe /command:update/path:"c:\svn_wc\" /closeonend:1 来更新,
使用
TortoiseProc.exe /command:commit /logmsg:"autocompile" /path:"c:\path-to-svn-local\" /closeonend:1
来提交。
8. 设置定时任务
在计算机管理->任务计划程序点右键,创建基本任务,就可以配置定时任务了。