编译、打包

来源:互联网 发布:淘宝小号 不实名 购买 编辑:程序博客网 时间:2024/05/16 23:45

编译、打包

2011-11-14 20:50:45   来源:   评论:0 点击:19

来新公司一个多月了,在这里学到了不少知识。我在这段时间最主要的工作就是

写脚本、编译、打包、和安装环境。所以在这里想谈一点自己的这方面的体会,

和大家分享一下。如有不对之处,欢迎大家批评指正。

      编译打包,原先我们是用的ICP-CI,通过本地CI机调用ANENT,然后从SVN

上挡下最新代码,运行“BUILD.XML”脚本,编译打包一次性完成,最终生成RPM

包。在这个过程中,首先要在本地安装CI机,并完成一些配置。具体为,拷去安

装包到某一个盘根目录下,然后运行CI机,它会自动启动TOMCAT,TOMCAT启动完

成后,在IE地址栏中输入“127.0.0.1”,会进入ICP-CI页面;在这个页面,建

立我们自己的工程、按照提示完成相应的配置,主要有二点:一是需提供SVN的

地址、用户名和密码,这个配置主要是用于从SVN上自动挡下最新代码,二是需

提供本地源码的位置及BUILD.XML文件名及位置,用于编译。可以看出ICP-CI包

含两个基本的流程(最简单的情况),从SVN上下载代码和编译。这些配置(本

地CI)完成之后,紧接着个第二步,就是启动AGENT了,这里为了方便起见,我

用我们当时的环境说明一下。首先进入AGENT机,进入目录“cd 

/home/ciagent/agent/conf/”,然后读取“agent.properties”文件,在里面输

入自己(CI机)的IP地址,即“master_ip="10.144.4.255"” (说明下,由于

我们当时的ANENT配置是一个AGENT只能有一个MASTER,所以每次我们都要注掉别

人的IP,而放开自己的IP,多个人使用就这样,有点麻烦),然后保存退出,退

一步,进入目录“cd /home/ciagent/agent/”,运行当中的“agentwatcher.sh

”脚本,启动AGENT。AGENT成功启动后,第三大步就是在ICP-CI页面“选择构建

”了,选择上面的两个流程(可以针对自己的实际情况选择其中之一,一般两个

都选择),点击“构建”,从而启动编译过程。CI机会自动从SVN上下载最新代

码,然后编译打包到你指定的位置。同时在刚才你启动AGENT的命令行窗口,会

显示下载,编译、打包的整个过程的状态信息,如果编译过程有问题的话,我们

可以从这个状态信息中作出诊断。当然,如果你想获得整个过程的精确的信息的

话,你可以查询日志。日志放在CI机的安装包“ci-master”中的“userdata”

中的你的工程的"logs"目录下,这个日志记录了ANT脚本每一行的运行情况。编

译的过程也是对代码 进行检查的过程,如果代码有问题,编译的时候就会报错

,而且它会提示你准确的位置及相应的错误信息,很容易定位。我们就是先把最

新代码在本地编译一下,然后才上传到F7特性主干上的。

    由于在这过程中我们的AGENT坏了,之后用的是特性组的AGENT,没有SVN权

限,我采取的是手动编译方法。即在规定的位置按照规范建一个自己的工程,然

后从本地SVN上拷去我们的最新工程,在工程的根目录下运行“build.xml”文件

,完成编译打包。当然如果你有权限,也可以用"SVN UP"从SVN上更新你的工程

   如果你只想编译下你的代码,或者打一个jar包,你可以也在“Eclipse”中

运行ANT脚本来实现,或者在DOS命令行进入你的工程运行“BUILD.XML"也可以。

   下面我想谈下编译打包的核心——脚本。

   编译打包过程如下:先运行ANT脚本,编译JAVA源文件,打JAR包,运行Shell

命令打TAR包,再出RPM包。我们通常将安装脚本打到包里,然后在安装RPM包时

