Githubのリポジトリをyumリポジトリとして使う
簡単にできた。手順は後ほど。
背景
普段使っているサーバOSはCentOSなので、自作のOSSツールなどをyumコマンドを使ってさくっとインストールしたい。RPMを作るところまではスクリプト化してあって一発でできるようになっている。yumリポジトリをどうするか。今まではbintrayで個人用のyumリポジトリを立てて使っていました。
ところが、先日このbintrayのyumリポジトリから古くてもう使っていないパッケージを削除しようとしたところ「公開後180日たつと削除できない」とエラーになってしまいました。
昔作ったOSSのRPMパッケージをbintrayにホストしてたのだけど、もう使ってないしソースもgithub上から消したので、bintrayからも消そうとしたら、できなくて混乱している。
— こうきん (@kohkimakimoto) 2017年7月16日
パッケージの削除は最初のバージョンをホストしてから180日以内でないとできないってエラーになるのだけど、なぜにこの仕様なんだろうか。普通に不便で、ゴミがたまり続けてしまうのだけど。
— こうきん (@kohkimakimoto) 2017年7月16日
結局この後、bintrayのサポートに問い合わせてみたら、わりとすぐに削除してくれたのですが、今後パッケージが要らなくなって消そうとするたびに、問い合わせしなくてはならないのかな、、、と思うとちょっとツライです。
そんなわけで代替となるyumリポジトリをホストしてくれるサービスを探していたりしました。packagecloud.ioなどを見てみましたが、いまひとつ使う気になれず。。。
そこで昔yumリポジトリを個人サーバに立てたときのことを思い出してみると、結局必要だったのはただのhttpサーバだけだったはずでは。それならGithub Pagesを使えばGithub上にyumリポジトリも立てられるんじゃないかなと思い至り、ちょっとググったら、かなり前にやっぱり同じことをやっている人がいた。
この記事を参考にして、今はgh-pages
のブランチを切る必要もないし、SSLも対応しているので、その辺をふまえて以下のようにやりました。
作業手順
Githubにリポジトリを作る
何でもいいですが、ここではリポジトリ名はyumrepo-example
とします。作成後リポジトリの設定画面からGithub Pagesの設定をします。Sourceをmasterブランチに設定すれば昔のようにgh-pages
のブランチを切る必要もないです。
リポジトリをcloneしてRPMファイルを配置する
上記のリポジトリをローカルにcloneし、サポートするディストリビューションやアーキテクチャなどで、適当にサブディレクトリを作成してその中にホストしたいRPMファイルをおきます。試しに拙作であるプロビジョニングツールのcofuのRPMを
https://github.com/kohkimakimoto/cofu/releases
からダウンロードしてCentOS6とCentOS7用に配置します
$ mkdir el6-x86_64 el7-x86_64 $ curl -L -o el6-x86_64/cofu-0.6.0-1.el6.x86_64.rpm https://github.com/kohkimakimoto/cofu/releases/download/v0.6.0/cofu-0.6.0-1.el6.x86_64.rpm $ curl -L -o el7-x86_64/cofu-0.6.0-1.el7.x86_64.rpm https://github.com/kohkimakimoto/cofu/releases/download/v0.6.0/cofu-0.6.0-1.el7.x86_64.rpm
createrepoコマンドでリポジトリのメタファイルを作る
createrepo
コマンドでyumリポジトリに必要なメタファイルを生成します。Macで直接動作するcreaterepo
コマンドはないのですが、dockerを使えばこのあたりも簡単にできます。以下のようにしてbashスクリプトをcreaterepo
として作成します。
$ echo '#!/usr/bin/env bash docker run --rm -u "$(id -u):$(id -g)" -v $PWD:/build -w /build kohkimakimoto/rpmbuild:el7 createrepo "$@"' > createrepo $ chmod 755 createrepo
そして、RPMを配置したサブディレクトリを指定して実行します。
$ ./createrepo el6-x86_64 Spawning worker 0 with 1 pkgs Spawning worker 1 with 0 pkgs Spawning worker 2 with 0 pkgs Spawning worker 3 with 0 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete $ ./createrepo el7-x86_64 Spawning worker 0 with 1 pkgs Spawning worker 1 with 0 pkgs Spawning worker 2 with 0 pkgs Spawning worker 3 with 0 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete
後はコミットしてpushすれば完了です。なおRPMを更新したら都度同じようにcreaterepo
スクリプトを実行してメタファイルも更新します。
yumでインストールしてみる
リポジトリができたのでyumでインストールしてみます。以下の例はCentOS7でやった際のもの。リポジトリのパスなどは適宜読み替えてください。
まずリポジトリの設定をして
$ sudo sh -c 'echo "[github-yumrepo-example-el7-x86_64] name=github-yumrepo-example-el7-x86_64 baseurl=https://kohkimakimoto.github.io/yumrepo-example/el7-x86_64 gpgcheck=0 enabled=1 " > /etc/yum.repos.d/github-yumrepo-example-el7-x86_64.repo'
あとは普通にyum installする
$ sudo yum install cofu
以上です。サンプルのリポジトリは以下においておきます。