今天延續昨天,將介紹如何撰寫 shell script 來持續觀察 Perforce 上的 workspace 是否有程式碼變動,好接著做後續的動作。
今天延續昨天,將介紹如何撰寫 shell script 來持續觀察 Perforce 上的 workspace 是否有程式碼變動,好接著做後續的動作。
主要的核心流程如下:
1使用 shell script 登入 Perforce
2執行 p4 sync (Perforce更新指令),並將更新結果儲存到一變數中
3使用文字比對,察看變數中是否有我們所需要的關鍵字。(註1)
4如果有找到關鍵字就去處發自動建置(auto-build)功能。(註2)
5如果沒找到關鍵字,就純粹記錄log就好。
註1: 在使用 p4 sync 時,如果有更新,則會出現更新哪些程式碼的資訊,如果沒有任何更新,則是出現『File(s) up-to-date.』這個關鍵字!
一開始,我是使用『File(s) up-to-date.』來判斷的(因為太偷懶了),如果出現這個關鍵字就純粹記錄log,如果沒出現就認為有程式碼更新,直接執行觸發auto-build(自動建置)功能。
沒想到!真的是晴天霹靂阿!
有一次因為Perforce主機好像出現了一些連線問題,導致我們這邊連不上,進而讓所接收到的訊息就不會是『File(s) up-to-date.』,而是『Connection』相關的錯誤訊息。再加上我是每分鐘都去問Perforce是否有檔案更新,也因此我的 shell script 就會誤認為每分鐘都有檔案更新。
媽呀!嚇死我了!
因為 shell script 誤認為每分鐘都有檔案更新,因此每分鐘都去觸發自動建置,想當然爾,建置完了就會發一封建置結果的email給我們團對中的每一個人。所以,那天就從早上八點一分鐘一封信發給所有的人,直到我早上去公司收信時發現!才把他解掉!
(那天足足發了一百多封信給團隊中的每個人~包括我的老板 )
最後,我的解法就是把 p4 sync 的結果判斷成要出現程式碼的關鍵字才認為是有程式碼更新。
註2: 我這變觸發自動建置的方式是去開啟一個網頁,就會觸發了。所以我使用 wget 去開啟那網頁,但是我並不需要網頁的內容,因此才會 wget 下來又馬上把他給刪掉。
判斷式否有程式碼更新並觸發自動建置的範例 Shell Script :
#!/bin/bash
# workspace variables
MyProjectLog=/home/pajace_chen/Perforce_Check/MyProjectUpdateLog.log
# Perforce workspace
export MyProjectWorkspace=MyProject
# Perfoce 指令
P4COMMAND=/usr/local/bin/p4
# 要登入 Perfroce 所需的環境變數
export P4CLIENT=$MyProjectWorkspace
export P4PASSWD=1234567890
export P4USER=pajace2001
export P4PORT=192.168.0.1:1666
# 這一步驟是要登入 perforce
echo $P4PASSWD | $P4COMMAND login >&2
# 這一步驟是要將 p4 sync 的結果 assign 給OUTPUT 這個變數
OUTPUT=$($P4COMMAND sync 2>&1)
# 指定 log file 檔案名稱
LOG_FILE=$ MyProjectLog
# 如果執行 p4 sync 的結果有包含 MyProject 就去觸發自動建置功能
if [[ "$OUTPUT" =~ //MyProject* ]]
then
# 用 echo 記錄一些相關資料
echo "`date`: My Project 的程式碼有更動." >> $LOG_FILE
echo "`date`: 觸發自動建置功能" >> $LOG_FILE
# 將執行 p4 sync 的結果寫到 log 檔案中
echo "$OUTPUT" >> $LOG_FILE
#用 wget 去開啟網頁,觸發自動建置,不是真的需要網頁的內容
wget http://192.168.0.2:8080/jenkins/job/MyProject/build?token=TriggerBuild
# 因為使用 wget 去抓網頁,會留下不需要的檔案,所以刪掉他
rm build?token*
else
# 沒有程式碼更動也寫一下 log 好做偵錯時使用
echo "`date`: MyProject 中沒有程式碼更動. Output: $OUTPUT" >> $LOG_FILE
fi
$P4COMMAND logout
鐵人賽文章分享
上一篇 ShellScript真實案例練習之前言
下一篇 提高可讀性之函示寫法(一)