跳到主要內容

發表文章

目前顯示的是有「Apache Ant」標籤的文章

Ant文章列表

Ant是非常好用的建置工具。除了當建置工具外,還可以用來當一般的script使用。如果你的script原本就需要提供windows和linux的版本,不仿考慮改用Ant。唯一的缺點就是要裝一大包的jre拉! 如何在Ant中辨別OS是使用32位元還是64位元? Ant的另外一個用途: Util Tool 如何取得環境變數? Ant Contrib Untar帶有未知版號的檔案 根據條件設定某個變數 透過SCP執行某些跨平台工作 透過Ant執行HttpMethod

透過Ant執行HttpMethod

Problem 使用分散式的持續整合系統,大都會面對透過http protocol存取所需資源。以內建或者必備的套件來說: HTTP GET: 可以使用Get task,來獲取你所需要的資源。 HTTP POST: 可以使用Ant Contrib的Post task,來發布資源或者觸發工作。 但HTTP PUT或HTTP DELETE呢? 有的人可能會想到CURL,但如果要做成好用的task,你可能需要花不少時間實作。本篇將會介紹Ant-Http的用法來減少大家的時間成本。 How to? Get Artifacts Ant-Http的原始碼可以從GitHub上取得,可以直接透過git從https://github.com/antlibs/ant-http.git clone。我是透過eclipse匯入的,因為它專案libraries是透過ivy resolve,所以整個在eclipse上跑起來沒什麼問題;build ant lib可以直接執行它提供的build.xml,以下是專案結構內容: 在設定上,dist有一個ant-http所提供的範例,所以應該不會有什麼問題。使用的部分我直接提供範例給大家參考。 HTTP PUT PUT我用於上傳檔案。source file透過entity指定;如果你的http server需要basic認證,可以使用credentials。 <target name = "put-artifact" > <http url = "http://192.168.1.123/repositories/test_project/branch.properties" method = "PUT" printrequestheaders = "true" expected = "201" > <entity file = "branch.properties" /> <credentials username = "admin" password = "123456" show = ...

Ant - 透過SCP執行某些跨平台工作

Problem 某天我們有了要在exe檔上sign certificate的需求,而我們目前狀況如下: Signtool Server: Windows Server 2003,32位元。 Build Server: Jenkins,CentOS6,64位元。 簡化後的Build Process: 從版控系統checkout code後,開始編譯,產生各專案artifacts;透過installanywhre產生出installer;計算CRC code,並包成一個壓縮檔。 Thinking 基於以上需求,我開始思考有哪些做法: 拆解build job: 將步驟拆成多個build job。signtool server為jenkins slave,其中一個job可以將產生的installer丟過去執行。 不拆解build job: 讓Signtool Server上有類似jenkins slave的程式,可以接收我們的指令,而動作可以在一個build流成內完成。 使用第一種做法,我需要refactor build script,並且要考慮installer傳輸或放置在可抓取位置問題。而第二個做法呢? 考慮容易且可以傳輸檔案、執行指令的protocol: 透過ssh server: 可使用cygwin或其它現有的ssh server。 透過rest api: 可基於 sprint restapi 去實作,有sprint boot後,實作或發布app簡單很多。 為了簡單也不需要額外實作,我選擇了ssh server的方式。 How to? select ssh server - apache sshd 在ssh server的選擇上,首先我使用了cygwin。在Signtool Server上安裝cygwin後,首先遇到類似以下的訊息 could not be located in the dynamic link library KERNEL32.dll 嘗試過不同版本的cygwin依然無法解決,接著改用 apache sshd 。我使用的是1.2.0的版本,我遇到以下問題: sshd.bat找不到main class: 從source code得知,bat launch的class名稱需改為org.apache.sshd.server.SshServer。 連線後該...

Ant - 根據條件設定某個變數

Problem 這是一個很常見的需求: 根據某些條件,去決定某個變數應該怎樣。 How to? 我的例子是根據${drbl.client.mbname}的值去決定${remote_url}的值;如果都不符合,就給一個預設值。 <target name = "setRemoteURL" depends = "checkMotherboard" > <condition property = "remote_url" value = "REMOTE_URL:http://10.134.14.51:5555/wd/hub" > <equals arg1 = "${drbl.client.mbname}" arg2 = "x10drff-c" casesensitive = "false" /> </condition > <condition property = "remote_url" value = "REMOTE_URL:http://10.134.14.52:5555/wd/hub" > <equals arg1 = "${drbl.client.mbname}" arg2 = "x8dtu-ln4+" casesensitive = "false" /> </condition > <condition property = "remote_url" value = "REMOTE_URL:http://10.134.14.53:5555/wd/hub" > <equals arg1 = "${drbl.client.mbname}" arg2 = "x8sia-f" casesensitive = "false" ...

