centos

2015年03月25日

このエントリーをはてなブックマークに追加

GitリポジトリのツリーをRPMとして手っ取り早くパッケージングしたかった。手順をまとめ、git2rpmとして実装・公開してみた。

主な特徴・制約

  • Gitリポジトリを指定して実行するとRPMが生成される
  • パッケージ名は rpm4<パッケージ名>
  • インストール先は/home/git2rpm/<パッケージ名>
  • コミット履歴をもとにバージョン番号<コミット時刻>git<コミットハッシュ>を生成

使い方

引数にGitリポジトリURIを指定するだけ。

$ git2rpm <git-repo>

git2rpm実行例

試しに https://github.com/hansode/makistrano を一撃でrpm化してみる。

1: Gitリポジトリを指定してgit2rpmを実行
$ ./git2rpm https://github.com/hansode/makistrano.git
+ repouri=https://github.com/hansode/makistrano.git
+ reponame=makistrano.git
+ reponame=makistrano
+ reponame=rpm4makistrano
+ mkdir -p /home/vagrant/rpmbuild/BUILD /home/vagrant/rpmbuild/BUILDROOT /home/vagrant/rpmbuild/RPMS /home/vagrant/rpmbuild/SOURCES /home/vagrant/rpmbuild/SPECS /home/vagrant/rpmbuild/SRPMS
+ [[ -d rpm4makistrano ]]
+ cd rpm4makistrano
+ git pull
Already up-to-date.
++ git log HEAD -n 1 --pretty=format:%h
+ git_version=2add2a4
+++ git log 2add2a4 -n 1 --pretty=format:%cd --date=iso
++ date '--date=2013-11-18 18:07:42 -0800' +%Y%m%d%H%M%S
+ git_datetime=20131119110742
+ build_id=20131119110742git2add2a4
+ cd /home/vagrant/rpmbuild/SPECS
+ cat
+ rpmbuild -bb rpm4makistrano.spec --define 'repouri https://github.com/hansode/makistrano.git' --define 'reponame rpm4makistrano' --define 'build_id 20131119110742git2add2a4'
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.qpo4o6
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ '[' -d rpm4makistrano-20131119110742git2add2a4 ']'
+ rm -rf rpm4makistrano-20131119110742git2add2a4
+ git clone https://github.com/hansode/makistrano.git rpm4makistrano-20131119110742git2add2a4
Initialized empty Git repository in /home/vagrant/rpmbuild/BUILD/rpm4makistrano-20131119110742git2add2a4/.git/
remote: Counting objects: 278, done.
remote: Total 278 (delta 0), reused 0 (delta 0), pack-reused 278
Receiving objects: 100% (278/278), 36.30 KiB, done.
Resolving deltas: 100% (106/106), done.
+ cd rpm4makistrano-20131119110742git2add2a4
+ :
+ cd /home/vagrant/rpmbuild/BUILD
+ cd rpm4makistrano-20131119110742git2add2a4
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.pRFBqi
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ cd rpm4makistrano-20131119110742git2add2a4
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.bbDnBu
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ '[' /home/vagrant/rpmbuild/BUILDROOT/rpm4makistrano-20131119110742git2add2a4-1.el6.x86_64 '!=' / ']'
+ rm -rf /home/vagrant/rpmbuild/BUILDROOT/rpm4makistrano-20131119110742git2add2a4-1.el6.x86_64
++ dirname /home/vagrant/rpmbuild/BUILDROOT/rpm4makistrano-20131119110742git2add2a4-1.el6.x86_64
+ mkdir -p /home/vagrant/rpmbuild/BUILDROOT
+ mkdir /home/vagrant/rpmbuild/BUILDROOT/rpm4makistrano-20131119110742git2add2a4-1.el6.x86_64
+ cd rpm4makistrano-20131119110742git2add2a4
+ LANG=C
+ export LANG
+ unset DISPLAY
+ rm -rf /home/vagrant/rpmbuild/BUILDROOT/rpm4makistrano-20131119110742git2add2a4-1.el6.x86_64
+ mkdir -p /home/vagrant/rpmbuild/BUILDROOT/rpm4makistrano-20131119110742git2add2a4-1.el6.x86_64//home/git2rpm/rpm4makistrano
++ pwd
+ rsync -aHA --exclude=.git '--exclude=.git/*' /home/vagrant/rpmbuild/BUILD/rpm4makistrano-20131119110742git2add2a4/ /home/vagrant/rpmbuild/BUILDROOT/rpm4makistrano-20131119110742git2add2a4-1.el6.x86_64//home/git2rpm/rpm4makistrano/
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id /home/vagrant/rpmbuild/BUILD/rpm4makistrano-20131119110742git2add2a4
+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-python-bytecompile
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: rpm4makistrano-20131119110742git2add2a4-1.el6.noarch
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /bin/bash /bin/sh
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/vagrant/rpmbuild/BUILDROOT/rpm4makistrano-20131119110742git2add2a4-1.el6.x86_64
warning: Could not canonicalize hostname: vagrant-centos6
Wrote: /home/vagrant/rpmbuild/RPMS/noarch/rpm4makistrano-20131119110742git2add2a4-1.el6.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.xqZHo1
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ cd rpm4makistrano-20131119110742git2add2a4
+ rm -rf /home/vagrant/rpmbuild/BUILDROOT/rpm4makistrano-20131119110742git2add2a4-1.el6.x86_64
+ exit 0

