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が使えるようになるおまじない(一部ブラウザでは使えない。。。)
<VirtualHost *:443>
        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"
 
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        BrowserMatch ".*MSIE.*" \
                nokeepalive ssl-unclean-shutdown \
                downgrade-1.0 force-response-1.0
 
        <Directory "/var/www/yum">
                AddDefaultCharset UTF-8
                AllowOverride All
                Require all granted
                Options Indexes FollowSymLinks
                ContentDigest on
                IndexOptions FancyIndexing ScanHTMLTitles IconsAreLinks FoldersFirst Charset=UTF-8 VersionSort XHTML
        </Directory>
</VirtualHost>
# 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>  = 鍵は n 日間で満了
      <n>w = 鍵は n 週間で満了
      <n>m = 鍵は n か月間で満了
      <n>y = 鍵は n 年間で満了
鍵の有効期間は? (0)
Key does not expire at all
これで正しいですか? (y/N) y
 
あなたの鍵を同定するためにユーザーIDが必要です。
このソフトは本名、コメント、電子メール・アドレスから
次の書式でユーザーIDを構成します:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
 
本名: Mock Build
電子メール・アドレス: mockbuild@yum.example.com
コメント: mockbuild
次のユーザーIDを選択しました:
    “Mock Build (mockbuild) <mockbuild@yum.example.com>”
 
名前(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 <mockbuild@yum.example.com> - 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.