critical-alert.hatenablog.com
Open in
urlscan Pro
13.115.18.61
Public Scan
Submitted URL: http://critical-alert.hatenablog.com/entry/2015/12/04/095601
Effective URL: https://critical-alert.hatenablog.com/entry/2015/12/04/095601
Submission Tags: falconsandbox
Submission: On August 21 via api from US
Effective URL: https://critical-alert.hatenablog.com/entry/2015/12/04/095601
Submission Tags: falconsandbox
Submission: On August 21 via api from US
Form analysis
1 forms found in the DOMGET https://critical-alert.hatenablog.com/search
<form class="search-form" role="search" action="https://critical-alert.hatenablog.com/search" method="get">
<input type="text" name="q" class="search-module-input" value="" placeholder="記事を検索" required="">
<input type="submit" value="検索" class="search-module-button">
</form>
Text Content
読者になる CRITICAL ALERTのブログ 普段はサーバのお世話係をしています 2015-12-04 RUBYのRPMを作るのをDOCKERとCIRCLECIにやらせたら便利だった docker この記事はフィードフォースエンジニア Advent Calendar 2015 - Adventar4日目です! みなさんrubyのRPMビルドってどうしてますか! CentOSをメインで使っていると最新のrubyはyumで入らないのでどこかのリポジトリからインストールするか自前でビルドする必要があるかと思います。 プロビジョニングのタイミングでrbenvやmakeで入れてもいいのですがciや新規ホストを立てた時など毎回rubyのビルドをするので時間がかかってしまうんですよね。 それが嫌でrubyはリリースされるたびにrpm化してインストールするようにしています。 ところがrpmのビルド環境って用意するのが面倒だったりビルドしたい環境ごとにvagrantを立ち上げて〜とか意外と手間がかかる。 自動化したいなーと思っていて、Dockerは特定の環境を再現するのに最適だし、CircleCIはGitHubのpushやmergeをトリガーにしてあれこれできるし、これだ!っていうことでDockerとCircleCIを使って自動でビルドできるようにしました。 今回の記事で使ったソースコードはこちらです。 critical-alert/oreno-ruby-rpm · GitHub 全体の流れ circle.ymlを見るとなんとなくわかると思いますが、流れとしては以下のような感じ。 1. GitHubにpushまたはマージされたタイミングでCircleCIが走る 2. docker build でdocker imageをビルドする 3. docker run で実際にRPMビルドを行う 4. docker cp でコンテナの中から出来たRPMを取り出す RPMを取り出すと書いていますがこれは正確ではなく、$CIRCLE_ARTIFACTS というパスにファイルを置くとCircleCiのArtifactsからDLできるようになっています。 ポイント 実際にRPMのビルドを行っているのはdocker runで立ち上げたコンテナの中です。 肝心のDockerfileはこのようになっています。 FROM centos:6.6 MAINTAINER hirokazu SUGIUCHI # setup RUN yum update -y RUN yum install -y rpm-build tar # ruby depends RUN yum -y install readline-devel ncurses-devel gdbm-devel glibc-devel gcc openssl-devel libyaml-devel libffi-devel zlib-devel # builduser RUN useradd rpmbuilder # build prepare RUN mkdir -p /home/rpmbuilder/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} RUN chown rpmbuilder:rpmbuilder /home/rpmbuilder/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} WORKDIR /home/rpmbuilder/rpmbuild ADD http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz SOURCES/ COPY ruby22x.spec SPECS/ruby22x.spec RUN chmod 777 /home/rpmbuilder/rpmbuild/SOURCES/* # build USER rpmbuilder CMD ["rpmbuild", "-ba", "/home/rpmbuilder/rpmbuild/SPECS/ruby22x.spec"] いくつかポイントがるのでそれぞれ解説します。 RPMをBUILDするUSERを作った 通常Dockerはすべてrootユーザーでコマンドが実行されますが、rpmをビルドするときはrootでのビルドは推奨されません。(今回に限ればそれほど問題は無いと思いますが) お作法に則ってrpmbuilderという一般ユーザーを作成しています。 Dockerfile内でUSERと指定すると、それ以降はその指定されたユーザーでコマンドが実行されます。 それより前でパーミッションの調整しているのはそのためです。 最後にCMDでRPMBUILD 初期の段階では build.sh なるものを作ってそのなかでrubyのソースをダウンロードし、rpmbuildコマンドを実行する、としていました。 そのあとdocker run時に docker run ruby-rpm /bin/sh ./build.sh といったようにshスクリプトを実行させていました。 run時にスクリプトを叩くのはあるあるですが、そのようにしてしまうとそのスクリプトの中であれこれやってしまい何をやっているのかわかりづらくなるのと、スクリプト のメンテも必要になってしまうのでDockerfileで完結するならその方が良いと考えDockerfileのみで完結するようにしました。 Dockerfileの中にCMDがあることによってそのコンテナの役割が明確になるというメリットもあります。 そうすることで、このコンテナはrpmを作るバイナリとして扱えるようになったとも言えます。 (docker imageをrunするだけでrpmがポンとできるような...) 課題 複数のOSに対応していない。今回はCentOS6でビルドしましたが、CentOS7にも対応したいです。 これはDockerfileがDockerfileという名前ではなくてもよくなったことを利用してDockerfileを複数(Dockerfile_centos6とDockerfile_centos7)作り、docker build時に指定しそれぞれ実行すれば作れそうです。 まとめ * 特定の環境で実行する処理をDockerで行った * GitHubとCircleCIを使うことによって誰でもRPMを作れるようになった * Dockerfileを知るいい機会になった これでrpmのspecファイルとrubyのソースURLをちょいっと変更してpushすればrubyのrpmが出来上がります。 12/25日にはrubyの2.3.0が公開されるはずなのでその時には活躍してもらおうと思っています! というわけで、5日目の明日はフィードフォースのMaker、kasei_sanです! 参考リンク 大変参考にさせていただきました * Docker を用いた rpm / deb パッケージ作成の継続的インテグレーション - ゆううきブログ * Dockerを使って任意のrubyバージョンのrpmを作成する - I Will Survive critical_alert 5年前 rubyのRPMを作るのをDockerとCircleCIにやらせたら便利だった 広告を非表示にする 関連記事 * 2016-07-06 JAWS-UGおコンテナ支部 #5 に行ってきました JAWS-UGおコンテナ支部 #5 少し前になりますが6/27(月)に行われ… * 2015-01-26 cookbookを書くときにtest-kitchenを使うと捗る ちょっとcookbook書いてちゃんと動くか試したいってときにいち… * もっと読む コメントを書く « JAWS-UGおコンテナ支部 #5 に行ってきまし… Chef Meetup(Tech-Circle&CreationLine共… » プロフィール critical_alert 読者です 読者をやめる 読者になる 読者になる 12 このブログについて 検索 リンク * はてなブログ * ブログをはじめる * 週刊はてなブログ * はてなブログPro 最新記事 * 我が家のドリップコーヒー環境 2018 * Helix キーボードキットを組み立てた話 * AWS 認定ソリューションアーキテクト アソシエイトに合格した話 * 我が家の Hue の運用について * Serverlessconf Tokyo 2017 に行ってきました 月別アーカイブ * ▼ ▶ 2018 (3) * 2018 / 12 (1) * 2018 / 7 (1) * 2018 / 2 (1) * ▼ ▶ 2017 (3) * 2017 / 12 (1) * 2017 / 11 (1) * 2017 / 4 (1) * ▼ ▶ 2016 (2) * 2016 / 7 (2) * ▼ ▶ 2015 (3) * 2015 / 12 (1) * 2015 / 9 (1) * 2015 / 1 (1) * ▼ ▶ 2014 (1) * 2014 / 11 (1) カテゴリー * coffee (1) * Keyboard (1) * Helix (1) * AWS (1) * IoT (1) * Hue (1) * serverless (1) * 勉強会 (4) * docker (2) * chef (2) * ruby (1) はてなブログをはじめよう! critical_alertさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか? はてなブログをはじめる(無料) はてなブログとは critical alertのブログ Powered by Hatena Blog | ブログを報告する スターをつけました 引用をストックしました ストック一覧を見る 閉じる 引用するにはまずログインしてください ログイン 閉じる 引用をストックできませんでした。再度お試しください 閉じる 限定公開記事のため引用できません。 読者です 読者をやめる 読者になる 読者になる 12