/home/vagrant/rpmbuild/RPMS/noarch/rpm4makistrano-20131119110742git2add2a4-1.el6.noarch.rpm が生成された。

  • パッケージ名はrpm4makistrano
  • バージョンは20131119110742git2add2a4
2: 生成されたrpmをインストールしてみる
$ sudo yum install --disablerepo='*' /home/vagrant/rpmbuild/RPMS/noarch/rpm4makistrano-20131119110742git2add2a4-1.el6.noarch.rpm                  Loaded plugins: fastestmirror
Setting up Install Process
Examining /home/vagrant/rpmbuild/RPMS/noarch/rpm4makistrano-20131119110742git2add2a4-1.el6.noarch.rpm: rpm4makistrano-20131119110742git2add2a4-1.el6.noarch
Marking /home/vagrant/rpmbuild/RPMS/noarch/rpm4makistrano-20131119110742git2add2a4-1.el6.noarch.rpm to be installed
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package rpm4makistrano.noarch 0:20131119110742git2add2a4-1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===================================================================================================================================================================================
 Package                        Arch                   Version                                         Repository                                                             Size
===================================================================================================================================================================================
Installing:
 rpm4makistrano                 noarch                 20131119110742git2add2a4-1.el6                  /rpm4makistrano-20131119110742git2add2a4-1.el6.noarch                  40 k

Transaction Summary
===================================================================================================================================================================================
Install       1 Package(s)

Total size: 40 k
Installed size: 40 k
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : rpm4makistrano-20131119110742git2add2a4-1.el6.noarch                                                                                                            1/1
  Verifying  : rpm4makistrano-20131119110742git2add2a4-1.el6.noarch                                                                                                            1/1

Installed:
  rpm4makistrano.noarch 0:20131119110742git2add2a4-1.el6

Complete!
3: rpmの情報を確認
$ rpm -qi rpm4makistrano
Name        : rpm4makistrano               Relocations: /home/git2rpm/rpm4makistrano
Version     : 20131119110742git2add2a4          Vendor: (none)
Release     : 1.el6                         Build Date: Mon 16 Mar 2015 06:31:31 PM JST
Install Date: Mon 16 Mar 2015 06:33:05 PM JST      Build Host: vagrant-centos6
Group       : Unspecified                   Source RPM: rpm4makistrano-20131119110742git2add2a4-1.el6.src.rpm
Size        : 41404                            License: BSD
Signature   : (none)
URL         : https://github.com/hansode/makistrano.git
Summary     : git2rpm
Description :
4: ファイルリストを確認
$ rpm -ql rpm4makistrano
/home/git2rpm/rpm4makistrano
/home/git2rpm/rpm4makistrano/.travis.yml
/home/git2rpm/rpm4makistrano/Makefile
/home/git2rpm/rpm4makistrano/README.md
/home/git2rpm/rpm4makistrano/bin
/home/git2rpm/rpm4makistrano/bin/maki
/home/git2rpm/rpm4makistrano/examples
/home/git2rpm/rpm4makistrano/examples/Makifile
/home/git2rpm/rpm4makistrano/functions
/home/git2rpm/rpm4makistrano/functions/makistrano.sh
/home/git2rpm/rpm4makistrano/test
/home/git2rpm/rpm4makistrano/test/Makefile
/home/git2rpm/rpm4makistrano/test/integration
/home/git2rpm/rpm4makistrano/test/integration/Makefile
/home/git2rpm/rpm4makistrano/test/integration/makistrano
/home/git2rpm/rpm4makistrano/test/integration/makistrano/Makefile
/home/git2rpm/rpm4makistrano/test/integration/makistrano/helper_shunit2.sh
/home/git2rpm/rpm4makistrano/test/integration/makistrano/t.makistrano_cli.sh
/home/git2rpm/rpm4makistrano/test/shunit2
/home/git2rpm/rpm4makistrano/test/unit
/home/git2rpm/rpm4makistrano/test/unit/Makefile
/home/git2rpm/rpm4makistrano/test/unit/makistrano
/home/git2rpm/rpm4makistrano/test/unit/makistrano/Makefile
/home/git2rpm/rpm4makistrano/test/unit/makistrano/helper_shunit2.sh
/home/git2rpm/rpm4makistrano/test/unit/makistrano/t.makistrano_cli.sh
/home/git2rpm/rpm4makistrano/test/unit/makistrano/t.makistrano_eval.sh
/home/git2rpm/rpm4makistrano/test/unit/makistrano/t.makistrano_load_config.sh
/home/git2rpm/rpm4makistrano/test/unit/makistrano/t.makistrano_node.sh
/home/git2rpm/rpm4makistrano/test/unit/makistrano/t.makistrano_nodes.sh

