Skip to content

Instantly share code, notes, and snippets.

@ochaochaocha3
Last active Jun 14, 2017
Embed
What would you like to do?
CentOS 7でHTTP/2に対応したnginxのRPMを自動生成する

CentOS 7でHTTP/2に対応したnginxのRPMを自動生成

HTTP/2対応nginxのrpmパッケージ作成とインストール | Skyarch Broadcasting」をRakeで自動化する。

準備

rpmbuilderユーザーを作る

初回は以下を実行してrpmbuilderユーザーを作る。

useradd rpmbuilder
sudo -u rpmbuilder -s
echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros

OpenSSL 1.1.0fを用意する

OpenSSLの方がnginxより更新間隔が長く見えたので、OpenSSLは先にダウンロード、展開しておいたものを使うようにしてみた。

現時点では、バージョンが上がったらそれに合わせてもう一度実行し、Rakefileを修正する必要がある。面倒なのでこれも自動化したい(Dir.exist? とかが使えそう)。

rpmbuilderユーザーで以下を実行する。

mkdir -p ~/src
wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz
tar -xf openssl-1.1.0f.tar.gz

Rakefileのダウンロード

このRakefileをダウンロードして、rpmbuilderユーザーから見える適当な場所に置く。今回は /home/rpmbuilder/tasks に置いてみた。

使い方

ダウンロードしたRakefileのディレクトリに移動し、rake nginx[バージョン] を実行する。正常に終了すれば、/home/rpmbuilder/rpmbuild/RPMS/x86_64 にRPMファイルができる。

例:

cd /home/rpmbuilder/tasks
rake nginx[1.13.1]
# vim: filetype=ruby
desc 'nginx の RPM を作成する。ver でバージョンを指定する。'
task :nginx, :ver do |t, args|
ver = args[:ver]
raise ArgumentError, 'バージョンが指定されていません' if !ver || ver.empty?
home_dir = File.expand_path('~')
openssl_dir = "#{home_dir}/src/openssl-1.1.0f"
src_rpm_url = "http://nginx.org/packages/mainline/centos/7/SRPMS/nginx-#{ver}-1.el7.ngx.src.rpm"
src_rpm_filename = File.basename(src_rpm_url)
puts('[ソースコードの RPM ファイルのダウンロード]')
Dir.chdir("#{home_dir}/src") do
rm_f(src_rpm_filename)
sh("wget #{src_rpm_url}")
end
puts
puts('[ソースコードの展開]')
Dir.chdir(home_dir) do
rm_rf('rpmbuild')
sh("rpm -ivh src/#{src_rpm_filename}")
end
puts
puts('[.specファイルの修正]')
SPEC_FILENAME = 'nginx.spec'
Dir.chdir("#{home_dir}/rpmbuild/SPECS") do
cp(SPEC_FILENAME, "#{SPEC_FILENAME}.original")
spec = File.read(SPEC_FILENAME)
modified_spec = spec.
gsub(/^((?:Build)?Requires: openssl)/, '#\1').
sub(/^(%define BASE_CONFIGURE_ARGS \$\(echo ".+)"\)\s*$/) {
%Q!#{$1} --with-openssl=#{openssl_dir} --with-http_geoip_module")!
}
File.write(SPEC_FILENAME, modified_spec)
end
puts
puts('[rpmbuild]')
Dir.chdir(home_dir) do
sh("rpmbuild -bb rpmbuild/SPECS/#{SPEC_FILENAME}")
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment