持續整合 (Continuous Integration, CI) 的核心價值在於「頻繁整合、快速回饋、早期發現缺陷」。本教學以 Hudson CI 伺服器、Ant 建構腳本、Subversion 版控 為鐵三角,手把手建構一條包含編譯、單元測試 (JUnit)、靜態分析 (PMD, FindBugs)、趨勢圖表、失敗通知的完整自動化管線。
build.xml 定義可重複、無手工依賴的編譯/測試/檢查/打包流程。推薦開發節奏:更新沙箱 → 修改代碼 → 撰寫測試 → 本地跑建構 (確保綠燈) → 更新再跑 → 提交。CI 只是安全網,本地驗證才是第一道防線。
<property name="lib.dir" value="${basedir}/lib" />
<property name="source.dir" value="src/java" />
<property name="test.source.dir" value="test/java" />
<property name="test.pattern" value="**/*Test.java" />
<target name="init">
<mkdir dir="${classes.dir}" />
<mkdir dir="${test.classes.dir}" />
<path id="build.classpath">
<fileset dir="${lib.dir}"><include name="**/*.jar" /></fileset>
</path>
</target>
<target name="compile-source" depends="init">
<javac destdir="${classes.dir}" srcdir="${source.dir}" classpathref="build.classpath" />
</target>
<target name="compile-tests" depends="compile-source">
<javac destdir="${test.classes.dir}" srcdir="${test.source.dir}" classpathref="build.classpath">
<pathelement path="${classes.dir}" />
</javac>
</target>
<target name="test" depends="compile-tests">
<mkdir dir="${test.report.dir}" />
<junit printsummary="on" fork="true" haltonfailure="true">
<formatter type="xml" />
<classpath><path refid="build.classpath" /><pathelement path="${test.classes.dir}" /><pathelement path="${classes.dir}" /></classpath>
<batchtest todir="${test.report.dir}"><fileset dir="${test.source.dir}"><include name="${test.pattern}" /></fileset></batchtest>
</junit>
</target>
<target name="pmd" depends="init">
<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="build.classpath" />
<pmd>
<ruleset>rulesets/basic.xml</ruleset> <!-- 依需求選擇規則集 -->
<formatter type="xml" toFile="${default.target.dir}/pmd_report.xml" />
<fileset dir="${source.dir}"><include name="**/*.java" /></fileset>
</pmd>
</target>
<target name="jar" depends="test">
<jar jarfile="${default.target.dir}/project.jar" basedir="${classes.dir}" />
</target>
<target name="findbugs" depends="jar">
<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" classpathref="build.classpath" />
<findbugs output="xml" outputFile="${default.target.dir}/findbugs.xml">
<sourcePath path="${source.dir}" />
<class location="${default.target.dir}/project.jar" />
</findbugs>
</target>
java -jar hudson.war (內建 Winstone 容器),瀏覽 https://localhost:8080。Manage Hudson → Configure System,指定 Ant 安裝路徑、郵件伺服器 (SMTP)、Subversion 認證 (/scm/SubversionSCM/enterCredential 頁面輸入倉庫 URL、建構專用帳號 buildmaster)。New Job → Build a free-style software project,名稱 Solar Project。| 區塊 | 關鍵設定 | 說明 |
|---|---|---|
| 原始碼管理 | Subversion → Repository URL | 如 https://scm.acme.com/svn-repo/main/trunks/solar-ci |
| 建構觸發 | Poll SCM → Schedule: * * * * * (每分鐘) | 示範用高頻,生產建議 H/5 * * * * (每 5 分) |
| 建構步驟 | Invoke Ant → Targets: test (含編譯) | 或 pmd,findbugs 串聯 |
| 建構後動作 | Publish JUnit test result report → solar-ci/target/test-reports/*.xml | 啟用測試趨勢圖 |
| 建構後動作 | E-mail Notification / RSS | 失敗通知開發團隊 |
Publish FindBugs analysis results,指定 **/findbugs.xml,設定 閾值 (如優先級 1+2 超過 5 個判定不穩定)。pmd_report.xml 路徑。安裝插件:Manage Hudson → Manage Plugins → Advanced → Upload .hpi → 重啟 Hudson。
ant test → JUnit 2 測試通過 → 趨勢圖顯示 2 Tests。關鍵指標儀表板:Hudson 首頁專案列表的「太陽/雲朵」圖示即時反映建構穩定度與測試穩定度。
CI 不是裝個 Hudson 就算數,核心在於 可重複的建構腳本、自動化的品質檢查、可視化的趨勢回饋。本教學提供的 Ant 模組化範本、Hudson 配置清單、插件整合方案,可直接套用至專案。記住:建構腳本的可靠度決定 CI 的成敗——任何環境依賴、硬編碼路徑、手工步驟都是 CI 的大敵。立即建立你的品質防線,讓缺陷無處遁形。