/home/git2rpm/rpm4<パッケージ名>にインストールされている事が分かる。

TODO?

機能追加は、機能不足を感じた時など、気が向いた時に。

  • パッケージ名のprefixrpm4を無効化・別名を指定出来るようにする?
  • インストール先を/home/git2rpmではないディレクトリを指定可能にする?
  • 単にファイルツリーをrpm化しているだけなので、make等のbuild手順を定義出来るようにする?
  • masterブランチだけでなく、他のブランチを指定?

機能追加すると使い辛くなりそうなので、使い辛さが残る程度が丁度良いのかも知れない。

まとめ

git2rpmを使う事により、rpmspecファイルを生成せずにrpmを一撃生成出来た。yumリポジトリと連携させると、バージョンを意識したデプロイ・管理をしやすくなるはずである。

あとがき

yumと連携しなければ、下記と大差がない。yumを使わないと意味がない。

$ git clone <git-uri> /home/git2rpm/<name>



編集
@hansode at 11:00|PermalinkComments(0)TrackBack(0)

2015年03月24日

このエントリーをはてなブックマークに追加

自作rpmの作成手順を説明する必要があった

何度か自作RPMして来たが、数年前の事であり、スクラッチから作る手順をすっかり忘れていた。今後、同じ事にならぬよう、整理と復習を兼ね、ここに書き残す。

必須項目を知るには、最小構成を知った方が良い

もしも最小構成RPM作成出来たとしたら、何が必須項目かを理解できるはずである。そこで、ファイル数の少ないツールをRPM化しながら進めて行く事にした。自作ツールhansode/makistranoが1ファイルで完結する作りなので、makistranoを使う。

いざ、自作RPMへ!

検証環境

  • CentOS release 6.6
  • rpm-build-4.8.0-37.el6.x86_64

事前準備

1: ビルド環境を構築
$ sudo yum install -y git rpm-build rpmlint
2: rpmbuild事前準備
$ mkdir -p ${HOME}/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

rpm作成作業へ

最小構成が目的であり、美しさは求めていない。

1: rpmspecファイルを作成

検証した限りで最小のrpmspecファイルが下記の通り。

$ cd ${HOME}/rpmbuild/SPECS
$ vi makistrano.spec
Name:           makistrano
Version:        0.1.0
Release:        1%{?dist}
Summary:        makistrano
License:        BSD

%description

%prep
[ -d %{name}-%{version} ] && rm -rf %{name}-%{version}
git clone https://github.com/hansode/makistrano %{name}-%{version}
cd %{name}-%{version}
: # don't delete this line.
%setup -T -D

%build

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/bin
cp bin/maki $RPM_BUILD_ROOT/usr/bin/

%clean
rm -rf $RPM_BUILD_ROOT

%files
/usr/bin/maki
%doc

%changelog

幾つかの項目を補足。

License: BSD

  • 他で流用する場合は、適切なライセンスに変更する必要あり

%prep

  • git clone https://github.com/hansode/makistrano
  • 一般的なRPMでは${HOME}/rpmbuild/SOURCE配下に事前配置するが、本rpmspecではgit cloneを利用し、手間を省いている