,自动会创建数据库,卸载时自动删除数据库。当然,所有的这些操作也可以手

动在命令行运行(ANT脚本为“ ant -f  build.xml",shell脚本为 "sh

install.sh",  rpm为  "pmbuild -ba  *.spec",运行shell脚本时加上-x可以

看到状态信息)

   用到的脚本大的有两个,完整的有六个:

  1.ant脚本,即上面说的build.xml。

    ant 脚本很有用,处理编译外,我们可以用它来打jar包,tar包、war包、

还可以运行测试用例,抽取JAVA DOC 文档等。

 

  2.spec脚本,用来打RPM包,调用安装和卸载数据库install.sh和install.sh

脚本。

 

  3. install.sh,安装数据库的shell脚本。

 

  4.uninstall.sh,卸载数据库的shell脚本。

 

  5.install.sql,创建数据库的SQL脚本,包含我们常用的建表语句,插入数据

的语句等。

 

  6.unstall.sql,下载数据库的SQL脚本,包含我们删除数据库,删除表及数据

的语句等。

 

下面给出连个脚本的例子供大家参考(参数做了一些改动,仅供参考):

 

build.xml示例

 

---------------------------------------------------------------------

---------------------------------------------------------------------

---------------------------------------------------------------------

-------

<?xml   version="1.0"   encoding="UTF-8"?>
<project name="myProject1" default="dist" basedir=".">
 <description>
  myProject1 build file.
 </description>

 <property name="service.version" value="1.0.0"/>
 <echo message="the service.version is ${service.version}" />
 <property name="src" location="src" />
 <property name="test" location="test" />
 <property name="build" location="build" />
 <property name="dist" location="dist" />
 
 
 <property name="project.dir.dist.jar"

value="${dist}/development/myProject1"/>
 <property name="project.dir.webapps.lib"

value="${dist}/aaa/bbb/webapps/bbb/WEB-INF/lib"/>
 <property name="project.dir.webapps.modules"

value="${dist}/aaa/bbb/webapps/bbb/WEB-INF/modules"/>
 <property name="project.rpm.dir"

value="${dist}/release/aaa/installation/bbb/xm/01.myProject1"/>
 
 <property name="xm_ms.tar.name" value="bbb-myProject1.tar.gz" />
 <property name="xm_ms.rpm.name" value="bbb-myProject1-*.x86_64.rpm"

/>
 <property name="xm_ms.spec.name" value="bbb-myProject1.spec" />


<target name="init">
<tstamp />
<mkdir dir="${build}" />
<mkdir dir="${dist}" />

<!--get all the dependent files  -->


</target>

<!--
Compile
-->
<target name="compile" depends="init" description="compile the source

">
<path id="lib.path.ref">
<!-- please include all the jar package -->
<fileset dir="WebContent/WEB-INF/lib" includes="*.jar" />
</path>

<javac srcdir="${src}" destdir="${build}" encoding="UTF-8"

compiler="javac1.6" source="1.6" includeantruntime="no">
<classpath refid="lib.path.ref" />
</javac>

<!--
Description: copy *.class files to Findbugs working path.
    -->
<property name="findbugs.class.path" location="WebContent/WEB-

INF/classes" />
<copydir src="${build}" dest="${findbugs.class.path}"

forceoverwrite="true" >
<exclude name="**.svn/**"/>
</copydir>

</target>

<!--
dist
-->
<target name="dist" depends="compile" description="generate the

distribution" >

<jar

jarfile="${project.dir.dist.jar}/com.aaa.myProject1.${service.version}

.jar" basedir="${build}"/>

<!-- build the directory of the tar.gz -->
<mkdir dir="${dist}/aaa/bbb/webapps/bbb/WEB-INF"/>

