Repository as a Serviceのpackagecloud.ioを試してみた

2014.05.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
みなさん、yumapt-getコマンド使っていますか?Linux使いなら必須ですよね。ではgemは?こちらもRuby使いなら必須だと思います。では、自前でそれらのパッケージリポジトリを構築・管理してますか?ギークの方の手がちらほら上がるかもしれませんが、ほとんどの方は「構築が面倒そう」、「設定項目が多くて大変」と言うように敬遠しているのではないでしょうか。しかし、自前でリポジトリを持っているとソフトウェア配布の手段としてとても便利だと思います。そんなパッケージリポジトリを簡単に扱うサービス、packagecloud.ioなるものをTwitterのタイムラインで発見したので、試してみました。

packagecloud01

packagecloud.ioでできること

Repository as a Serviceとは具体的になにが提供されるのか、簡単にまとめると以下になります。

  • リポジトリのホスティング : 各パッケージのリポジトリが提供されます。PublicとPrivateが選択できるので、特定顧客向けなどにも対応でき、yumでいうcreaterepoコマンドのようなリポジトリのメンテナンスもお任せできます。
  • コマンドラインツール : パッケージのアップロードおよび公開が簡単にできるコマンドラインツールが提供されます。gemコマンドで簡単にインストールでき、コマンド一発でアップロードとリポジトリのメタデータ更新が走ります!
  • リポジトリのリストファイル : リポジトリを登録するリストファイルが提供され、スクリプトで簡単にインストールできます。

見た目としては地味かもしれませんが、従来のパッケージリポジトリ管理ではいずれも手間のかかるところですので、気軽にリポジトリを管理するために必要な機能が揃っていていい感じです。

1. サインアップ

まずは、packagecloud.ioのトップにある[Sign Up]からアカウントを登録します。Usernameは発行されるリポジトリのURLになることに少し注意しつつ、[Sign up!]をクリックします。

packagecloud02-1

続いてプランの選択です。GitHubと似たようなラインアップになっていますね。今回はお試しなのでFreeプランを選択しました。[Continue]をクリックします。

packagecloud03

これでサインアップは完了です!続いてリポジトリの作成に続きます。

2. リポジトリの作成

続いて、リポジトリの作成画面が表示されます。リポジトリ名を入力し、[Create It!]でリポジトリが作成されます。リポジトリのURLはhttps://packagecloud.io/ユーザー名/リポジトリ名/になります。

packagecloud04

リポジトリへのパッケージのアップロードは、コマンドラインツールのpackage_cloudコマンドを使用します。画面の指示に従い、gemコマンドでインストールします。

packagecloud05

ikkomon:~ ryuta$ gem install package_cloud --no-ri --no-rdoc
Fetching: colorize-0.6.0.gem (100%)
Fetching: package_cloud-0.2.3.gem (100%)
Successfully installed colorize-0.6.0
Successfully installed package_cloud-0.2.3
2 gems installed

package_cloudコマンドの初回実行時には、クレデンシャルファイルの作成が促されます。ユーザー名、パスワードを入力すると作成され、リポジトリ一覧が表示されます。

ikkomon:~ ryuta$ package_cloud repository list
No config file exists at /Users/ryuta/.packagecloud. Login to create one.
Email:
takipone@example.com
Password:

Got your token. Writing a config file to /Users/ryuta/.packagecloud... success!
Your repositories:

  classmethod/rpm (public)
  last push: never | packages: no packages
ikkomon:~ ryuta$

作成したリポジトリが表示されました!これで準備OKです。ブラウザの[Done]ボタンをクリックします。

3. パッケージのアップロード

パッケージのアップロードは、package_cloud push <ユーザー名>/<リポジトリ名> <パッケージファイル名>で実行します。パッケージの拡張子によって、RPM、DEB(aptのパッケージ形式)、GEMが自動で判別され、パッケージごとの設定を選択します。RPMの場合はリポジトリのパスに反映されます。今回はRHEL6向けを選択してみました。

packagecloud06

ikkomon:~ ryuta$ package_cloud push classmethod/rpm ./ec2-swap-0.2.0-1.noarch.rpm
rpm packages require an operating system and version to be selected.

If you don't see your OS or version here, send us an email at support@packagecloud.io:

	0. Enterprise Linux
	1. Fedora

 0-1: 0

You selected Enterprise Linux. Select a version:

	0. Enterprise Linux 5.0 (5)
	1. Enterprise Linux 6.0 (6)

 0-1: 1

Push ./ec2-swap-0.2.0-1.noarch.rpm to classmethod/rpm/el/6?

 (y/n): y

Continuing... Note that next time you can push directly to el/6 by specifying classmethod/rpm/el/6 on the commandline.
Looking for repository at classmethod/rpm... success!
Pushing temp/repo.classmethod.info/yum/x86_64-test/ec2-swap-0.2.0-1.noarch.rpm... success!
ikkomon:~ ryuta$