%install

  • bin/maki/usr/bin/makiへインストール

%files

  • /usr/bin/makiをパッケージング対象へ

2: rpmlintでrpmspecファイルの内容を確認

$ rpmlint makistrano.spec
makistrano.spec: W: no-buildroot-tag
0 packages and 1 specfiles checked; 0 errors, 1 warnings.

もしも問題がある場合は、rpmlintが警告してくれる。

3: rpmbuildを実行

$ rpmbuild -bb makistrano.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.LhEZL4
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ '[' -d makistrano-0.1.0 ']'
+ rm -rf makistrano-0.1.0
+ git clone https://github.com/hansode/makistrano makistrano-0.1.0
Initialized empty Git repository in /home/vagrant/rpmbuild/BUILD/makistrano-0.1.0/.git/
remote: Counting objects: 278, done.
remote: Total 278 (delta 0), reused 0 (delta 0), pack-reused 278
Receiving objects: 100% (278/278), 36.30 KiB, done.
Resolving deltas: 100% (106/106), done.
+ cd makistrano-0.1.0
+ :
+ cd /home/vagrant/rpmbuild/BUILD
+ cd makistrano-0.1.0
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.MPZw45
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ cd makistrano-0.1.0
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.Qh0Vp7
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ cd makistrano-0.1.0
+ rm -rf /home/vagrant/rpmbuild/BUILDROOT/makistrano-0.1.0-1.el6.x86_64
+ mkdir -p /home/vagrant/rpmbuild/BUILDROOT/makistrano-0.1.0-1.el6.x86_64/usr/bin
+ cp bin/maki /home/vagrant/rpmbuild/BUILDROOT/makistrano-0.1.0-1.el6.x86_64/usr/bin/
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-strip
+ /usr/lib/rpm/brp-strip-static-archive
+ /usr/lib/rpm/brp-strip-comment-note
Processing files: makistrano-0.1.0-1.el6.x86_64
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /bin/bash
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/vagrant/rpmbuild/BUILDROOT/makistrano-0.1.0-1.el6.x86_64
warning: Could not canonicalize hostname: vagrant-centos6
Wrote: /home/vagrant/rpmbuild/RPMS/x86_64/makistrano-0.1.0-1.el6.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.6iMJEo
+ umask 022
+ cd /home/vagrant/rpmbuild/BUILD
+ cd makistrano-0.1.0
+ rm -rf /home/vagrant/rpmbuild/BUILDROOT/makistrano-0.1.0-1.el6.x86_64
+ exit 0

4: 出来上がったrpmをインストールしてみる

$ sudo rpm -ivh sudo rpm -ivh ${HOME}/rpmbuild/RPMS/x86_64/makistrano-0.1.0-1.el6.x86_64.rpm
/rpmbuild/RPMS/x86_64/makistrano-0.1.0-1.el6.x86_64.rpm
Preparing...                ########################################### [100%]
   1:makistrano             ########################################### [100%]

5: rpmの情報を確認

$ rpm -qi makistrano
Name        : makistrano                   Relocations: (not relocatable)
Version     : 0.1.0                             Vendor: (none)
Release     : 1.el6                         Build Date: Tue 24 Mar 2015 06:44:49 PM JST
Install Date: Tue 24 Mar 2015 06:45:18 PM JST      Build Host: vagrant-centos6
Group       : Unspecified                   Source RPM: makistrano-0.1.0-1.el6.src.rpm
Size        : 2391                             License: BSD
Signature   : (none)
Summary     : makistrano
Description :

6: ファイルリストを確認

$ rpm -ql makistrano
/usr/bin/maki
$ ls -l `rpm -ql makistrano`
-rwxr-xr-x 1 root root 2391 Mar 24 18:44 /usr/bin/maki

期待通り。

7: 削除出来る事を確認

$ sudo rpm -e makistrano
$ rpm -qi makistrano
package makistrano is not installed
$ ls -la /usr/bin/maki
ls: cannot access /usr/bin/maki: No such file or directory

後処理も問題ない。

まとめ

最小構成rpm/rpsmspecを無事に手に入れた。これにより、rpmspecに必要な項目が何であるかが判明した。もしも流用したい場合は、パッケージ名とGitリポジトリを変更すれば、直ぐに使える。簡易的なパッケージング用途には十分使えるはずである。

参考文献




編集
@hansode at 19:30|PermalinkComments(0)TrackBack(0)