Ant - Un-tar 帶有未知版號的檔案

Problem 在撰寫build script時,會常遇到要解壓相依模組包,而這些模組包往往會帶著版本號。在下載時直接將版本號處理掉是一種方法;如果不行,也可以透過後置的方式來處理。要用什麼方式視你的情況而定。 How to? 透過修改檔案名稱,搭配mapper將版本號去掉: <move todir = "." > <fileset dir = "." > <include name = "*.tar" /> </fileset > <mapper type = "glob" from = "test-*.tar" to = "test.tar" > </mapper > </move > <untar dest = "." src = "test.tar" > </untar >

Ant Contrib

Ant Contrib是Ant相關專案之一,必須使用1.4.1之後版本的Ant。提供condition statements、運算子等tasks,可參考 task 列表。下載它的jar檔並放置好後(假設置於與build script相同目錄下的libs),引用方式如下: <property name = "path.libs" value = "${basedir}${file.separator}libs" />   <taskdef resource = "net/sf/antcontrib/antlib.xml" > <classpath > <pathelement location = "${path.libs}${file.separator}ant-contrib-1.0b3.jar" /> </classpath > </taskdef > 有用到的task會再介紹給大家。 Reference Ant Contrib in SourceForge Tasks

Ant - 如何取得環境變數?

在ant中,要取得環境變數可以透過environment property。讓我們直接看sample code: 假設我們的系統變數如下(在cmd中執行set): PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ PUBLIC=C:\Users\Public SESSIONNAME=Console SystemDrive=C: SystemRoot=C:\Windows TEMP=C:\Users\TonyLin\AppData\Local\Temp TMP=C:\Users\TonyLin\AppData\Local\Temp USERDOMAIN=TonyLin-PC USERNAME=TonyLin USERPROFILE=C:\Users\TonyLin VBOX_INSTALL_PATH=C:\Program Files\Oracle\VirtualBox\ windir=C:\Windows 假設我們想存取windir,在ant中我們可以這樣寫: <?xml version = "1.0" encoding = "UTF-8" ?> <project name = "project" default = "test env" > <property environment = "env" /> <target name = "test env" > <echo > ${env.windir} </echo > </target > </project > 執行結果如下: Buildfile: D:\Workspace\AntPractice\build.xml test env: [echo] C:\Windows BUILD SUCCESSFUL Total time: 1 second 是不是很簡單呢? 唯一需要注意的是: 這是有大小寫區分,以%PATH%為例。在windows cmd中,輸入echo...

Ant的另外一個用途: Util Tool

由於小弟我生性懶惰,做任何事情都希望能越簡單越好。為了增加效率,某一天想到可以透過ant把一些“瑣事”寫在裡面。而UtilTool提供哪些功能,可以透過help的task,下面是我一個help範例: <target name = "help" > <echo > do checkout: chekout testcases and installer. </echo > <echo > update installer: update ssmagent and ssmserver installer. </echo > <echo > test-chrome: execute testing with chrome </echo > <echo > test-ff: execute testing with chrome </echo > <echo > del nitc: delete non-installer testcases </echo > </target > help task的目的只是為了讓你知道script提供的command有哪些。像我就把更新installer、testing、checkout testcases等寫到裡面。喜歡的話還可以把一些functional script寫到裡面,做成攜帶版的debug工具。 執行結果: 剛Swind問我為何用ant,我說: 因為簡單、跨平台。

如何在Ant中辨別OS是使用32位元還是64位元?

一開始想說可以透過os.arch去判斷, 但發現os.arch值是跟著JVM的! 舉例而言: 64-bit JVM值可能會顯示x64, amd64 or x86_64 32-bit JVM值會顯示x86 or i386 這會導致無法正確判斷使用者的OS是哪一種Arch. 經過小弟研究與Swind討論出一個可以在Windows2008、Windows2003、Win7、SLES、RHEL、Ubuntu、CentOS上正確取得Arch的方法, 並且簡單! 如下: <project name = "project" > <target name = "checkOS" > <condition property = "os.linux" > <os family = "unix" /> </condition > <condition property = "os.windows" > <os family = "windows" /> </condition > <echo > linux:${os.linux} </echo > <echo > windows:${os.windows} </echo > </target > <target name = "getLinuxBit" depends = "checkOS" if = "os.linux" > <exec executable = "/bin/bash" outputproperty = "linux-bit" > <arg value = "-c" /> <arg value = "getconf LONG_BIT...