1. 程式人生 > 實用技巧 >Jenkins構建deb包遇到的錯誤

Jenkins構建deb包遇到的錯誤

背景:

  最近公司在部署Jenkins,需要我們把公司專案使用的內部包和常用的外部包進行構建打包成deb檔案上傳到內部apt源中,在構建打包過程,遇到了一些問題,記錄如下, 其中構建的節點伺服器系統為:16.04.1-Ubuntu

打包:

  打包命令很簡單,一般是兩步:

echo "s" | sudo dh_make  --packagename  "$JOB_BASE_NAME"_"$TAG"  -n
sudo dpkg-buildpackage -d
注意事項:dh_make  安裝的時候的名字是dh-make(apt install dh-make) 

1.第一條命令
  • echo "s" 輸入dh_make的提示引數,s表示這個包的型別是single binary,
    • 可供選擇的有single binary,indep binary, multiple binary, library, kernel module, kernel patch。分別對應:[s/i/m/l/k/n]
  • --packagename 後接包名,其中
    • $JOB_BASE_NAME是Jenkins自帶的可用引數,表示本次構建的專案名(所以我們一般把專案名與軟體包的名字設定為一樣)。
    • $TAG是我們設定的git引數,表示構建的git標籤。這個引數可以讓我們在更新版本構建時,選擇對應的版本即可。
  • -n, --native the program is Debian native, don't generate .orig
    • 更多引數可以使用dh_make --help命令檢視
  • 這條命令執行結束後,會生成debian目錄,裡面有兩個重要的檔案:rules和control
    • rules相當於一個makefile檔案,是我們第二條命令執行的邏輯。
    • control定義了我們包的版本、描述以及編譯和執行依賴資訊。

2.第二條命令
  • 這條命令時正常的打包命令,執行結束後會在上一層目錄中生成deb檔案(還有包括.tar.gz的原始碼檔案)。
  • 打包好的deb檔案可以使用 dpkg -c xxx.deb 來檢視這個這個包的內容來判斷是否正確完整,完整的包應該包括.so和.a以及.pc檔案。

 3.上傳到apt源伺服器

   執行完上述命令,拿到deb包後就只用把其上傳到apt源伺服器更新索引檔案即可,選擇構建的Send files or execute commands over SSH

    

遇到的錯誤

  錯誤1:dpkg-shlibdeps: error: no dependency information found for /usr/lib/x86_64-linux-gnu/libprotoc.so.10 (used by debian/protobuf-c/usr/bin/protoc-gen-c)   原因:       dpkg-shlibdeps是一種工具,它通過動態連結的方式找出新包所依賴的所有包。它通過檢查所有新的二進位制檔案,檢視它們連結到哪些庫,     以及使用了哪些來自這些庫的符號,然後檢查dpkg資料庫,檢視哪些包擁有這些庫,並找到所需的最低包版本來提供所需的符號。       在上面的例子中,它會看到我們本次的應用程式連結到libprotoc.so。所以它檢查哪些包擁有這個庫。哦,但沒有找到這個庫。這就是錯誤的來源。            see:
https://stackoverflow.com/questions/27233995/dpkg-shlibdeps-error-no-dependecy-information-found?noredirect=1&lq=1
    解決方法:忽略檢查,在debian/rules中新增
override_dh_shlibdeps:
  dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info

  注意:第一行前不能有空格,第二行要用前用的是tab

  錯誤2:     如果該包的編譯是cmake && make形式  
%: 
  dh $@ --buildsystem=cmake


    如果該包的編譯是./configure && make && make install形式


%: 
  ./autogen.sh dh $@ --with autotools-dev

  錯誤3:dh_usrlocal: XXX is not a directory     原因:因為我們把包的檔案放到了/usr/local/下,但通常不應該將檔案放在那裡,解決方法是將檔案遷移或跳過這個檢查:   
override_dh_usrlocal: 
  # Do nothing

  錯誤4:因為我們打包的時候會檢查測試,這個過程很容易出錯,除了一一將檢查項解決,還就是去掉這個檢查,不建議這麼做,在此提供一個方案:  
override_dh_auto_test: 
  dh_auto_test --no-act