Linux下EclipseCDT工程和TFS的持续集成CI实践
在Linux下使用TFS自动构建,需要自动执行连接tfs服务器的操作,命令行文件包TEE-CLC-10.1.0.2011121402.zip,下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=25125
下文是定制TFS的工作流程的方法进行定制
How to Build Linux Code with TFS 2010 Team Build
http://www.richard-banks.org/2010/11/how-to-build-linux-code-with-tfs-2010.html
如上的这个有些麻烦,本文描述的是简单的手工脚本方法
CDT工程的组织[projs.sh]
由于EclipseCDT工程的make文件需要手工的生成,因此项目变化时,需要人工的辅助,处理的方法是:每次项目变化时,重新生成一遍项目文件,并提交到构建服务器上;构建服务器每次获取这些最新的项目make文件进行覆盖[CDT如果可以自动产生make文件这个过程就比较简单了]
详细的脚本内容如下:
#!/bin/bash
#需要管理的项目列表
PROJS=(A/A1
#
A/A1Test
#
B/B1
B/B2)
#Eclipse CDT 项目文件
FILES=(makefile *.mk)
#
MODES=(Release_64 Debug_64)
case "$1" in
create)
if [ $# = 2 ] ; then
OLDDIR=$2
else
#默认的Eclipse CDT工作路径
OLDDIR=/media/work/Branch
fi
BASEDIR=$(echo $PWD | sed 's/\//\\\//g')
OLDDIR=$(echo $OLDDIR | sed 's/\//\\\//g')
let n=0
for prj in ${PROJS[@]}
do
echo $prj
for mode in ${MODES[@]}
do
tar xvf build/prjs/${n}.tar
pushd $prj
find -type f -name "makefile" | xargs sed -i "s/$OLDDIR/$BASEDIR/g"
find -type f -name "*.mk" | xargs sed -i "s/$OLDDIR/$BASEDIR/g"
popd
let n++
done;
done;
;;
#默认建立项目文件【处理Eclipse生成项目文件的问题,脚本如何自动生成未找到办法】
*)
echo "Create Projects Makefile[开发人员变更自己的项目时,运行一次该脚本,然后把build/prjs下的相关文件签入]"
mkdir -p build/prjs
rm -f build/prjs/*
let n=0
for prj in ${PROJS[@]}
do
echo $prj
for mode in ${MODES[@]}
do
let i=0
for file in ${FILES[@]}
do
if [[ $i -eq 0 ]]; then
tar cf build/prjs/${n}.tar ${prj}/${mode}/${file}
else
tar rf build/prjs/${n}.tar ${prj}/${mode}/${file}
fi
let i++
done;
let n++
done;
done;
echo "projects are all ready!"
;;
esac
构建脚本[build.sh]
构建脚本基本流程是:获取最新代码;准备相关的环境;编译;单元测试和检查;等等
具体的参考脚本如下:
#!/bin/bash
##常量定义
BASE_DIRECTORY=`pwd`
tfc=build/tfc/tf
#$tfc eula
tf='build/tfc/tf -login:tfs\\user,password -server:http://192.168.0.1:8080/tfs/DefaultCollection'
PROJ=$/Branch
LOCALPROJ=$BASE_DIRECTORY
##共享函数
function checkFail()
{
if [ $? -ne 0 ];
then
echo -e "\e[1;41m $1 Contiue Integrate [CI] fail! \e[0m"
exit 1
fi
}
#0
chmod +x $tfc
echo "Work Dir:: $LOCALPROJ"
#1 检查工作区映射
$tfc workspaces|grep 'No local workspaces found.'
if [ $? -eq 0 ]; then
echo 'Setting Workspace...'
$tf workspaces -remove:WORK
$tf workspace -delete WORK
$tf workspace -new WORK
$tf workfold -map -workspace:WORK $PROJ $LOCALPROJ
echo 'Setting Workspace done.'
else
$tf workspaces
fi
#2 information
echo
echo 'Current Project Items'
$tf dir $PROJ
echo 'Ready to Build...'
#3 Get Sources and prepare
echo 'Get latest Source Files..'
$tf get -recursive
#依赖的Trunck目录的内容手动获取吧
echo 'Get latest Source Files Done.'
#构建脚本更新后仍可执行
chmod +x $tfc
echo 'Prepare to build'
find -type f -name "*.sh" | xargs chmod +x
#生成的代码自动处理
./ready.sh
#C++的项目文件准备
./projs.sh create
#4 编译和单元测试
echo 'compile and unit test'
pushd install
echo "compile..."
./compile.sh
checkFail
echo "compile done."
echo "unit tests..."
./test.sh
checkFail
echo "unit tests done."
popd
echo "Greate, this update is good!"
其中的compile.sh,test.sh这些脚本是组织所有工程的编译和单元测试的脚本,主要类似有:
make clean
make all
./BTest --gtest_filter=-bench*
pushd ../###
/usr/local/ant/bin/ant junit
checkFail
popd
构建自动调度脚本[build_cron.sh]
由于没有使用TFS标准的构建工作流,具体的调度需要自己编写,本例采用每天的下午16点自动构建,并生成相关的日志,如果需要TFS的默认的高级功能,可以参考上文的参考资料进行设置和定义。
#!/bin/bash
#CI 构建服务调度
:<<EOF
加入/etc/crontab进行自动调度
#csbit cron system wide
# m h dom mon dow user command
* 16 * * * root /root/build/build_cron.sh /root/build/ /root/ci&
#/mnt/hgfs/build对应HOST机器的共享目录,自动构建结果目录/root/ci
ln -s /mnt/hgfs/build /root/ci
EOF
TAG=$(date +%Y-%m-%d_%H-%M-%S)
echo "Build time tag: $TAG"
if [ $# -ge 1 ] ; then
#项目路径
PRJDIR=$1
#CI发布的路径[挂载共享的目录,小组都可以看到结果:发布过程结果和发布文件]
if [ $# = 2 ] ; then
CIDIR=$2
else
CIDIR=/root/ci
fi
else
PRJDIR=/root/build
CIDIR=/root/ci
fi
echo "Project Dir: [$PRJDIR] CI Dir:[$CIDIR]"
sudo mkdir -p $CIDIR
if [ -d $CIDIR ]; then
#手动的文件更新拷贝
echo "Copy manual files..."
if [ -d $CIDIR/sql ]; then
echo "Copy sql files"
cp -r -f $CIDIR/sql $PRJDIR/install
fi
echo "Copy manual files done"
fi
export LANG=zh_CN.UTF-8
pushd $PRJDIR
chmod +x build.sh
sudo ./build.sh &> $CIDIR/$TAG.txt
if [ $? -ne 0 ];
then
echo -e "\e[1;41m $1 Contiue Integrate [CI] fail! \e[0m"
exit 1
fi
popd
echo "copy package to deploy directory"
echo "CI all done"
#构建结果放入install目录
rm -r -f $CIDIR/install
mkdir -p $CIDIR/install
cp -f -r $PRJDIR/install $CIDIR
#不需要发布出去的文件排除
rm -f $CIDIR/install/compile.sh
echo "Ci schedlue done."
Linux下EclipseCDT工程和TFS的持续集成CI实践的更多相关文章
- Jenkins+Gitlab搭建持续集成(CI)环境
利用Jenkins+Gitlab搭建持续集成(CI)环境 Permalink: 2013-09-08 22:04:00 by hyhx2008in intern tags: jenkins gitla ...
- fir.im 持续集成技术实践
互联网时代,人人都在追求产品的快速响应.快速迭代和快速验证.不论是创业团队还是大中型企业,都在探索属于自己的敏捷开发.持续交付之道.fir.im 团队也在全面实施敏捷,并推出新持续集成服务 - flo ...
- fir.im weekly - 「 持续集成 」实践教程合集
我们常看到许多团队和开发者分享他们的持续集成实践经验,本期 fir.im Weekly 收集了 iOS,Android,PHP ,NodeJS 等项目搭建持续集成的实践,以及一些国内外公司的内部持续集 ...
- Gitlab+Gitlab-CI+Docker实现持续集成(CI)与持续部署(CD)
写在前面 记录一下,一个自动化开发部署项目的构建过程与简单使用,实现真正的DevOps gitlab安装 步骤一:安装依赖 yum -y install git gcc glibc-static te ...
- 【OF框架】在Azure DevOps中配置项目持续集成CI服务,推送镜像到Azure容器注册表
准备工作 开通Azure账号,具有开通服务权限,关键是里面要有钱. 开通Azure DevOps,能够创建组织和项目. 具备一定的DevOps知识,了解CICD概念.Docker基本操作. 一.创建& ...
- Apache DolphinScheduler 的持续集成方向实践
今天给大家带来的分享是基于 Apache DolphinScheduler 的持续集成方向实践,分享的内容主要为以下六点: " 研发效能 DolphinScheduler CI/CD 应用案 ...
- 【Qt开发】Linux下Qt开发环境的安装与集成
近期工作需要在Linux下用Qt进行C++开发,所以就在linux下尝试装QT开发环境.本人用的linux是CentOS 6.5.现在对安装过程做出总结.有两种安装方式,下面分别详述: 1 图形化安装 ...
- Linux下环境搭建(四)——jenkins+gitlab+jmeter实践
经过前三篇博文的介绍,jenkins+gitlab+jmeter接口自动化的框架就搭建成功了,详细可见 Linux下环境搭建(一)——java.tomcat配置 Linux下环境搭建(二)——jenk ...
- 视频云SDK iOS持续集成项目实践
1. 前言 2016年, 我们维护的 iOS推流播放融合SDK KSYLive_iOS 在github上发布了40多个版本, 平均两周发布一个新版本, 经历了最初痛苦的全手动版本构建和维护, 到后来慢 ...
随机推荐
- Oracle ASM diskgroup在主机重启后启动失败
环境:RHEL 6.4 + Oracle 11.2.0.3 + ASM单实例 1.重启主机后,+DATA diskgroup启动不成功,现象如下: [grid@JY-DB ~]$ crsctl sta ...
- WOW.js – 在页面滚动时展现动感的元素动画效果
在一些网页上,当你滚动页面的时候会看到各式各样的元素动画效果,非常动感.WOW.js 就是一款帮助你实现这种 CSS 动画效果的插件,很容易定制,你可以改变动画设置喜欢的风格.延迟.长度.偏移和迭代等 ...
- Cordova webapp实战开发:(4)Android环境搭建
在<Cordova webapp实战开发:(3)后面可能会学到的东西>中我们说了一下后续大致包括的内容,今天我们继续.上周我在掌中广材集成了友盟的社交分享,今天想集成iOS应该很顺利的,但 ...
- [SDK2.2]Windows Azure Virtual Network (2) 创建简单的Virtual Network
<Windows Azure Platform 系列文章目录> 本章笔者将介绍如何创建一个简单的 Virtual Network. 1.首先我们登陆Windows Azure管理界面 ht ...
- Android Studio的git功能的使用介绍
本文介绍Android Studio(下面简称AS)中git工具的一些简单使用.因为AS为git的使用提供了很多人性化的图形界面操作,在很大程度上可以增加开发效率.本文面向新手,题主自己也是新手一枚, ...
- 个人作业-Week2:案例分析
截止时间:2016年9月25日24:00. 很多同学有误解,软件工程课是否就是理论课?或者是几个牛人拼命写代码,其他人打酱油的课?要不然就是学习一个程序语言,搞一个职业培训的课? 都不对, 软件工程有 ...
- QT TableWidget 应用笔记
QT TableWidget应用笔记 分类: QT2013-05-21 16:22 2561人阅读 评论(0) 收藏 举报 1.设置表头及大小 QStringList header; header&l ...
- C#编程总结(二)多线程基础
C#编程总结(二)多线程基础 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作.要使应用程序能够快速响应 ...
- 建立MySQL的ODBC
1. 进入控制面板->管理工具->数据源(ODBC): 2. 点击添加,数据源驱动程序选择MySQL ODBC 5.1 Driver: 3. 弹出MySQL Connecotor/ODBC ...
- 【JSP手记】--jsp里面session.getAttribute("×××")在java中的表示
JSP里面的 <%=session.getAttribute("×××")%> 与java等价于 request.getSession().get ...