見出し画像

自分で作ったRPMパッケージを自前のyumリポジトリで公開してみた

こんにちは。アイシーティーリンクの増田です。

私は2年ほど前に、主に開発業務を生業としている会社から転職してきました。ところ変われば文化も変わり、当初は戸惑うことも多かったですが、異常と感じていたものもやがて日常に変わり、今では日々楽しく働いています。三年たってませんが、「石の上にも三年」って言葉は言い得て妙ですね。

さて、先日三好さんが初心者向けにHyper-VでLinuxを立ち上げるまでを記事にしてくれたので、今日はLinuxをお題に一本書いてみようかと思います。まだ三好さんの記事を見ていないという方は見てきてくださいね。

今日のテーマですが、タイトルでネタバレしている通り、「自分で作ったRPMパッケージを自前のyumリポジトリで公開してみた。」です。三好さんの記事に乗っかっておきながら初心者向けではなく、細かいところは端折りますが、最後までお付き合いください。

<本記事の流れ>

1.RPMパッケージを作ってみる
2.RPMパッケージに署名をする
3.yumのリポジトリを作ってみる
4.作成したパッケージをクライアントにインストールしてみる

1.RPMパッケージを作ってみる

まず、RPMって何ぞ?という方もいらっしゃるかと思いますが、Red Hat Enterprise Linuxや、CentOSといったLinuxのディストリビューションが採用している、ソフトウェアのパッケージ管理のお約束事みたいなものです。

RPMパッケージの作成に必要なツールをインストールします。以下のコマンドです。

$ sudo yum groupinstall -y 'Development tools'
$ sudo yum install -y rpm-build
$ sudo yum install -y rpmdevtools yum-utils

今回はCentOS7でやってみたので、「開発者ツール」の一式と、「rpm-build」が必要ですが、"rpmdev-setuptree"コマンドを使うと、必要なディレクトリ作成などをまとめておぜん立てしてくれるので、「rpmdevtools」と「yum-utils」も入れておきます。

