新聞中心
Jenkins 的默認日志難以閱讀,但日志本不必如此。

為南山等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及南山網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站制作、成都網(wǎng)站建設、南山網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
Jenkins 是一個自由開源的自動化服務器,用于構(gòu)建、測試和部署代碼。它是持續(xù)集成Continuous Integration(CI)、持續(xù)交付Continuous Delivery(CD)的基礎(chǔ),可以為開發(fā)人員每天節(jié)約幾小時,并保護他們免受失敗的代碼上線的影響。一旦代碼失效或開發(fā)人員需要查看測試輸出時,Jenkins 提供了日志文件以供檢查。
默認的 Jenkins 管道Pipeline日志可能難以閱讀。這篇關(guān)于 Jenkins 日志的基礎(chǔ)知識的總結(jié)文章提供了一些技巧(和代碼),說明了如何提升它們的可讀性。
你獲得什么
Jenkins 管道分為 幾個階段。Jenkins 自動記錄每個階段的開始,記錄內(nèi)容如下:
[Pipeline] // stage
[Pipeline] stage (hide)
[Pipeline] { (Apply all openshift resources)
[Pipeline] dir
上文顯示的內(nèi)容沒有太大區(qū)分度,重要的內(nèi)容(如階段的開始)未突出顯示。在多達數(shù)百行的管道日志中,要找到一個階段的起始和另外一個階段的終止位置可能會很艱巨。當隨意瀏覽日志尋找一個特定的階段的時候,這種艱巨尤其明顯。
Jenkins 管道是由 Groovy 和 Shell 腳本混合編寫的。在 Groovy 代碼中,日志記錄很少。很多時候,日志是由命令中的不起眼的文本組成,沒有詳細信息。在 Shell 腳本中,打開了調(diào)試模式(set -x),所以每條命令都會被完全具現(xiàn)化realized(變量被解除引用并打印出數(shù)值)并詳細記錄,輸出也是如此。
鑒于日志可能有很多內(nèi)容,通讀日志獲取相關(guān)信息可能很繁瑣。由于在管道中被處理,并跟著一個 Shell 腳本的 Groovy 日志可讀性差,它們很多時候缺少上下文:
[Pipeline] dir
Running in /home/jenkins/agent/workspace/devop-master/devops-server-pipeline/my-repo-dir/src
[Pipeline] { (hide)
[Pipeline] findFiles
[Pipeline] findFiles
[Pipeline] readYaml
[Pipeline] }
我可以知道我正在使用的目錄,并且知道我正在使用 Jenkins 的步驟搜索文件、讀取 YAML 文件。但是我在尋找什么?我找到并讀取的內(nèi)容是什么?
能做什么?
我很高興你這么問,因為這里有一些簡單的做法和一些小的代碼片段可以提供幫助。首先,代碼如下:
def echoBanner(def ... msgs) {
echo createBanner(msgs)
}
def errorBanner(def ... msgs) {
error(createBanner(msgs))
}
def createBanner(def ... msgs) {
return """
===========================================
${msgFlatten(null, msgs).join("\n ")}
===========================================
"""
}
// flatten function hack included in case Jenkins security
// is set to preclude calling Groovy flatten() static method
// NOTE: works well on all nested collections except a Map
def msgFlatten(def list, def msgs) {
list = list ?: []
if (!(msgs instanceof String) && !(msgs instanceof GString)) {
msgs.each { msg ->
list = msgFlatten(list, msg)
}
}
else {
list += msgs
}
return list
}
將這段代碼添加到每個管道的末尾,也可以 加載一個 Groovy 文件 或者使其成為 Jenkins 共享庫 的一部分,這樣更有效。
在每個階段起始處(或者在階段中的特定位置),只需調(diào)用 echoBanner:
echoBanner("MY STAGE", ["DOING SOMETHING 1", "DOING SOMETHING 2"])
你的 Jenkins 日志會展示如下:
===========================================
MY STAGE
DOING SOMETHING 1
DOING SOMETHING 2
===========================================
這個橫幅很容易從日志中分辨出來。當正確使用它們時,它們還有助于界定管道流,并且可以很好的將日志分解開來進行閱讀。
我已經(jīng)在某些地方專業(yè)地使用這些代碼一些時間了。在幫助管道日志更易讀和流程更易理解方面,反饋是非常積極的。
上述的 errorBanner 方法以相同的方式工作,但是它會立即使腳本失效。這有助于突顯失敗的位置與原因。
最佳實踐
- 在你的 Groovy 代碼中大量使用
echoJenkins 步驟來通知用戶你在做什么。這些也可以幫助記錄你的代碼。 - 使用空的日志語句(Groovy 中空的 echo 步驟、
echo ''或 Shell 中的echo)來分割輸出,提高可讀性。你可能在你的代碼中為同樣的目的使用空行。 - 避免在腳本中使用
set +x的陷阱,因為它隱藏了日志記錄已執(zhí)行的 Shell 語句。它并沒有清理你的日志,而是使你的管道成為一個黑盒子,隱藏了管道正在做的行為以及出現(xiàn)的任何錯誤。確保管道功能盡可能透明。 - 如果你的管道創(chuàng)建了中間工件Intermediate Artifacts,開發(fā)人員和 DevOps 人員可以使用這些工件來幫助調(diào)試問題,那么也要記錄它的內(nèi)容。是的,它會加長日志,但這只是文本。在某些時候,這會是有用的信息,而(利用得當?shù)模┤罩静痪褪顷P(guān)于發(fā)生了什么和為什么發(fā)生的大量信息嗎?
Kubernetes 機密信息:無法完全透明的地方
有些事情你不希望出現(xiàn)在日志里暴露出來。如果你在使用 Kubernetes 并引用保存在 Kubernetes 機密信息Secrets中的數(shù)據(jù),那么你絕對不希望在日志中公開該數(shù)據(jù),因為這些數(shù)據(jù)只是被混淆了,而沒有被加密。
假如你想獲取一些保存在機密信息中的數(shù)據(jù),然后將其注入模板化 JSON 文件中。(機密信息和 JSON 模板的完整內(nèi)容與此例無關(guān)。)按照最佳實踐,你希望保持透明并記錄你的操作,但你不想公開機密信息數(shù)據(jù)。
將腳本模式從調(diào)試(set -x)更改為命令記錄(set -v)。在腳本敏感部分的結(jié)尾,將 Shell 重置為調(diào)試模式:
sh """
# change script mode from debugging to command logging
set +x -v
# capture data from secret in shell variable
MY_SECRET=\$(kubectl get secret my-secret --no-headers -o 'custom-column=:.data.my-secret-data')
# replace template placeholder inline
sed s/%TEMPLATE_PARAM%/${MY_SECRET_DATA}/ my-template-file.json
# do something with modified template-file.json...
# reset the shell to debugging mode
set -x +v
"""
這將輸出此行到日志:
sed s/%TEMPLATE_PARAM%/${MY_SECRET_DATA}/ my-template-file.json
與 Shell 調(diào)試模式中不同,這不會具現(xiàn)化 Shell 變量 MY_SECRET_DATA。顯然,如果管道中在這一點出現(xiàn)問題,而你試圖找出問題出在哪里,那么這不如調(diào)試模式有用。但這是在保持管道執(zhí)行對開發(fā)人員和 DevOps 透明的同時,也保持你的秘密的最佳平衡。
網(wǎng)站名稱:如何使Jenkins日志更可讀
文章分享:http://www.dlmjj.cn/article/ccooehc.html


咨詢
建站咨詢
