Jenkins構建deb包遇到的錯誤
阿新 • • 發佈:2020-09-10
背景:
最近公司在部署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:override_dh_shlibdeps: dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
注意:第一行前不能有空格,第二行要用前用的是tab
錯誤2: 如果該包的編譯是cmake && make形式%:如果該包的編譯是./configure && make && make install形式
dh $@ --buildsystem=cmake
%:錯誤3:dh_usrlocal: XXX is not a directory 原因:因為我們把包的檔案放到了/usr/local/下,但通常不應該將檔案放在那裡,解決方法是將檔案遷移或跳過這個檢查:
./autogen.sh dh $@ --with autotools-dev
override_dh_usrlocal:錯誤4:因為我們打包的時候會檢查測試,這個過程很容易出錯,除了一一將檢查項解決,還就是去掉這個檢查,不建議這麼做,在此提供一個方案:
# Do nothing
override_dh_auto_test:
dh_auto_test --no-act