Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@walk8243

配布するためのRPMパッケージをビルドする

More than 1 year has passed since last update.

はじめに

色々気にして、未だにオンプレミスな環境から抜け出せないプロダクトは存在します。
そのようなプロダクトで自動デプロイしようと思うと色々面倒だったりします。
そこで、デプロイ時に色々するのではなく、ビルド時に作ったものをそのままデプロイして使える状態にすることが求められることがあるかと思います。
そんなとき、RedHatやCentOSのようなRPM系Linuxディストリビューションである場合、RPMパッケージを作成しそれを配布するという手段をとることができます。
ということで、RPMパッケージをビルドして、配布できる状態を作りたいと思います。

この記事のゴールは、実行ファイルをRPMパッケージとして配布できる状態にすることです。
実行ファイルとして、C言語をコンパイルしたものを使用しています。
また、この記事の中での実行環境は CentOS8 1905 です。

必要なパッケージをインストール

以下のものを dnf コマンドを使ってインストールします。

  • gcc
  • rpmbuild
sudo dnf install -y gcc rpm-build

サンプルスクリプト

この記事の中で使用するファイルは全て、GitHub上の walk8243/rpm-hello に上げてあります。

C言語

hello.c
#include <stdio.h>

void main() {
    printf("hello world.\n");
}

RPM SPECファイル

hello.spec
###############################################################################
# Spec file for utils
################################################################################
# Configured to be built by user develop or other non-root user
################################################################################
#
Summary: Hello scripts for testing RPM creation
Name: hello
Version: 1.0.0
Release: 1
License: GPL
URL: http://www.walk8243.xyz
Group: System
Packager: walk8243


%description
A collection of hello scripts for testing RPM creation.


%prep
################################################################################
# Create the build tree and copy the files from the development directories    #
# into the build tree.                                                         #
################################################################################
echo "BUILDROOT = $RPM_BUILD_ROOT"
mkdir -p $RPM_BUILD_ROOT/usr/local/bin/

cp $SRC_ROOT/hello $RPM_BUILD_ROOT/usr/local/bin

exit


%files
%attr(0755, root, root) /usr/local/bin/*


%clean
rm -rf $RPM_BUILD_ROOT/usr/local/bin

# Build with the following syntax:
# export SRC_ROOT=$(pwd) && rpmbuild -bb hello.spec

RPMのビルド時のディレクトリ構成

ホームディレクトリ直下で walk8243/rpm-hello をクローンしたとします。
すると、以下のようなディレクトリ構成になっているはずです(必要最小限のものだけ書いています)。

~
 `- rpm-hello
     |- hello.c
     `- hello.spec

これで準備はできましたので、実際にビルドしていきます。

RPMパッケージのビルド

以下のスクリプトを順に実行して、RPMパッケージをビルドします。
このときのカレントディレクトリは、クローンした rpm-hello である想定です。

# C言語のコンパイル
gcc hello.c -i hello

# RPMパッケージのビルド
export SRC_ROOT=$(pwd) && rpmbuild -bb hello.spec

# RPMパッケージの確認
sudo rpm -ivh $(find ~/rpmbuild/RPMS/ -name "hello*.rpm")
hello

上記のコマンドを叩いて、 hello world. と出れば成功です。

RPMパッケージの詳細情報を見る

rpm -qpi $(find ~/rpmbuild/RPMS/ -name "hello*.rpm")

すると、以下のように内容が表示されると思います。

Name        : hello
Version     : 1.0.0
Release     : 1
Architecture: x86_64
Install Date: (not installed)
Group       : System
Size        : 13464
License     : GPL
Signature   : (none)
Source RPM  : hello-1.0.0-1.src.rpm
Build Date  : Sat Oct 12 02:21:35 2019
Build Host  : localhost
Relocations : (not relocatable)
Packager    : walk8243
URL         : http://www.walk8243.xyz
Summary     : Hello scripts for testing RPM creation
Description :
A collection of hello scripts for testing RPM creation.

インストール後に dnf を使ってパッケージ情報を取得する( dnf info hello )と、以下のようになります。

Name         : hello
Version      : 1.0.0
Release      : 1
Arch         : x86_64
Size         : 13 k
Source       : hello-1.0.0-1.src.rpm
Repo         : @System
Summary      : Hello scripts for testing RPM creation
URL          : http://www.walk8243.xyz
License      : GPL
Description  : A collection of hello scripts for testing RPM creation.

わかったこと

rpmbuild ディレクトリは rpm-build が作ってくれる

色んなサイトで rpmbuild ディレクトリを作って、その中に適切にファイルを配置してって感じで書いていたが、全然そんなことはありませんでした。
SPECファイルの中で cp コマンドを使って配置することができるので、tarに圧縮してなどは考えなくていいです。

環境変数が使える

SPECファイル内で環境変数を使うことができます。
export をすることを忘れてはいけませんが、環境変数を使うことでビルドの設定は楽になるはずです。

さいごに

これまでRPMパッケージを作ることはハードルが高いことだと思っていました。
しかし、ビルドして配布するだけなら簡単に行えることを今回知ることができました。
まだオンプレミスな環境から抜け出せないプロダクトもあるので、そのような環境で一括管理するときなどで使っていこうと思います。

ただ、気を付けなければならないのが、作ったものを配布するということは、動作を保証するということになります。
配布する範囲はどの程度なのか、どこまでの環境を担保するのかなどなど、実際に配布する際には気を付けなければなりません。

参考

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
walk8243
ただの乃木オタです。 業務中に感じた良く分からない気持ち悪さを、形にして解決するにはどうしたらいいかを考えながら記事を書いてます。 執筆は握手会の会場でできるからいいですね!
yahoo-japan-corp
Yahoo! JAPAN を運営しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?