手動構建、部署、監控不僅低效,更引入不可控變數。自動化將重複性任務交給腳本與工具,人類專注於「寫高品質代碼」這類高價值活動。
<project name="whizbang" basedir="." default="test">
<property name="build.prod.dir" location="build/prod"/>
<property name="build.test.dir" location="build/test"/>
<property name="src.dir" location="src"/>
<property name="test.dir" location="test"/>
<property name="vendor.lib.dir" location="vendor/lib"/>
<path id="project.classpath">
<pathelement location="${build.prod.dir}"/>
<pathelement location="${build.test.dir}"/>
<fileset dir="${vendor.lib.dir}"><include name="*.jar"/></fileset>
</path>
<target name="prepare">
<mkdir dir="${build.prod.dir}"/>
<mkdir dir="${build.test.dir}"/>
</target>
<target name="compile" depends="prepare">
<javac destdir="${build.prod.dir}" srcdir="${src.dir}">
<classpath refid="project.classpath"/>
</javac>
</target>
<target name="compile-tests" depends="compile">
<javac destdir="${build.test.dir}" srcdir="${test.dir}">
<classpath refid="project.classpath"/>
</javac>
</target>
<target name="test" depends="compile-tests">
<junit haltonfailure="true">
<classpath refid="project.classpath"/>
<formatter type="brief" usefile="false"/>
<batchtest>
<fileset dir="${build.test.dir}" includes="**/*Test.class"/>
</batchtest>
</junit>
</target>
</project>
單一指令 ant 完成編譯、測試、失敗即停。IDE 獨立性:任何團隊成員、任何機器均可執行。
<cruisecontrol>
<project name="whizbang" buildafterfailed="false">
<bootstrappers>
<currentbuildstatusbootstrapper file="logs/whizbang/currentbuildstatus.txt"/>
</bootstrappers>
<modificationset quietperiod="30">
<cvs localworkingcopy="checkout/whizbang"/>
</modificationset>
<schedule interval="300"/> <!-- 5 分鐘輪詢 -->
<log dir="logs/whizbang"/>
<merge dir="checkout/whizbang/junit-results"/>
<publishers>
<currentbuildstatuspublisher file="logs/whizbang/currentbuildstatus.txt"/>
<email .../> <!-- 郵件通知 -->
</publishers>
</project>
</cruisecontrol>
<project name="cc-build" basedir="checkout" default="build">
<target name="build">
<delete dir="whizbang"/>
<cvs command="co whizbang"/>
<ant antfile="whizbang/build.xml"/>
</target>
</project>
流程:刪除舊工作區 → CVS 更新最新碼 → 執行專案自帶 build.xml。5 分鐘發現問題,修復成本最低。
# 建立版本分支、編譯測試、修復問題
$ release_branch 2_7_1
# 產生發布包、打標籤、交付 QA
$ release_generate 2_7_1
腳本內部自動化:建立 Tag → Checkout Tag → 完整構建測試 → 打包 WAR/EAR → 簽名 → 上傳制品庫 → 通知相關人員。
$ deploy
腳本執行:
public class DiagnosticTests extends TestCase {
public void testDatabaseConnection() {
Database db = new Database(); // 讀取配置文件中的 database.url
try {
db.connect();
} catch (RuntimeException e) {
fail("Unable to connect to database '" + db.getURL() + "'. " +
"Please check 'database.url' property.");
}
}
}
部署腳本啟動前跑 JUnit 診斷套件,失敗即中止部署並輸出人類可讀錯誤訊息,避免「配置錯誤導致啟動失敗」的經典惡性循環。
$ monitor https://demoserver:8080/whizbang
監控程式定期抓取頁面,掃描關鍵字 Error、Exception、500、404,或檢測 HTTP 狀態碼非 200。異常立即發送 SMS 至負責人手機,爭取演示前修復黃金時間。
| 層級 | 經典工具 | 現代替代 |
|---|---|---|
| 構建 | Ant | Maven / Gradle |
| CI | CruiseControl | Jenkins / GitLab CI / GitHub Actions |
| 制品庫 | 檔案系統 | Nexus / Artifactory / GitHub Packages |
| 部署 | Shell/Expect | Ansible / Docker / Kubernetes Helm |
| 監控 | 自製腳本 | Prometheus + Grafana / Datadog / ELK |
build.xml/pom.xml,確保本地一鍵構建。每一步都是投資,立即見效、長期複利。自動化不是終點,是持續改進的工程文化。