歡迎您光臨本站 註冊首頁

學姐帶你學 OBS常用命令

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

 ─=≡Σ((( つ•̀ω•́)つ,歡迎回來!之前一篇教給大家怎麼註冊 openSUSE Open Build Service 用戶、安裝和初始化環境設定的內容,學姐相信大家已經好熟悉了呢!課後沒有做功課的拖去平壤街頭哭一場金胖子呢!感謝 @doublechou 來稿

 

今天學姐要給大家講一講, OBS 的常用命令。還是啦,主要會在命令行裡面來操作,網頁操作會順便提到,然後網頁操作的不足也會有講。當然學姐也不會一下子都丟過去,那樣子會反感的啦!主要是通過一個 RPM 程式包在 OBS 上完整的創建過程這樣一個例子來教學,當中會略過「spec 文件的編寫」這塊,因為這是第三篇的重點,默認我們就假定這個 spec 文本是寫好的啦。

好啦,開始我們的旅程吧~

進入你的車庫

大家還記得上一篇我們是怎麼獲取我們的車庫的嗎?

osc co home:MargueriteSu 

(如果已擷取,可以不用做,即使做它也會告訴你那個車庫已在本地存在) 這種方法可以擷取任何人的車庫哦~接著使用 cd home:MargueriteSu

就進入你的私人車庫啦!

在 OBS 上註冊我們的軟體包

這步是 OBS 和普通的本地 RPM 打包最大的不同,因為本地打包是給你自己用的,你不需要告訴誰你在打什麼包,而 OBS 需要你知會它。不然一會兒你上傳的時候它會很費解的。

有三種方法可以做到:

  • 第一種沒什麼好講的啦,看圖吧:

其中 title 「標題」和 description 「描述」是不「必需」的,但是寫了有什麼好處呢,就是如果這個包,發行版間是有命名上的不同的,用戶可以通過你的描述知道它可能是別的發行版上的哪個包。因為即使包名不同,描述也很可能是相同的,(如果大家都沒有偷懶的話)而標題和描述是可「檢索」的,無論是在 YaST 的命令行版本和圖形版本, 還是在 webpin 頁面 software.opensuse.org/search。

Tip 3: 這裡的可「檢索」是不包括 YaST 的後端 zypper 的。YaST 命令行版本是指的 ncurses 版本, 是 root 環境下面(通過 su 進入)鍵入 yast 進入的那個類似紅白機的界面。

  • 第二種方法是通過上一篇教給大家的 meta 指令:

    osc meta pkg -e home:MargueriteSu application_name

然後寫入 title 和 description。

這裡需要特別提及的一個問題就是 osc 下面,任何的“裸創建”作業都是不會成功的。這是和網頁版最大的不同。

那麼什麼是“裸創建”呢?簡單說就是創建空包和空子車庫。這裡空包和空子車庫的意思是說不但它們裡面沒有任何的文件(有一個 0 位元組的文件也叫有文件哦),連它們本身的 meta 元數據也是空的。舉個例子:

網頁版下面你點「創建包」,然後輸入個 Name 點確定,是有個包被創建出來的,雖然它底下什麼都沒有; 但是 osc 下面使用

osc meta pkg -c home:MargueriteSu test 

是不會有任何結果的,它就當你這個包不存在,直到你使用

osc meta pkg -e home:MargueriteSu test 

來寫 title 和 description 。這樣創建子車庫也是同理,直到你編輯了子車庫的 title \ description \ repositories 等一些上一篇初始化環境提到的內容; 或者在這個子車庫下面創建了包。所以其實上一篇最後學姐給大家留的創建子車庫的方法是騙你們的啦哈哈!

說了這麼多是什麼意思呢?

就是這種方法是無論如何要寫入 title 和 description 的。太懶? 那麼看下一種方法。

  • 第三種方法是使用 osc 的 mkpac 指令:

    osc mkpac application_name

這是最優化的創建「包」的方式,因為它會略過學姐也懶得寫的 title 和 description ,直接在你的車庫下創建一個名字是 application_name 的子文件夾。

而如果你使用的是第二個命令來註冊的你的包的話,之後你看到的還是空空的車庫,要使用

osc up home:MargueriteSu 

更新你的車庫,或者直接

osc co home:MargueriteSu test 

把伺服器上的那個包給擷取回來, 這時你的車庫中才會有同名文件夾的。而 mkpac 則不一樣, 你雖然在本地車庫中看到了包名的文件夾,但是除非你向 OBS 做「提交」作業,不然網路上是沒有你這個包存在的。所以第二種和第三種註冊方法的實現過程是正好相反的。

這個方法的不足在於,它不能「直接」創建子車庫。因為 osc 沒有 mkrepo 這樣的指令。需要一點點變通:

osc mkpac home:MargueriteSu:gimp-2.7 gimp 

這樣會在創建包的同時把包所在的子車庫一併創建掉。當然,這個子車庫在網路上也是暫時不存在的,直到你做了「提交」作業。

但是如果你只是需要一個子車庫,那你就只好去 osc meta -e 了。

Tip 4: 除了 meta 等特別依賴路徑的指令外,其他的本地指令,如果你省略了車庫的話,會默認在你現在的車庫中操作。當然這意味著你執行指令的時候必須在一個車庫的文件夾中啦!否則會出現 not a working copy 錯誤哦~

RPM 打包操作

註冊好了你的包后,現在你的車庫中有一個包的同名文件夾。

這個文件夾和你系統上的其他文件夾有什麼不同呢?

答案是這個包是 under version control 的,「置於版本管理之下」,至於這究竟是什麼意思我們都是小白啦,不需要去深入了解。只需要知道一個 under version control 的文件夾有幾種表現:

  • 你 cd 作業時的「自動補全」會失靈

都知道按 tab 鍵可以自動補全路徑的吧,這裡不是說

cd t 

然後按 tab 等它給你自動補全成

cd test 

,而是指你在別的文件夾比如你的 /home 下,想要去到這個目錄

cd Project/h 

按 tab 會補全為

cd Project/home:MargueriteSu 

如果有子車庫你繼續輸入

:gim 

按 tab 等它自動補全成

cd Project/home:Marguerite:gimp-2.7 

這時如果你的車庫中只有一個文件夾的話,直接按 tab 在正常的文件系統中會直接補全那個文件夾,這裡就不行了。

原因是置於版本管理系統下的文件夾都有一個隱藏目錄 .osc,所以其實它下面是有兩個目錄的,直接補全就無能為力啦,一定要你輸入個首字母什麼的。

  • 正常的 CLI (命令行) 文件操作對它是無用的。

如果你在一個已經執行過「提交」操作的文件夾中做 rm -rf 操作。看上去它是已經被清空了,但是實際上下次你提交的時候,它會提示你「網路上的某些文件你本地沒有,建議先使用 osc up 作業」。如果你照做的話,(???),該死的它們又回來了。

同理即使你刪除了這樣的文件夾,又新建了同名的文件夾並在裡面放了東西的話,除非你再也別用到網路上這個程式包中的東西或者永遠別運行全車庫的 osc up,不然你會很悲傷的發現,(? ̄皿 ̄)凸,那個文件夾裡面的文件都被換掉了。

但是在提交前文件夾還是可以被刪除的。還記得前面學姐提過的第二種方法和第三種方法嗎?因為我們的包是第三種方法創建的,所以在「提交」前是不在版本控制的。比如你包名字創建錯了,(真的會的,因為給有些函數庫文件打包,是真的會有在本地調試才發現原來包名後面應該加上版本數字才對的情況)這時后可以自由的創建新包並把舊包文件拷貝過去。

下面,

cd test 
製作源代碼包

進入這個程式的打包文件夾,拷貝一些源代碼過來

cp -r /home/marguerite/Source.tar.gz ./ // -r 表示如果目標位置「./」即當前文件夾 //    中如果有同名文件就替換掉。 

這裡要說一下,給 openSUSE 打包,源代碼最好使用 tar.bz2 後綴的壓縮方式,不然即使其他都沒錯,最後的 log 日誌文件也會給你 warning 警告說「大於 1mb 的文件請用 tar.bz2 壓縮」。所以

tar -xzvf *.tar.gz // tar 是 linux 的壓縮與解壓縮作業,「x」表示 // 是解壓操作,「z」表示文件後綴是「.gz」, // 「v」表示顯示詳細處理過程,「f」表示保存到 // 本地。更多看「--help」。 

解壓,然後

rm -rf *.gz // rm 是刪除作業, 「r」表示遞歸操作,刪除 // 子文件夾和裡面的文件。「f」表示強制。 

刪除掉老的壓縮包,再用

tar -cjvf Source.tar.bz2 Source/ // 「c」表示壓縮,「j」表示壓縮包後綴「.bz2」。 

就產生了打包要用的源代碼包。

Tip 5: 這時真的不要手賤去 rm -rf 掉剛才解壓出來的 Source/ 文件夾, 「rm -rf」這個「成也蕭何敗也蕭何」的指令從推特過來的人都知道,有個學名叫做「人生一課」,意思就是無論什麼時候用都會給你上一課,慎之慎之,誰知道你是不是馬上就要看裡面的文本文檔呢。

編寫 spec 文本

本篇就省略啦, 我們假設它已經是預先做好了的啦。

可選:

本地編譯測試

除非你的 spec 文本超級簡單的,就是傳說中的 「mkdir & cp -r」大法做的,不要任何編譯過程的,否則都建議做一下這個過程。即使是大法弟子建議也來過一遍這八大銅人陣,因為有些超普遍的 spec 文本錯誤任何人都逃不過的,比如最終生成的待打包二進位文件的目錄中,誰都不能確定是否應該去「擁有」一個文件夾,直到它給你報錯通不過編譯; 盲目的「擁有」就變成了「佔有」了,不知道你們在現實中這麼做允許否,但在 RPM 的哲學里是不美的。(超討厭談程式哲學、發行版哲學這些東西,但昨天下午一個 arch 黨在 linuxtoy 的上篇教學里傳教了一下午,那感覺真的好棒。)

使用 osc 來本地編譯超棒的。因為它相當於在你的本地系統上開了沙盒哦。

什麼是沙盒呢? 沙盒就是在你系統上某個程式的「租界」啦,在這個租界里做任何事都和系統沒什麼關係的。舉個例子,你的系統可能已經更新到 Factory 了,但是你本地編譯測試還是可以打 12.1 的包。

但本地編譯不是沒有條件的,它需要使用你的 /var/tmp 大約 1~1.5GB 左右的空間和一些 CPU 資源。

下面學姐會教大家一些如何節省這些資源的 Tips。

Tip 6:如何節省本地編譯所需要的空間。 * 不緩存編譯依賴包

osc 本地編譯的時候會下載一些編譯依賴包,其中有 108 個,(一百單八將)被稱作最小編譯環境。它們是即使你不明確寫在 spec 文本里也可以用的依賴,比如 gcc,make,automake 這些幾乎所有的「編譯」都會依賴到的包。其他的就看你的 spec 文本是怎麼寫的了,比如你寫的依賴有 texlive,那麼你可能要下載接近 1G 的文件。這太不可以接受了。

本地緩存的依賴在 /var/tmp/osbuild-packagecache, 裡面是按照 repository/arch 來分類的,這和 /var/cache/zypp/packages/ 裡面好像。實際上就是一回事。所以你可以先「人生一課」掉前者裡面對應名字源的對應arch, 然後使用

sudo mkdir -pv /var/tmp/osbuild-packagecache/openSUSE:12.1/standard/x86_64 sudo ln -s /var/cache/zypp/packages/download.opensuse.org-oss/suse/x86_64 /var/tmp/osbuild-packagecache/openSUSE:12.1/standard/x86_64 

來做個符號鏈接。默認是沒什麼用的,因為新的 zypper 改了以前緩存 rpm 包到本地的習慣,所以要先去 /etc/zypp/repos.d/ 裡面,把你要緩存 rpm 的源的 .repo 文件里的 keepackages 改成 1.

這裡講的是方法,因為無論看上去還是實際上你都沒有省掉那 1GB 的空間嘛!(? ̄皿 ̄)凸

但如果你有之前用過沒扔的 ISO,那就真的省了,使用

sudo mkdir /media/openSUSE_12.1/ sudo mount openSUSE_12.1.iso /media/openSUSE_12.1/ -o loop  

掛載上。開機自動掛載的方式網路上有好多的。

這種優化的限制有:

**沒有真正的省空間,只是免去你同一個包下載兩遍的麻煩,因為一般你打包的東西你自己最終都是要從源里給自己裝上的。而「真正」省空間的方法,不適用 Factory,因為工廠版沒有 ISO。

**不適用 /tmpfs 黨。有些人的/var/tmp 可能是完全在內存上的。你怎麼折騰再開機都是會清空,除非你再把 /var/cache/zypp/packages 符號鏈接到硬碟上 (๑´ω`๑)♡

  • 強制單線程編譯

這個本來應該寫到下一篇去,但是寫在這裡印象會深刻一些,那就是 spec 的編譯環節 %build, 如果是提交到 OBS 伺服器去編譯的話,建議的是:

make %{?_smp_mflags} 

這樣會多核心多線程的來編譯。但是本地這麼干就有點緊張了。一般會給你開雙線程,除非你本身就是單核的。所以先把它替換成

make -j1 

來做,強制單線程編譯,時間會長一些,但是你的 CPU 使用率會下降一些。因為一般本地編譯不是因為你要用,而是等著除蟲,等待打包拋錯的時候一般會刷個推特、上個網什麼的,卡著那就太不爽了。

好了,完成這些「優化」之後,讓我們真正開始本地編譯測試吧。

osc build openSUSE_12.1 x86_64 test.spec --local --clean 

命令很好理解。版本和架構。「--clean」表示初始化最小編譯環境,如果你已經這麼做過一次了,排了一些錯后重新測試,如果不是改了 spec 文本中的 Requires 依賴的話,可以使用 「--noinit」這個參數,不初始化最小編譯環境直接開編,會省大把的時間。

不知道 deb 可不可以這樣格式的寫, 比如:

osc build xUbuntu_11.10 i386 test.dsc --local --clean 

還請那位「我用 Ubuntu 上傳 OBS 我會告你嗎」同學過來掃盲一下,學姐真的是不知道。

具體排錯的過程放在後面來講,這裡只需要知道使用

osc buildlog openSUSE_12.1 x86_64 

可以查看編譯的日誌輸出,這個文件是/var/tmp/buildroot/.buildlog, 而

osc buildlogtail openSUSE_12.1 x86_64 

可以看最後一行,通常這是導致你編譯中斷的出錯原因。

上面兩個命令都有遠程版本 remotebuildlog / remotebuildlogtail,即可以查看 OBS 上的打包日誌,實際上這兩個命令的本身不縮寫是 osc localbuildlog。

敢問還能再懶點嗎?

能,請用: osc bl/blt/rbl/rblt/lbl/lblt (bl 是多麼高尚的縮寫哇!(๑´ω`๑)♡)

現在我們假設本地測試已經成功了。

上傳到 OBS

本地測試可以解決你大部分的打包問題,下面解決的是分發問題。

你是不可能分享 specfile 給人家的,也不太可能用網盤或者 ftp 分享 RPM 包給人家。不要笑,這就是古時候的方式。學姐前面還想這麼分享一個遊戲給 sh 家族的兩位神秘 linux 客服:格子襯衫的 @shellex 和碎花裙紙的 @shellexy ,結果被勸阻了,因為人家是 deb。 (? ̄皿 ̄)凸

所以要上傳你的 程式工作目錄給 OBS,好讓它在伺服器那邊開工幫你完成分發難題。這也是之前為什麼要註冊程式給它的原因。

如果你的 specfile 是抄的別人的,而你又是「無視warning」的序員,那麼強烈要求你執行

osc service localrun format_spec_file 

這至少能把版權頭部給你加上,把你文本中的依賴按字母順序重排列,修復一下語法錯誤。實際上這是你拿到任何人的 spec 文本第一件應該做的事情。

使用

osc vc 

會打開一個 Changlog,你要寫一下你打包過程中具體做的事情,比如 切分了包啦,升級了版本啦什麼的。可以寫中文哦,但我只看過神秘打包俠 「逍遙遊」在他「職業生涯」的早期這麼做過。後面不知道是學新東方了還是知道害臊了(๑´ω`๑)♡。

接著把你工作目錄下的 spec 文本,源代碼包,可能有的補丁,.desktop 文件,Changelog 加入到版本控制。(只有被 osc 版本控制的文件才可以被提交哦)

osc add *.spec osc add *.change osc add *.tar.bz2 ... 

這個時候你才可以去「人生一課」掉之前解壓的源代碼目錄,因為移除太早你寫 spec 文本的時候還要去裡面查閱 INSTALL、REAME、COPYING 等信息的。

使用

osc status 

去看哪些文件在版本控制下,要是出現 (A) test.spec 表示它在。(但是返回空白不代表它不在哦!真正的不在是(!) test.spec ——文件不存在;(?) test.spec ——文件存在但不在版本控制下)使用

osc ci  

來上傳到 OBS。這是會打開一個版本變動說明給你看,看下頭部有哪些文件將要被上傳,以免自己少添加了文件到版本控制就好,然後「:wq」保存。這時:

**如果你沒有移除源代碼解壓目錄的話,會提示你「一個置於版本控制的文件夾下有沒有置於版本控制的文件,這些文件將不會被上傳」,這是一句廢話,我們也沒有想要上傳它,直接「c」繼續就好。

**如果你前面沒有執行過 osc vc 來寫 Changelog 的話,它會提示你「no log file found」,如果確實是你想這麼做的話,直接「c」就好。

過了一會,你的 程式工作目錄 就上傳到 OBS 了。OBS 的設置是只要有 spec 文本就會開始編譯,沒有就會拋你一個「broken」錯誤。

Tip 7: 這裡還是有點技巧的,就是源代碼不用上傳,因為你也是網上下載的,直接用 OBS 的「service」去下就好,這算是高級操作了,後面文章會專門講,這裡先默認全部上傳好了。

遠端控制

一般如果 本地編譯測試 做的好的話,除非伺服器犯賤,不然這個時候你就可以去干別的了,然後上網的時候順路查看一下網路版等成功狀態就好。但是遠端控制有時候還是蠻有必要的。

osc results 

直接告訴你伺服器端你的包成功還是失敗

osc results home:MargueriteSu test 

可以查看任何人的任何包。 如果狀態是失敗,記得用前面教過的

osc rbl home:MargueriteSu test openSUSE_12.1 x86_64 

看打包日誌。

  • 我不想要一個包/包里的某個文件了怎麼辦?

除了用網頁版去刪除之外,(這裡就不截圖了,因為你有帳號了就會自己看到)還可以使用:

osc delete Source.tar.bz2 

這是本地刪除某個文件,在下次 osc ci 生效。

osc rdelete home:MargueriteSu test  

這是完全的在伺服器上毀掉一個包。

osc rremove home:MargueriteSu test Source.tar.bz2 

這是在伺服器上毀掉一個包中的某個文件。注意 delete 指令 是不作用於遠端的,但是如果配合 osc up 可以本地實現遠程刪除包, 前提是這個包在本地目錄要有,比如


[火星人 ] 學姐帶你學 OBS常用命令已經有1560次圍觀

http://coctec.com/docs/linux/show-post-65254.html