コマンド一発でアップロードとリポジトリツリーの構成が完了しました!あまりに簡単で、素直に驚きました。ブラウザ画面に戻り、[Done]ボタンで次に進みます。

packagecloud07

パッケージ一覧にアップロードしたパッケージが表示されていますね。これでリポジトリの準備は完了です。

4. パッケージのインストール

リポジトリの参照方法は従来と特に変わりません。各パッケージの種類に応じた、リストファイルの配置を行います。上記画面の[Install this Repo]にあるコマンドラインをコピー&ペーストすればリストファイルの配置が一発で実行できます。今回はRPMパッケージをアップロードしましたので、script.rpmのコマンドラインを実行してみます。

[ec2-user@ip-XX-XX-XX-XX ~]$ curl https://packagecloud.io/install/repositories/classmethod/rpm/script.rpm | sudo bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1527    0  1527    0     0   1367      0 --:--:--  0:00:01 --:--:--  1368
Detected aws version 6...
Downloading repository file: https://packagecloud.io/classmethod/rpm.repo?os=aws&dist=6
読み込んだプラグイン:priorities, update-motd, upgrade-helper
パッケージ pygpgme-0.1-18.20090824bzr68.8.amzn1.x86_64 はインストール済みか最新バージョンです
何もしません
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   245    0   245    0     0    294      0 --:--:-- --:--:-- --:--:--   294
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main/latest                                                                                     | 2.1 kB     00:00
amzn-updates/latest                                                                                  | 2.3 kB     00:00
classmethod_rpm/x86_64/signature                                                                     |  836 B     00:00
https://packagecloud.io/gpg.key から鍵を取得中です。
Importing GPG key 0xD59097AB:
 Userid     : "packagecloud ops (production key) <ops@packagecloud.io>"
 Fingerprint: 418a 7f2f b0e1 e6e7 eabf 6fe8 c2e7 3424 d590 97ab
 From       : https://packagecloud.io/gpg.key
classmethod_rpm/x86_64/signature                                                                     |  951 B     00:00 ...
classmethod_rpm/x86_64/filelists                                                                     |  250 B     00:00
classmethod_rpm/x86_64/primary                                                                       |  823 B     00:00
classmethod_rpm/x86_64/other                                                                         |  217 B     00:00
classmethod_rpm                                                                                                         1/1
classmethod_rpm                                                                                                         1/1
classmethod_rpm                                                                                                         1/1
メタデータのキャッシュを作成しました

[ec2-user@ip-XX-XX-XX-XX ~]$ cat /etc/yum.repos.d/
amzn-main.repo        amzn-preview.repo     classmethod_rpm.repo  epel.repo
amzn-nosrc.repo       amzn-updates.repo     epel-testing.repo
[ec2-user@ip-XX-XX-XX-XX ~]$ cat /etc/yum.repos.d/classmethod_rpm.repo
[classmethod_rpm]
name=classmethod_rpm
baseurl=https://packagecloud.io/classmethod/rpm/el/6/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
assumeyes=1
[ec2-user@ip-XX-XX-XX-XX ~]$

yumのリストファイルに、https://packagecloud.io/classmethod/rpm/以下が登録されていることが確認できますね。それでは実際にアップロードしたRPMパッケージをyumコマンドでインストールしてみます。

[ec2-user@ip-XX-XX-XX-XX ~]$ sudo yum install ec2-swap
読み込んだプラグイン:priorities, update-motd, upgrade-helper
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ ec2-swap.noarch 0:0.2.0-1 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

============================================================================================================================
 Package                     アーキテクチャー          バージョン                  リポジトリー                        容量
============================================================================================================================
インストール中:
 ec2-swap                    noarch                    0.2.0-1                     classmethod_rpm                    3.3 k

トランザクションの要約
============================================================================================================================
インストール  1 パッケージ

総ダウンロード容量: 3.3 k
インストール容量: 3.1 k
Is this ok [y/d/N]: y
Downloading packages:
ec2-swap-0.2.0-1.noarch.rpm                                                                          | 3.3 kB     00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : ec2-swap-0.2.0-1.noarch                                                                     1/1
  検証中                  : ec2-swap-0.2.0-1.noarch                                                                     1/1

インストール:
  ec2-swap.noarch 0:0.2.0-1

完了しました!
[ec2-user@ip-XX-XX-XX-XX ~]$

インストールできました!

まとめ

いかがでしたでしょうか。パッケージのリポジトリというと大掛かりな仕掛けという印象でしたが、packagecloud.ioを使えば手軽にリポジトリを作ることでソフトウェアの配布をより身近に感じていただけるのではないかと思います。packagecloud.ioを活用して、OSSソフトウェア開発の世界を広げて行きましょう!