Continuum Maven2 & Continuum 持续整合

liuxue.gu@hotmail.com · 2009年03月10日 · 26 次阅读

作者:kylin 出处:http://www.cnblogs.com/kylindai/archive/2007/05/05/736454.html Maven2 & Continuum 持续整合 (1) 经过几天努力,终于将 Maven2 & Continuum 持续整合环境搭建成功,记录在这里。

本文搭建的环境目标如下:

  1. 搭建 maven 环境,并配置好 maven-proxy
  2. 搭建 continuum 环境

整个环境包括服务器环境和开发人员环境: 服务器:Redhat AS4 Update4 开发环境:WindowsXP

服务器上安装 maven, maven-proxy, subversion, continuumn 开发环境上安装 eclipse, maven-eclipse-plugin, svn-eclipse-plugins

先说 maven 的环境吧: 服务器端的安装 安装 maven 需要先装好 JDK,我安装的是 JDK 1.6,安装好后设置好 JAVA_HOME 和 CLASSPATH 环境变量。

  1. 下载 maven2 & maven-proxy (1) maven 下载 下载地址:[url=http://maven.apache.org/download.htmlhttp://maven.apache.org/download.html[/url]] 下载最新的 release 版本 maven-2.0.6 (2) maven-proxy 下载 下载地址:[url=http://maven-proxy.codehaus.org/http://maven-proxy.codehaus.org/[/url]] 下载最新的 release 版本 maven-proxy 0.2

  2. 安装 maven & maven-proxy (1) mavne 安装

    cd /opt

    tar xvfz maven-2.0.6-bin.tar.gz

    cd /usr/local

    ln -s /opt/maven-2.0.6 maven

在 profile 里配置环境变量 MAVEN_HOEM=/usr/local/maven PATH=$PATH:MAVEN_HOME/bin export MAVEN_HOME PATH

测试 maven 安装是否成功

mvn --version

显示 Maven version: 2.0.6 表示安装成功。

创建 /var/maven/repository 目录,用于保存本地的库文件和插件文件

cd /var

mkdir maven

chmod 777 maven

cd maven

mkdir repository

chmod 777 repository

修改全局 maven setting.xml 修改 MAVEN_HOME/conf/seeting.xml

将 localRepository 的路径指向 /var/maven [size=13px] <!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ~/.m2/repository --> [color=#ff00][b]/var/maven/repository[/b]

修改 mirrors,添加镜像服务器 maven-proxy 假设镜像服务器 maven-proxy IP 192.168.1.10,域名 maven-proxy.gehouse.cn (如何配置域名,参考我的另一篇文章 [color=#1a8bc8] RedHat AS4 Update4 DNS (bind 9) 配置 [url=http://www.cnblogs.com/kylindai/archive/2007/04/16/716052.htmlhttp://www.cnblogs.com/kylindai/archive/2007/04/16/716052.html[/url]) [size=13px] <!-- mirror | Specifies a repository mirror site to use instead of a given repository. The repository that | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used | for inheritance and direct lookup purposes, and must be unique across the set of mirrors. | --> [color=#ff00][b] maven-proxy.gehouse.cn[/b] [color=#ff00][b]*[/b] [color=#ff00][b] maven-proxy on gehouse.cn[/b] [color=#ff00][b]http://maven-proxy.gehouse.cn:9999/repository/b][

(2) maven-proxy 的安装 (在 maven-proxy.gehouse.cn 的机器上安装)

cd /opt

mkdir maven-proxy-0.2

cd /usr/local

ln -s /opt/maven-proxy-0.2 maven-proxy

cd maven-proxy

unzip maven-proxy-standalone-0.2.zip

得到 maven-proxy-standalone-0.2-app.jar

创建镜像服务器缓存 maven 库文件和 maven 插件的目录 # cd /usr/local/maven-proxy

mkdir target

cd target

mkdir repo

mkdir repo-local

编辑 maven-proxy.properties 配置文件

vi maven-proxy.properties

[size=13px]################ GLOBAL SETTINGS

This is where maven-proxy stores files it has downloaded

repo.local.store=[color=#ff00][b]./target/repo[/b]

#The port to listen on - not used if loaded as a webapp port=[b] 9999 [/b] #This is the base area that all files are loaded from. While it is possible to leave this blank, this behaviour #is deprecated and will be disabled in version 2.0. There are too many namespace conflicts caused by not using #a prefix. #The repository will be shown at http://localhost:9999/repository/ #for the .war loaded into a webapp server, the default prefix is "repository" (edit the web.xml to change)

As maven doesn't like a trailing slash, this address shouldn't have one either.

prefix=repository

#This is the simple date format used to display the last modified date while browsing the repository. lastModifiedDateFormat=yyyy/MM/dd HH:mm:ss

################ SNAPSHOT HANDLING #If you want the proxy to look for newer snapshots, set to true snapshot.update=true

################ M2 METADATA HANDLING #If you want the proxy to prevent looking for newer metadata, set to false (default is true) #metadata.update=false

################ M2 POM HANDLING #If you want the proxy to look for newer POMs, set to true (default is false) pom.update=true

################ PROMOTION HANDLING

***** NOT CURRENTLY IMPLEMENTED *****

#Promotion describes the process by which new artifacts are loaded to global maven-proxy repository. It

is designed to be used by "higher security installations" that do not want to acquire artifacts from

remote repositories without approval.

# #If promotion handling is enabled, then the proxy will not download remote artifacts without permission

(local repositories with copy=false are considered to be local)

# #Permission to download is granted via the Promotion menu which will be enabled

when promotion handling is enabled.

# #If promotion is false, artifacts are sourced from any repository as per normal. # #Promotion and snapshots: If promotion is enabled, snapshots are not downloadable. The concept of using

a snapshot in a production build (which is primarily what promotion is for) is counterintuitive.

## promotion=false

################ WEB INTERFACE

This defines the absolute URL the server should use to identify itself.

This can often be determined automatically, but we recommend you specify

it explicitly to prevent problems during startup.

The prefix will be added to this for the actual repository

i.e. proxy available at http://localhost:9999/, repository at http://localhost:9999/repository

serverName=[b]http://maven-proxy.gehouse.cn:9999/b][

#If true, the repository can be browsed browsable=true

#If true, the repository can be searched searchable=true

#Not currently implemented. Will allow webdav access to the repository at some point. webdav=true

#Stylesheet - if configured, will override the default stylesheet shipped with maven-proxy - absolute URLs only #eg. /maven-proxy/style.css, http://www.example.com/style.css stylesheet=/maven-proxy/style.css

#bgColor / bgColorHighlight are replaced in the built in stylesheet to produce a simple color scheme. #If a stylesheet is set, these are not used. bgColor=#14B bgColorHighlight=#94B

#rowColor / rowColorHighlight are replaced in the built in stylesheet to produce a simple color scheme. #If a stylesheet is set, these are not used. rowColor=#CCF rowColorHighlight=#DDF

################ PROXIES #This is just a hack, it should auto discover them [b]#[/b] proxy.list=one,tow,three

#Unauthenticated proxy proxy.one.host=proxy1.example.org proxy.one.port=3128

#Authenticated proxy proxy.two.host=proxy2.example.org proxy.two.port=80 proxy.two.username=username2 proxy.two.password=password2

#Authenticated proxy proxy.three.host=proxy3.example.net proxy.three.port=3129 proxy.three.username=username3 proxy.three.password=password3

################# REPOSITORIES #This is not just a hack, it specifies the order repositories should be checked #Note that the proxy adds a "/" which is why the urls aren't suffixed with a "/" [b]#[/b] repo.list=local-repo,www-ibiblio-org,dist-codehaus-org,private-example-com repo.list=[b] local-repo,repo1-maven-org,www-ibiblio-org,dist-codehaus-org[/b]

#local-store

The local store represents a location that local jars you host can be located.

This could also be achieved by having a local http repository, but this is less cumbersome

repo.local-repo.url=file:///./target/repo-local repo.local-repo.description=Super Secret Custom Repository #If copy is true, jars are copied from the store to the proxy-repo. Only configurable for file:/// repos repo.local-repo.copy=false #If hardfail is true, any unexpected errors from the repository will cause #the client download to fail (typically with a 500 error) repo.local-repo.hardfail=true #Don't cache a file repository repo.local-repo.cache.period=0

[b]#repo1.maven.org repo.repo1-maven-org.url=http://repo1.maven.org/maven2 repo.repo1-maven-org.description=repo1.maven.org #repo.repo1-maven-org.proxy=one repo.repo1-maven-org.hardfail=false repo.repo1-maven-org.cache.period=360000 repo.repo1-maven-org.cache.failures=true [/b] #www.ibiblio.org repo.www-ibiblio-org.url=http://www.ibiblio.org/maven repo.www-ibiblio-org.description=www.ibiblio.org [b]#[/b] repo.www-ibiblio-org.proxy=one repo.www-ibiblio-org.hardfail=true #Cache this repository for 1 hour repo.www-ibiblio-org.cache.period=3600 repo.www-ibiblio-org.cache.failures=true

#dist.codehaus.org repo.dist-codehaus-org.url=http://dist.codehaus.org [b]#[/b] repo.dist-codehaus-org.proxy=two repo.dist-codehaus-org.hardfail=false repo.dist-codehaus-org.cache.period=3600 repo.dist-codehaus-org.cache.failures=true

#private.example.com repo.private-example-com.url=http://private.example.com/internal repo.private-example-com.description=Commercial In Confidence Repository repo.private-example-com.username=username1 repo.private-example-com.password=password1 repo.private-example-com.proxy=three repo.private-example-com.cache.period=3600

注意阅读这个配置文件,里面定义了 maven-proxy 服务器的端口,缓存库文件的路径,被镜像的服务器的列表等。

编辑启动 maven-proxy 的脚本 startup.sh

vi startup.sh

[size=13px] java - jar maven - proxy - standalone - 0.2 - app.jar maven - proxy.properties >/ dev / [color=#00ff] null &

chmod +x startup.sh

启动 maven-proxy.sh

./startup.sh

在开发环境里的浏览器地址栏输入 [url=http://maven-proxy.gehouse.cn:9999/repositoryhttp://maven-proxy.gehouse.cn:9999/repository[/url]] 可以看到这个 maven-proxy 的页面,说明安装成功。

上一篇文章写了 maven & maven-proxy 的安装和配置 这篇文章来说说 continumm 持续整合的安装配置,还是在服务器端作安装和配置。

continuum 能自动根据 maven2 的工程 pom.xml 文件,定时从 svn 服务器上下载该工程的代码,运行 build 任务,运行 test,并将运行结果通过邮件和 MSN 的方式通知开发人员。如果代码库没有更新,则不作持续整合,功能相当强。

  1. 下载 continuum 下载地址:[url=http://maven.apache.org/continuum/download.htmlhttp://maven.apache.org/continuum/download.html[/url]] 下载 continuum-1.0.3-bin.tar.gz

  2. 安装 continuum (1) 创建 ci 用户,用此用户来完成持续整合的各个任务

groupadd ci

useradd ci -g ci

以 ci 用户登录,编辑.bash_profile,添加环境变量,用于 ci 用户能执行 maven 和 subversion MAVEN_HOME=/usr/local/maven SVN_HOME=/usr/local/subversion PATH=$PATH:$MAVEN_HOME/bin:SVN_HOME/bin export MAVEN_HOME SVN_HOME PATH

增加 maven 的本地配置,maven 的 setting 有全局和本地的 2 个配置文件,本地用户使用 maven,依据 $HOME/.m2/setting.xml 的配置。 简单的配置方法,可以将上篇文章中的 setting.xml 拷贝过来即可,这个配置已经配好了使用 maven-proxy 来获得代码库。

$ cd $ mkdir .m2 $ cd .m2 $ cp /usr/local/maven/conf/setting.xml .

这样 ci 用户就可以使用 $HOME/.m2/setting.xml 中的配置来使用 maven 了,当 maven 需要下载依赖的库文件的时候,会从 maven-proxy 上下载,由于 maven-proxy 部署在局域网内,大大的提高了代码库的下载速度。其二 setting.xml 中配置了 localRepository 的路径,这样某个用户下载过后,其他用户也不用再下载了。

(2) 安装 continuum $ tar xvfz continuum-1.0.3-bin.tar.gz 得到 continuum-1.0.3 目录 第一次运行 continuum $ cd continuum-1.0.3/bin/linux $ ./run.sh start

看 $HOME/continuum-1.0.3/logs/*.log,第一次运行会失败,这是正常的,因为 continuum 的自带的数据库没有建好,第一次运行会自动创建库。 第二次运行 continuum $ ./run.sh stop $ ./run.sh start

看 $HOME/continuum-1.0.3/logs/*.log, 看到部署了 application continuum 的信息,默认端口 8080。 我们需要修改一下这个端口,我们还要修改其他配置,如邮件服务器,邮件发送者,MSN 发送者等。 $ ./run.sh stop $ cd ../../apps $ ll 看到 drwxrwxr-x 9 ci ci 4096 May 2 16:35 continuum -rw-r--r-- 1 ci ci 9050570 May 2 18:56 continuum-plexus-application-1.0.3.jar

$ cd continuum $ cd conf $ vi application.xml

修改端口,注意红色黑体字部分 找到 webapps 一节,修改端口为 8090。 [align=left] [/align][size=13px] < services > < service > < id > jetty </ id > < configuration > < webapps > < webapp > < file > ${plexus.home} / lib / continuum - web - 1.0 . 3 .jar </ file > < context >/ continuum </ context > < extraction - path > ${plexus.home} / webapp </ extraction - path > < listeners > < http - listener > < port > [b] 8090[/b] </ port > </ http - listener > <!-- < proxy - http - listener > < port > [b] 8090[/b] </ port > < proxy - host > localhost </ proxy - host > < proxy - port > 80 </ proxy - port > </ proxy - http - listener > --> </ listeners > </ webapp > </ webapps > </ configuration > </ service >

[align=left] 设置邮件 SMTP 服务器参数,主要修改见红色黑体字部分。 设置 from-mailbox 发件人邮箱,这里是 [email=ci.gehouse@163.com] ci.gehouse@163.com[/email] 设置 smtp-host SMTP 主机名,这里是 smtp.163.com 设置 smtp 发信认证的用户名和密码 [email=ci.gehouse@163.com] ci.gehouse@163.com[/email],密码需要使用正确的,这里隐去了,用 *代替。 去掉了 smtp 的 ssl 设置 [/align][align=left] [/align][size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ <!-- [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ | The mail notifier [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ |--> [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ org.codehaus.plexus.notification.notifier.Notifier [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ mail [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ org.apache.maven.continuum.notification.mail.MailContinuumNotifier [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ org.codehaus.plexus.velocity.VelocityComponent [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ org.apache.maven.continuum.store.ContinuumStore [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ org.codehaus.plexus.mailsender.MailSender [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ org.apache.maven.continuum.configuration.ConfigurationService [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [b] ci.gehouse@163.com[/b] [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [b] ci.gehouse[/b] [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ EEE, d MMM yyyy HH:mm:ss Z [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ true [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ false [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ org.codehaus.plexus.notification.RecipientSource [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ org.apache.maven.continuum.notification.ContinuumRecipientSource [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ <!-- [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ Setting this propery will make Continuum send all emails to [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ this address instead the address specified in the project [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ configuration [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ --> [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ org.codehaus.plexus.mailsender.MailSender [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ org.codehaus.plexus.mailsender.javamail.JavamailMailSender [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [color=#ff00][b] smtp.163.com[/b] [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ 25 [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ com.sun.net.ssl.internal.ssl.Provider [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [color=#ff00][b] ci.gehouse@163.com[/b] [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [b]****[/b] [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [b] false[/b] [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [align=left] 设置 MSN 通知的参数,注意红色黑体字部分。 信息发送人 from-address,这里是 ci.gehouse@hotmail.com 信息发送人密码 from-password,这里隐去了,用代替 设置好后,ci 每次 build 后,会以 ci.gehouse@hotmail.com 登录 MSN,然后给开发人员发送 build 任务执行的结果,并给出查看结果的连接 url.[/align][align=left] [/align][size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ <!--
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ | The MSN notifier [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ |-->
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < component >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < role > org.codehaus.plexus.notification.notifier.Notifier </ role >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < role - hint > msn </ role - hint >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < implementation > org.apache.maven.continuum.notification.msn.MsnContinuumNotifier </ implementation >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < requirements >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < requirement >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < role > org.codehaus.plexus.msn.MsnClient </ role >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ </ requirement >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < requirement >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < role > org.apache.maven.continuum.configuration.ConfigurationService </ role >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ </ requirement >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < requirement >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < role > org.apache.maven.continuum.store.ContinuumStore </ role >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ </ requirement >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ </ requirements >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < configuration >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < alwaysSend > [color=#00ff] false </ alwaysSend >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < from - address > [color=#ff00][b] ci.gehouse@hotmail.com[/b] </ from - address >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ < from - password >[color=#ff00][b]
*********[/b] </ from - password >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ </ configuration >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ </ component >
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][ [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif/img][

配置修改好后,可以在此运行 continuum。 创建工作目录,编译目录,部署目录 $ cd $ mkdir build work deploy

第三次运行 continuum $ cd continuum-1.0.3/bin/linux $ ./run.sh start

给 continuum 服务器配置域名 ci.gehouse.cn

在开发环境浏览器地址栏输入 http://ci.gehouse.cn:8090/continuum 可以看到 continuum 的页面,说明安装成功。 第一次访问 [url=http://ci.gehouse.cn:8090/continuumhttp://ci.gehouse.cn:8090/continuum[/url]] 会提示添加管理员用户,设置管理员用户密码 用管理员用户登录后,会提示设置项: Working Directory 设置为 /home/ci/work Build Output Directory 设置为 /home/ci/build Deployment Repository Directory 设置为 /home/ci/deploy Base URL 设置为 [url=http://ci.gehouse.cn:8090/continuum/servlet/continuumhttp://ci.gehouse.cn:8090/continuum/servlet/continuum[/url]]

其他设置如公司名,公司 LOGO 等,设好就可以了。 下篇文章,我们说说,创建一个工程,让后提交给 continuum,让它来完成持续整合。

需要 登录 后方可回复。