Yumのレポジトリを立ててmockで独自パッケージの作成と配布

サーバー運用がかなり厳しいので寄付をしてくれる人がいたらこちら
メインPCもボロボロになってきたので、ついにほしいものリスト公開

ということで久しぶりの新規ページですよ。。。
各種アプリケーションをソースからコンパイルしてうんちゃらっていうのもいいんですが、
やっぱりパッケージにしておくとサーバー再構築するときとか便利なんですよね。
てなわけで自前でyum用のレポジトリを立ててほとんどのものはyum上で管理するってことにしました。
deltarpmとかいろいろあるみたいですが、とりあえずはyumでインストールとアップデートができる環境を整えます。

fedora 21からyumのほかにdnfというツールでもパッケージ管理を行うようになり、
fedora 22になるとyumはdeprecatedでdnf使えやゴルァになりました。
それに伴い、mock側でもそのままで実行するとその時点でエラーとなり実行できなくなるので
コマンドオプションでmock --dnf xxx.rpmを指定するか、/etc/mock/site-defaults.cfgのconfig_opts['dnf_command'] = '/usr/bin/dnf'
のコメントを外しておきましょう。

事前準備

まずはApacheでアクセス可能な環境を整えておきましょう。
例としてyum.example.comドメインで且つSSL対応でやってみます。

また、環境はDocrootを/var/www/yumにして
主要部分のみ抜粋しています。
SSLの鍵の作成方法とかは適宜追加するかも。。

Listen 443 https SSLStrictSNIVHostCheck off # vhostでSSLが使えるようになるおまじない(一部ブラウザでは使えない。。。) Serveradmin hostmaster@yum.example.com DocumentRoot /var/www/yum ServerName yum.example.com CustomLog logs/yum_ssl_access_log combined ErrorLog logs/yum_ssl_error_log SSLEngine on SSLCertificateFile "/etc/pki/tls/certs/yum.crt" SSLCertificateKeyFile "/etc/pki/tls/certs/yum.key" SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5 SSLCACertificatePath "/etc/pki/CA" SSLCACertificateFile "/etc/pki/CA/cacert.pem" SSLOptions +StdEnvVars BrowserMatch ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 AddDefaultCharset UTF-8 AllowOverride All Require all granted Options Indexes FollowSymLinks ContentDigest on IndexOptions FancyIndexing ScanHTMLTitles IconsAreLinks FoldersFirst Charset=UTF-8 VersionSort XHTML # yum -y install createrepo repoview rpmdevtools mock

次にGPG鍵を用意しますが、ついでに後述のmockで
利用するためのアカウントなども追加しておきます。

# groupadd -g 6000 mock # useradd -g mock -u 60000 -d /var/lib/mock -c "RPM build user" mockbuild # yum -y install mock # chown -R mockbuild. /var/lib/mock # su - mockbuild $ gpg --gen-key --snip-- RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 要求された鍵長は2048ビット 鍵の有効期限を指定してください。 0 = 鍵は無期限 = 鍵は n 日間で満了 w = 鍵は n 週間で満了 m = 鍵は n か月間で満了 y = 鍵は n 年間で満了 鍵の有効期間は? (0) Key does not expire at all これで正しいですか? (y/N) y あなたの鍵を同定するためにユーザーIDが必要です。 このソフトは本名、コメント、電子メール・アドレスから 次の書式でユーザーIDを構成します: "Heinrich Heine (Der Dichter) " 本名: Mock Build 電子メール・アドレス: mockbuild@yum.example.com コメント: mockbuild 次のユーザーIDを選択しました: “Mock Build (mockbuild) ” 名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O 秘密鍵を保護するためにパスフレーズがいります。 パスフレーズを入力: パスフレーズを再入力: 今から長い乱数を生成します。キーボードを打つとか、マウスを動かす --snip-- gpg: /var/lib/mock/.gnupg/trustdb.gpg: 信用データベースができました gpg: 鍵XXXXXXXXを絶対的に信用するよう記録しました 公開鍵と秘密鍵を作成し、署名しました。 $ gpg -o RPM-GPG-KEY-mockbuild -a --export XXXXXXXX $ vi /var/lib/mock/.rpmmacros --------------cut here--------------------- # for other rhel/fedora key %_gpg_name 0xXXXXXXXX %_gpg_path /var/lib/mock/.gnupg %_gpgbin /usr/bin/gpg %_signature gpg %_topdir %(echo $HOME)/rpmbuild --------------cut here--------------------- $ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

rootでGPG鍵を読み込んで、yum用のrepoファイルの設定を追加しておく

# mv RPM-GPG-KEY-mockbuild /etc/pki/rpm-gpg/ # rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-mockbuild # vi /etc/yum.repos.d/myrepo.repo [myrepo] name=myrepo $releasever - $basearch failovermethod=priority baseurl=https://yum.example.com/fedora/$releasever/$basearch/ enabled=0 metadata_expire=7d gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mockbuild sslverify=0 #sslcacert=/etc/pki/CA/myrepo.pem [myrepo-debuginfo] name=momo-i.org $releasever - $basearch - Debug failovermethod=priority baseurl=https://yum.example.com/fedora/$releasever/$basearch/debug/ enabled=0 metadata_expire=7d gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mockbuild sslverify=0 #sslcacert=/etc/pki/CA/myrepo.pem [myrepo-source] name=myrepo $releasever - Source failovermethod=priority baseurl=https://yum.example.com/fedora/$releasever/SRPMS/ enabled=0 metadata_expire=7d gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mockbuild sslverify=0 #sslcacert=/etc/pki/CA/myrepo.pem