<mkdir dir="${dist}/aaa/bbb/services/xm/plugin/conf"/>
<mkdir dir="${dist}/aaa/bbb/services/xm/plugin/bin"/>
<mkdir dir="${dist}/aaa/bbb/services/xm/plugin/lib"/>
<delete dir="/var/locallog/caaaonlog/om/xm" failonerror="false" />
<mkdir dir="/var/locallog/caaaonlog/om/xm"/>

<!--copy all the depends JARs and property files to dist directory -->
<copy

file="${project.dir.dist.jar}/com.aaa.myProject1.${service.version}.ja

r"

tofile="${project.dir.webapps.lib}/com.aaa.myProject1.${service.versio

n}.jar" overwrite="true"/>


<copy todir="${dist}/aaa/bbb/services/xm/plugin/conf"

overwrite="true">
<fileset dir="./config/xmms" >
<include name="*.*" />
<exclude name="**.svn/**" />
</fileset>
</copy>

<copy todir="${project.dir.webapps.lib}" overwrite="true">
<fileset dir="lib" >
 <include name="castor-0.9.7-xml.jar" />
<include name="interface1.0.1.jar" />
<include name="jxl.jar" />
<include name="spring-oxm-1.0-m2.jar" />
<include name="spring-xml-1.0-m2.jar" />
<include name="xercesImpl.jar" />
<include name="xercesSamples.jar" />
<include name="xml-apis.jar" />
<include name="xmlParserAPIs.jar" />
<exclude name="**.svn/**" />

 </fileset>
 </copy>


<copy file="./config/xmms/xmms-config.xml"

tofile="${project.dir.webapps.modules}/xmms-config.xml"

overwrite="true"/>


<!--copy file="./WebContent/WEB-INF/modules/xmms-config.xml"

tofile="${dist}/aaa/bbb/webapps/bbb/WEB-INF/modules/xmms-config.xml"/>

<!--copy the .SPEC install.sh and uninstall.sh to install Dir -->
<!--<copy todir="${dist}/aaa/bbb/webapps/bbb/WEB-INF/install">
<fileset dir="./script"/>
</copy>

<!--CLEAN THE RPM ENVIRONTMENT-->
<exec executable="sh" osfamily="unix" resultproperty="ERRORLEVEL">
<arg value="-c"/>
<arg value="cd dist;rm /usr/src/packages/RPMS/x86_64/${xm_ms.rpm.name}

-R; rm /usr/src/packages/SOURCES/${xm_ms.tar.name} -R ; tar czvf

${xm_ms.tar.name} aaa; cp ${xm_ms.tar.name}

/usr/src/packages/SOURCES;cp ../script/${xm_ms.spec.name}

/usr/src/packages/SPECS;rm -r aaa"/>
<arg value="-p"/>
</exec>

 
 <if>
<not>
<equals arg1="${ERRORLEVEL}" arg2="0" trim="true" />
</not>
<then>                   
<fail message="prepare for tar.gz failed."/>
</then>
</if>

<!-- BEGIN TO MAKE THE RPM PACKAGE-->

<exec executable="sh" osfamily="unix" resultproperty="ERRORLEVEL">
<arg value="-c"/>
<arg value="cd /usr/src/packages/SPECS; rpmbuild -ba

${xm_ms.spec.name} &amp;&amp; mv /usr/src/packages/RPMS/x86_64/

${xm_ms.rpm.name} ${dist}"/>
<arg value="-p"/>
</exec>

<if>
<not>
<equals arg1="${ERRORLEVEL}" arg2="0" trim="true" />
</not>
<then>                   
<fail message="make rpm package failed."/>
</then>
</if>

<!-- modify the output directory-->

<exec executable="sh" osfamily="unix" resultproperty="ERRORLEVEL">
<arg value="-c"/>
<arg value="cd dist; mkdir -p development; mv ${xm_ms.tar.name}

development; mkdir -p release/aaa/installation/bbb/xm/01.myProject1;

mv ${xm_ms.rpm.name} release/aaa/installation/bbb/xm/01.myProject1"/>
<arg value="-p"/>
</exec>

