在舊版本中,生成的sonarpdf檔案直接儲存在了跑在同一臺主機的tomcat上,只需要在shell指令碼中cp一下就ok了。但是, 新版本jenkins與minio檔案伺服器不在同一臺主機上。所以需要想辦法把jenkins主機上生成的pdf檔案上傳至minio。
每乙個應用對應乙個pipeline,每次執行當前應用的pipeline都會生成乙個新的版本,每個版本都會生成乙個sonarpdf檔案。但是當前應用的pipeline和sonar中的專案是一一對應的關係,也就是說每次sonar掃瞄後都會覆蓋jenkins上生成的pdf檔案,所以需要每次生成後利用我們自定義的規則分別儲存再minio伺服器上。
如果我在devops開發系統伺服器上寫**,讀取jenkins伺服器上某目錄下的pdf檔案為inputstream,然後再呼叫miniosdk上傳至minio。 就會變成 jenkins -> devops -> minio,怎麼感覺都覺得不合理。所以經過思考,決定再jenkins伺服器執行pipeline時執行到sonar.sh指令碼中的生成pdf檔案成功後,在指令碼中追加一段上傳minio伺服器的**。
隨之而來的問題。上傳至minio伺服器的指令碼應該怎麼寫?翻遍文件資料,只發現了minio提供的sdk,並沒有發現有shell上傳的文件。
最終,經過仔細研究,發現minio的有乙個data的目錄,只要把檔案放入到這個資料夾中,就會顯示出bucket和對應的檔案。那麼,如何利用shell指令碼在jinkens伺服器遠端動態生成目錄?建立完目錄後又如何把pdf傳遞至minio伺服器?
minio官方文件:
使用ssh-keygen
命令在本地機器上使用ssh-keygen產生公鑰私鑰對。
$ ssh-keygen
用ssh-copy-id將公鑰複製到遠端機器中
$ ssh-copy-id -i .ssh/id_rsa.pub 使用者名字@192.168.x.***
登入到遠端機器不用輸入密碼
$ ssh 使用者名字@192.168.x.***
last login: sun nov 16 17:22:33 2008 from 192.168.1.2
參考資料:
這樣無需密碼就可以登入到遠端伺服器了,在寫shell指令碼的時候可以少寫幾行**。
yum install expect
什麼是expect?
在實際工作中,我們執行命令、指令碼或程式時,這些命令、指令碼或程式都需要從終端輸入某些繼續執行的指令,而這些輸入都需要人為的手工進行。而利用expect,則可以根據程式的提示,模擬標準輸入提供給程式,從而實現自動化互動執行。這就是expect!!!
參考:建立乙個指令碼
$ vim create_dir.sh
#!/usr/bin/expect -f
set user [lindex $ar** 0]
set url [lindex $ar** 1]
setdir
[lindex $ar** 2]
spawn ssh
$@$expect
"100%"
send "mkdir -p /data/minio/data/$/ \r"
expect
"eof"
其中變數user為目標主機的使用者,url為ip,dir為要動態建立的目錄。
$ vim send.sh
#!/bin/sh
user=
$1url=
$2dir=
$3echo$$"
$$echo
因為我把兩個指令碼的內容寫在一起時總是執行失敗,因此我分成了兩個指令碼執行竟然成功了。 linux中的shell 指令碼函式的簡單實現
1 函式就是具備某一功能的工具 2 為什麼要用函式 1 程式的組織結構不清晰,可讀性差 2 冗餘 3 可擴充套件性差 3 如何用函式 函式的使用必須遵循的原則 先定義,後呼叫 修理工事先準備工具的過程即函式的定義 修理工遇到應用場景拿來工具就用即函式的呼叫 一 如何使用 例1 bin bash fu...
linux中的shell 指令碼函式的簡單實現
1 函式就是具備某一功能的工具 2 為什麼要用函式 1 程式的組織結構不清晰,可讀性差 2 冗餘 3 可擴充套件性差 3 如何用函式 函式的使用必須遵循的原則 先定義,後呼叫 修理工事先準備工具的過程即函式的定義 修理工遇到應用場景拿來工具就用即函式的呼叫 一 如何使用 例1 bin bash fu...
linux各種shell特色指令碼使用
目錄 1 gdb斷點資訊收集自動化 2 objdump檢視過大可執行檔案上的指定函式彙編 3 定製 linux 協議棧引數 修改 etc sysctl.conf 鑑於在故障現場使用gdb跟蹤,設定斷點,列印斷點處資訊存在一定的時間差,且有造成單板重啟或影響業務等問題,採用指令碼實現自動化操作。指令碼...