yumでインストールするときに鍵(XXXXXXXX)で署名されていないと
デフォルトではインストールができない(yumのオプションで回避可能)ので
忘れずに作成とエクスポートしておきましょう。

なお、Proxyを使わないと外に行けない場合は
/etc/mock/site-defaults.cfgを修正することで
mockがProxyを使うようになります

開いて最下部に以下を追記

config_opts['http_proxy'] = 'http://proxy.server.example.com:3128'

さて、これで準備は整いましたので、実際にmockで遊んでみましょう。

# su - mockbuild $ cd rpmbuild/SPECS $ cp /etc/rpmdevtools/spectemplate-minimal.spec myapp.spec $ vi myapp.spec

specファイルのGroupの命名規則とかは/usr/share/doc/rpm*/GROUPSに載ってます。

以下は例なので、実際にコピペしても無駄です。。。
やりたい方は適当なソースRPMを拾ってきて編集してください。。。
ここでは、Fedora20のx86_64で作っています。

Name: myapp Version: 1.0 Release: 1%{?dist} Summary: my example apps Group: Applications/Internet License: MIT URL: http://yum.example.com Source0: http://yum.example.com/src/%{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: myapp-build-req Requires: myapp-req %description This is my app! %prep %setup -q %build %configure make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc README %{_bindir}/myapp %{_mandir}/man1/myapp.1* %changelog * Fri Jan 01 1971 mockbuild - 1.0-1 - Initial rpm release.

こんな感じで作ったらソースRPMを作りましょう。

$ rpmbuild -bs --clean myapp.spec --nodeps $ cd /var/lib/mock/rpmbuild/SRPMS $ mock -v myapp-1.0-1.fc20.src.rpm ......snip.....

他のOS用のものを作りたい場合は/etc/mock/*.cfgファイルの.cfgを抜いたものをコマンドラインに使用します。

$ mock -v -r epel-6-x86_64 myapp-1.0-1.fc20.src.rpm

ERROR:とかで異常終了していなければ次のステップ
rpmへの署名を行います。

$ cd /var/lib/mock/fedora-20-x86_64/result $ ls myapp-1.0-1.fc20.x86_64.rpm myapp-1.0-1.fc20.src.rpm myapp-debuginfo-1.0-1.fc20.x86_64.rpm $ rpm --resign *.rpm パスフレーズの入力: パスフレーズは正常です。 ~~

これが終わったらmockbuildをexitして
このファイルを↑のmyrepo.repoで記載した通りのフォルダに放り込んでおきます。

# mkdir -p /var/www/yum/fedora/20/{SRPMS,x86_64,i386} # mkdir -p /var/www/yum/fedora/20/x86_64/debug # mkdir -p /var/www/yum/fedora/20/i386/debug # cp myapp-1.0-1.fc20.x86_64.rpm /var/www/yum/fedora/20/x86_64/ # cp myapp-1.0-1.fc20.src.rpm /var/www/yum/fedora/20/SRPMS/ # cp myapp-debuginfo-1.0-1.fc20.x86_64.rpm /var/www/yum/fedora/20/x86_64/debug/

最後にレポジトリを作成するためのコマンドを実行しておきます。

# createrepo -d --excludes=*debug* /var/www/yum/fedora/20/SRPMS # repoview --title="My repository" --url="https://yum.example.com/fedora/20/SRPMS" /var/www/yum/fedora/20/SRPMS # createrepo -d --excludes=*debug* /var/www/yum/fedora/20/x86_64 # repoview --title="My repository" --url="https://yum.example.com/fedora/20/x86_64" /var/www/yum/fedora/20/x86_64 # createrepo -d /var/www/yum/fedora/20/x86_64/debug # repoview --title="My repository" --url="https://yum.example.com/fedora/20/x86_64/debug" /var/www/yum/fedora/20/x86_64/debug

これで作業は完了です。

あとはyumコマンドで実際にインストール可能かを試してみましょう

# yum --enablerepo=myrepo install myapp

Proxyサーバー経由でしかmock使えねえよゴルァという人は/etc/mock/site-defaults.cfgの
以下の行を修正することで使えるようになるらしいです

# Proxy settings (https_proxy, ftp_proxy, and no_proxy can also be set) # config_opts['http_proxy'] = 'http://localhost:3128'

# Proxy settings (https_proxy, ftp_proxy, and no_proxy can also be set) config_opts['http_proxy'] = 'http://proxyserver:8080' config_opts['https_proxy'] = 'http://proxyserver:8080' config_opts['ftp_proxy'] = 'http://proxyserver:8080' config_opts['no_proxy'] = '*example.com'

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
CAPTCHA
また変更しました
Fill in the blank.