<!--copy the *.rpm package to ./dist/rpm -->

<mkdir dir="${dist}/rpm"/>
<copy todir="${dist}/rpm" overwrite="true">
<fileset dir="${project.rpm.dir}" includes="${xm_ms.rpm.name}">
</fileset>
</copy> 


<if>
<not>
<equals arg1="${ERRORLEVEL}" arg2="0" trim="true" />
</not>
<then>                   
<fail message="modify the output dir of myProject1 error"/>
</then>
</if>

</target>
<target name="clean" description="clean up">
<delete dir="${build}" />
<delete dir="${dist}" />
</target>
</project>
---------------------------------------------------------------------

---------------------------------------------------------------------

---------------------------------------------------------------------

--------

 

spec脚本示例:

 

---------------------------------------------------------------------

---------------------------------------------------------------------

---------------------------------------------------------------------

---------

 

Summary: This is a myProject1 RPM Package.
Name: myProject1
Version: 1.0.0
Release: 1
License: GPL
Group: My Home
Source: %{name}.tar.gz
Buildroot: %{_tmppath}/%{name}-%{version}
Url: www.xxx.edu.cn
Packager: test
Autoreq: 0

%define aaa_path /opt/aaa
%define prefixdir /opt/
%define log_file_dir /var/locallog/commonlog/om/xm/install/
%define log_file %{log_file_dir}myProject1.log
%define services_xm_dir %{aaa_path}/bbb/services/xm/
%define install_shell_dir %{aaa_path}/bbb/services/xm/plugin/conf
%define username bbb
%define usergroup aaa  

%description
This package is a myProject1 RPM/

%prep
mkdir -p %{log_file_dir}
touch %{log_file}
echo -e "\n###############################################" >> %

{log_file}
date >> %{log_file}
echo -e "Pack $RPM_PACKAGE_NAME start." >> %{log_file}
echo -e "\nprepare to packaging..." >> %{log_file}
%setup -c %{name}-%{version}

%build
echo -e "\nbuilding..." >> %{log_file}

%install
echo -e "\ninstalling..." >> %{log_file}
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT%{prefixdir}/
install -d -m 755 $RPM_BUILD_ROOT%{prefixdir}/

cp -a * $RPM_BUILD_ROOT%{prefixdir}/
chmod 755 $RPM_BUILD_ROOT%{prefixdir} -R

 

%clean
echo -e "\ncleaning..." >> %{log_file}
rm -rf $RPM_BUILD_ROOT
rm -rf $RPM_BUILD_DIR/%{name}-%{version}

echo -e "\nPack $RPM_PACKAGE_NAME end." >> %{log_file}
date >> %{log_file}
echo -e "###############################################" >> %

{log_file}

%pre
mkdir -p %{log_file_dir}
touch %{log_file}
echo -e "\n###############################################" >> %

{log_file}
date >> %{log_file}
echo -e "Install $RPM_PACKAGE_NAME start." >> %{log_file}
echo -e "\npre processing..." >> %{log_file}
getent group aaa >/dev/null || groupadd -r aaa
getent passwd bbb >/dev/null || useradd -c "bbb" -s /bin/bash  -g aaa

-r bbb 2> /dev/null
echo -e "\ninstalling..." >> %{log_file}


##安装后执行
%post
echo -e "\npost processing..." >> %{log_file}
echo -e "importing xmms-config.xml..." >> %{log_file}

username=%{username}
usergroup=%{usergroup}
xmconfigdir=%{install_shell_dir}

chown -R "${username}":"${usergroup}" %{prefixdir}

aaa/bbb/install/caaaon/import_modules.sh 2>> %{log_file}
/bin/sh  %{prefixdir}aaa/bbb/install/caaaon/import_modules.sh

modules/xmms-config.xml 2>> %{log_file}
chown -R "${username}":"${usergroup}" %{prefixdir}

