利用docker+power shell 打造一个自动化编译平台

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jewelsu/article/details/78795995

背景:目前参与的项目是一个多平台项目,需要多个平台下编译的版本:具体包含windows下的版本,linux-x86下的版本(由于最终使用的平台不同又分为两个版本),linux-arm下的版本。因此需要多个编译环境。由于项目比较大,每次到发布新的安装包时就会耗费比较多的时间从svn上检出,编译,制作。因此希望能够用一台电脑自动实现这个过程,可以每天晚上固定的时间从svn上检出,如果有变化就自动编译,制作安装包,再由人工确定是否需要测试及发布。

该工程希望分为四期进行。

一期工程首先实现定时从svn上检出,然后编译。

二期工程实现对svn上检出结果的判断,自动制作安装包。

三期工程实现与testtrack的对接,自动发布release note。

四期工程增加自动单元测试功能和自动发送编译结果的功能。

本篇中只谈论一期工程。

由于有window版本的编译,所以主机会使用windows,编译环境有三种方案

1.    使用windows版的gcc和linaro在windows下编译

2.    安装linux虚拟机,在虚拟机上共享主机目录,在虚拟机上设置定时任务。

3.    使用docker,在主机设置定时任务调用docker容器来编译。

扫描二维码关注公众号,回复: 3877063 查看本文章

下面简述方案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.    设置定时任务

在计算机管理->任务计划程序点右键,创建基本任务,就可以配置定时任务了。

猜你喜欢

转载自blog.csdn.net/jewelsu/article/details/78795995