2011-09-23 7 views
5

私たちのチームは、RHEL/CentOSで配布されているさまざまなパッケージのカスタマイズを頻繁に行っています。私たちのワークフローは、ソースを解凍し、パッチを適用するrpmbuild -bpを実行し、SRPMをインストールする私たちの変更を行うと、specファイルに含まれる.patchファイルを作成し、モックで後で使用するためにカスタマイズされた新しいSRPMを構築含まれますgitを使用してSRPMのカスタマイズを追跡するにはどうすればよいですか?

$ rpm -i grub-0.97-13.5.1.src.rpm 
$ rpmbuild -bp rpmbuild/SPECS/grub.spec 
$ cp -a rpmbuild/BUILD/grub-0.97 grub-0.97.orig 
$ cd rpmbuild/BUILD/grub-0.97 
    # Make modifications, generate .patch against ".orig" copy 
$ vim rpmbuild/SPECS/grub.spec 
    # Add custom .patch to specfile, update version, etc 
$ rpmbuild -bs rpmbuild/SPECS/grub.spec 
$ mock -r default-x86_64.cfg rpmbuild/SRPMS/grub-0.97-13.5.1.custom-1.src.rpm 

このプロセスはうまくいきますが、私たちは現在、ソースコントロールの形式を使用して、変更とスペックファイルの変更を追跡していません。 gitの私の(根本的には)理解に基づいて、私はこのワークフローにそれを注入し、いくつかの力を活用して(SCMの通常の利点に加えて)いくつかのステップを最適化することが可能であるべきだと思います。

たとえば、ソースのコピーをdiffに作成するのではなく、後で修正したアップストリームパッチソースの最初のコミットを作成して修正することができます。準備ができたら、git format-patchを使用してフィーチャーパッチを作成し、スペックファイルに追加します。

また、仕様ファイルもバージョン管理したいと思いますが、それを達成するにはどうすればよいかわかりません。


だから私の質問は3つあり:上流のパッケージをカスタマイズするとき

  1. そこに誰もがSCMを使用していますか?
  2. 私たちのワークフローにgitを統合する最も効果的な方法は何ですか?
  3. バージョン管理されたカスタムRPMオーサリングにより適したワークフローがありますか?

エクストラクレジット:どのように私はプッシュを受け入れるための中央リポジトリを構築するだろう、のgitベースのワークフローを想定すると?サブモジュールと1つのレポ? 1パッケージにつき1レポですか?

答えて

7

アップストリームパッケージのカスタマイズ時にSCMを使用する人はいますか?

確かに。これはかなり一般的です。

私たちのワークフローにgitを統合する最も効果的な方法は何ですか? バージョン管理された カスタムRPMオーサリングにより適したワークフローがありますか?

私は約最も効果的なを知っているが、ここで私は何をすべきかだはありません。私は と、次の~/.rpmmacrosファイルを起動します。

%_topdir %(echo ${RPM_TOPDIR:-$HOME/redhat}) 
%_specdir %{_topdir}/PACKAGES/%{name}/%{version} 
%_sourcedir %{_topdir}/PACKAGES/%{name}/%{version}/sources 
%_rpmdir %{_topdir}/PACKAGES/%{name}/%{version}/rpms 

私は(たとえば、FOO-1.0-1.src.rpm)パッケージをインストールする場合は、specファイルが ~/redhat/PACKAGES/foo/1.0/foo.specで終わる、とソースのtarballを(と任意の パッチ)は、~/redhat/PACKAGES/foo/1.0/sourcesになります。

は今、私はgitリポジトリとしてパッケージディレクトリを初期化します。

cd ~/redhat/PACKAGES/foo/1.0 
git init 
git add foo.spec sources/*.patch 
git ci -m 'initial commit' 

specファイルへの記録の変更についての特別なものは何もありません:私は、ソースファイルをパッケージに変更を加える必要がある場合は

git ci -m 'made some really spiffy changes' foo.spec 

rpmbuild -bp foo.spec 

そして今、私は一時的なGitのrepositoを作成します、私はこれを行いますRY:

cd ~/redhat/BUILD/foo-1.0 
git init 
git add . 
git ci -m 'initial commit' 
git tag upstream 

私は変更を加えた場合、私は に対して、このような上流のパッケージのパッチを生成することができますここから:

git diff upstream 

をそれとも私がコミットのシリーズを作った場合には、I一連のパッチを作成するためのgitのformat-patchコマンド を使用することができます。

$ git format-patch upstream 
0001-added-text.patch 
0002-very-important-fix.patch 

そして、これらが適切なにコピーすることができますディレクトリにコピーし、 をspecファイルに追加しました。

の変更を追跡するために作成した一時的なgitリポジトリは、次回にrpmbuildを実行したときにビルドディレクトリが消去されることに注意してください。

+0

偉大な答えです。 1つの追加:私は通常、軽微なdevに 'mock'を使い、依存関係がインストールされていなければrpmbuildは文句を言うでしょう。 rpmbuildに '--nodeps'を追加すると、誰もが幸せになれます。 – Mansour

+0

なぜ消え去りますか? – MarkHu

+0

ビルドプロセスの一環として、 'BUILD'ディレクトリの内容はrpmによって削除されます。もちろん、このリポジトリを他のどこかで永続的に管理することができます。 – larsks

関連する問題