aaa/bbb/install/caaaon/import_modules.sh 2>> %{log_file}
chown -R "${username}":"${usergroup}" %{prefixdir}

aaa/bbb/webapps/bbb/WEB-INF/modules-config.xml 2>> %{log_file}
chmod 755 %{prefixdir}aaa/bbb/webapps/bbb/WEB-INF/modules-config.xml

2>> %{log_file}
chown -R "${username}":"${usergroup}" %{xmconfigdir} 2>> %{log_file}
chmod 755 -R %{xmconfigdir} 2>> %{log_file}

chown -R "${username}":"${usergroup}" /var/locallog/caaaonlog/om/xm/

2>> %{log_file}
chown -R "${username}":"${usergroup}" %{services_xm_dir} 2>> %

{log_file}
chmod 755 -R /var/locallog/caaaonlog/om/xm/ 2>> %{log_file}
chmod 755 -R %{services_xm_dir} 2>> %{log_file}

 

## run install shell to create database table
chmod u+x %{install_shell_dir}/install_xm.sh 2>> %{log_file}
%{install_shell_dir}/install_xm.sh

 

## print log
echo -e "\nlist dir:\n" >> %{log_file}
ls -lR %{prefixdir}aaa/bbb/webapps/bbb/WEB-INF/ >> %{log_file} 2>> %

{log_file}
echo -e "\nInstall $RPM_PACKAGE_NAME end." >> %{log_file}
date >> %{log_file}
echo -e "###############################################" >> %

{log_file}

##卸载前执行脚本程序(preun)开始执行
%preun
echo -e "\n###############################################" >> %

{log_file}
date >> %{log_file}
echo -e "Uninstall $RPM_PACKAGE_NAME start." >> %{log_file}

username=%{username}
usergroup=%{usergroup}

## run uninstall shell to drop database table
chmod u+x %{install_shell_dir}/uninstall_xm.sh 2>> %{log_file}
%{install_shell_dir}/uninstall_xm.sh

chown -R  "${username}":"${usergroup}" %{prefixdir}

aaa/bbb/install/caaaon/export_modules.sh 2>> %{log_file}
chown -R "${username}":"${usergroup}" %{aaa_path}/bbb/webapps/bbb/WEB

-INF/modules-config.xml
/bin/sh /opt/aaa/bbb/install/caaaon/export_modules.sh modules/xmms-

config.xml 2>> /dev/null
chown -R  "${username}":"${usergroup}" %{prefixdir}

aaa/bbb/install/caaaon/export_modules.sh 2>> %{log_file}
chown -R "${username}":"${usergroup}" %{aaa_path}/bbb/webapps/bbb/WEB

-INF/modules-config.xml
chmod 755 %{prefixdir}aaa/bbb/webapps/bbb/WEB-INF/modules-config.xml

2>> %{log_file}


#卸载后执行脚本程序(postun)开始执行
%postun
## print log
echo -e "\nlist dir:\n" >> %{log_file}
ls -lR %{prefixdir}aaa/bbb/webapps/bbb/WEB-INF/ >> %{log_file} 2>> %

{log_file}

echo -e "-----------------------------------------------------------"

>> %{log_file}
chown -R "${username}":"${usergroup}" %{prefixdir}

aaa/bbb/webapps/bbb/WEB-INF/ 2>> %{log_file}
chmod -R 755 %{prefixdir}aaa/bbb/webapps/bbb/WEB-INF/ 2>> %{log_file}
echo -e "-----------------------------------------------------------"

>> %{log_file}
date >> %{log_file}
echo -e "Uninstall $RPM_PACKAGE_NAME end." >> %{log_file}
echo -e "###############################################" >> %

{log_file}

%files
%defattr(-, %{username}, %{usergroup})
%{prefixdir}aaa/bbb/webapps/bbb/WEB-INF/
%{prefixdir}aaa/bbb/services/xm/
%attr(755, %{username}, %{usergroup})

%changelog

 

 

原创粉丝点击