zoukankan      html  css  js  c++  java
  • 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."

  • 相关阅读:
    销傲中国式销售过程管理系统功能概述
    真正高效的SQLSERVER分页查询(多种方案)
    request.getScheme()的使用方法
    用户'sa'登录失败(错误18456)解决方案图解
    在SQL Server中创建用户角色及授权
    大话设计模式--外观模式 Facade -- C++实现实例
    大话设计模式--模板方法模式 TemplateMethod -- C++ 实现
    大话设计模式--原型模式 Prototype -- C++实现
    C++拷贝构造函数(深拷贝,浅拷贝)
    大话设计模式--工厂方法模式 Factory Method -- C++实现
  • 原文地址:https://www.cnblogs.com/2018/p/3544118.html
Copyright © 2011-2022 走看看