また、パッケージを作るには元ネタになるソフトウェアが必要なのですが、今日はExpressのHello World!!(https://expressjs.com/ja/starter/hello-world.html)プログラムをリンク先の通りに作成し、使用します。

出来上がったmyappディレクトリをtar.gz形式で固めます。

$ tar cvzf myapp-1.0.tar.gz myapp

RPM作成用の環境を作成します。ユーザーのホームディレクトリで以下のコマンドを実行します。

$ rpmdev-setuptree

SOURCESディレクトリにtarをコピーします。

$ cp ~/myapp-1.0.tar.gz ~/rpmbuild/SOURCES/

RPMパッケージの作成方法や、パッケージインストール時に実行するコマンドなど細かいレシピはSPECファイルというものに記載します。本来は依存するパッケージなど細かい定義をするべきなのですが、お試しなのでシンプルな定義にします。以下の内容をmyapp.specといった名前で保存してください。

%define name myapp
%define version 1.0
%define unmangled_version 1.0
%define release 1
%define _binaries_in_noarch_packages_terminate_build 0

Summary: sanple hello world program
Name: %{name}
Version: %{version}
Release: %{release}
License: MIT
Source0: %{name}-%{unmangled_version}.tar.gz
Group: Applications/File
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
Prefix: %{_prefix}
BuildArch: noarch

%define INSTALLDIR %{buildroot}/opt

%description
This is a sample program to learn how to make a rpm package.

%prep
rm -rf %{RPM_BUILD_ROOT}

%build

%install
rm -rf %{INSTALLDIR}
mkdir -p %{INSTALLDIR}
tar -C %{INSTALLDIR} -xzf /home/mockbuild/rpmbuild/SOURCES/%{name}-%{unmangled_version}.tar.gz

%clean
rm -rf %{buildroot}

%files
/opt
%defattr(-,root,root)

作成したファイルはSPECディレクトリに格納します。

$ cp ./myapp.spec ~/rpmbuild/SPECS

パッケージをビルドします。

$ rpmbuild -bb ./rpmbuild/SPECS/myapp.spec

~/rpmbuild/RPMS/noarch/にmyapp-1.0-1.noarch.rpmが出来上がります。

2.RPMパッケージに署名をする

作ったRPMパッケージには署名を入れましょう。Windowsでもどこの誰が作ったのかわからないアプリケーションの実行時に警告が出ますよね?

以下のコマンドで必要なパッケージをインストールします。

$ sudo yum install -y gpg

署名に使う鍵を作成します。

$ gpg --gen-key

コマンド実行した際にいくつか質問されますので、鍵の種類、長さ、有効期限については、規定値のままで構いません。鍵のIDとなる本名とメールアドレスは有効なものを入力してください。コメントも聞かれますが、不要であれば入力の必要はありません。最後にパスフレーズを聞かれますので、入力してください。

鍵の生成中に無負荷で放置すると時間がかかるので、別窓で以下のコマンドを投入するなどして適当な負荷をかけるのをお勧めします。

$ dd if=/dev/urandom of=/tmp/mass bs=1M count=512

作成した鍵を確認するには以下のコマンドを入力します。

$ gpg --list-keyさ

作成した鍵をファイルに書き出します。

$ gpg --export -a '鍵の作成時に指定した本名' > '鍵ファイル名'

鍵ファイルをRPMのデータベースに登録します。

$ sudo rpm -import '鍵ファイル名'

~/.rpmmacrosに下記の内容を追加します。<鍵の所有者名>は鍵の作成時に指定した本名です。

%_signature gpg
%_gpg_name <鍵の所有者名>

RPMファイルに署名をします。このとき、鍵の作成時に入力したパスフレーズを求められます。

$ rpm -addsign ~/rpmbuild/RPMS/noarch/myapp-1.0-1.noarch.rpm

RPMファイルの署名を検証します。

$ rpm -checksig ~/rpmbuild/RPMS/noarch/myapp-1.0-1.noarch.rpm
myapp-1.0-1.noarch.rpm: rsa sha1 (md5) pgp md5 OK

やっとRPMパッケージが出来上がりました。こちらをyumのリポジトリに登録し、他の端末にインストールできるようにします。

3.yumのリポジトリを作ってみる

さんざんyumコマンドでパッケージをインストールしてきましたが、yumでパッケージをインストールする際、rpmファイルはHTTPやFTPで転送します。ここではApacheでHTTPサーバーを用意します。

以下のコマンドでApacheをインストール、起動します。ついでに、自動起動の設定も入れておきましょう。

$ sudo yum install -y httpd
$ sudo systemctl start httpd
$ sudo systemctl enable httpdf

ブラウザで http://[IPアドレス]/ にアクセスしてテストページが表示されることを確認します。以下の画面が表示されれば成功です。簡単ですね。

Apacheテストページ

続いて、公開用のyumリポジトリを作成します。
まずは、createrepoパッケージをインストールします。

$ sudo yum install -y createrepo

/var/www/html(デフォルトのドキュメントルート) 配下にリポジトリ用のディレクトリを作成します。
今回は1つだけ作りますが、パッケージの対象アーキテクチャ等によっていくつかに分けても構いません。

# cd /var/www/html
# mkdir -p ./repos/RPMS/noarch

作成したディレクトリにrpmファイルを格納して、リポジトリを作成します。

# cp /home/test/rpmbuild/RPMS/noarch/myapp-1.0-1.noarch.rpm ./repos/RPMS/noarch
# createrepo ./repos

これでyumのリポジトリが出来ました。クライアントからインストールしてみましょう。

4.作成したパッケージをクライアントにインストールしてみる

作成したパッケージをyumでインストールするために、Hyper-Vでもう1台マシンを用意します。以下のようなシンプルな構成で行きます。

接続構成

クライアント側のRPMのデータベースにも鍵ファイルを登録します。

# rpm -import '鍵ファイル名'

yumのリポジトリ設定ファイル(/etc/yum.repos.d/ICTL.repo)を作成します。
baseurlはサーバー上のrepodataディレクトリが配置されたディレクトリパスを指定します。

#ICTLINK Corp. yum repository
[ICTLINK]
name=ICTLINK RPM packages
baseurl=http://[サーバーのIP]/repos/

パッケージをインストールしてみます。

# yum install myapp

上手くいくとこんな感じになります。

yumインストール

黒と白の色気のない世界で初心者向けではないですが、くじけずトライしていただけると嬉しいです。

いいなと思ったら応援しよう!