2011-09-23

DotCloudにJenkins+Nexus環境を構築してBitbucketと連携してみたよ(1/3)

こんにちは!極稀に記事を書くaquilegiaです。

まずは手順を作るために下記ページを参考にさせて頂きました。多謝!
 * dotcloud いいね!jenkins 編
 * Jenkins Mercurial Pluginでbitbucketにアクセスする

今回は3arrowsやソーシャルから少し離れて、開発者の間で話題?のDotCloudとBitbucketを連携したJavaのコーディング環境を構築する手順をご紹介します。

サービスの詳細は割愛しますが、DotCloudは多くのプログラム言語を実行できるPaaSで無料で2アプリケーションまで作成できます。Bitbucketはプロジェクトホスティングサービスでソースコード管理にMercurialを利用しており、5人までのチームは無料でIssueとWikiがついたプライベートなプロジェクトを無制限に作ることができます。

今回はこの二つを利用して個人向けプライベートビルド環境を作りましょ~というお話になります。手順のアウトラインは次の通りで、少し長いため3回に分けて紹介します。作業はLinux上で行ってだいたい1時間程度かかると思います。

・DotCloudを利用するための準備 ・DotCloudアカウントを取得 ・DotCloudクライアントをインストール ・DotCloudにNexusを構築 ・NexusのWARファイルをDL ・WARファイルから編集ファイルを抽出 ・ベースディレクトリの設定を変更 ・編集したファイルをWARファイルに戻す ・DotCloudにnexusアプリケーションを作成 ・DotCloudへデプロイ ・DotCloudにベースディレクトリを作成 ・Nexusを再起動 ・Nexusの初期設定 ・ログインユーザを作成 ・既存ユーザを無効にする ・DotCloudにJenkinsを構築 ・DotCloud用カスタムWARを作成 ・GitHubからJenkinsのソースコードをDL ・WebAppMain.javaを編集してJENKINS_HOMEを変更 ・ソースをコンパイル ・JenkinsのWARファイルをDL ・WAR内のclassesに作成したWebAppMain.classを追加 ・DotCloudにjenkinsアプリケーションを作成 ・DotCloudへデプロイ ・DotCloudにJENKINS_HOMEを作成 ・Jenkinsを再起動 ・Jenkinsの初期設定 ・ログインユーザを作成 ・権限を設定 ・Mavenの自動インストール設定 ・Jenkins Mercurial pluginをインストール ・Bitbucketの準備 ・Bitbucketのアカウントを作成してログイン ・リポジトリを作成 ・動作確認用プロジェクトの作成 ・プロジェクトを作成 ・リポジトリへコミット→プッシュ ・動作確認 ・Nexus認証情報を設定 ・動作確認用プロジェクトをビルドするジョブを登録 ・ジョブを実行

1、DotCloudを利用するための準備
DotCloud公式サイトのホームページにある緑色のSing Up Freeボタンを押下してアカウントを登録してください。


次にインストールマニュアルに従ってCLIをインストールしてください。DotCloudとやりとりする時にこのCLIを使います。
※CLIはWindows以外をお勧めします。というのも最初Windows版をインストールしてみたところ私のCygwin環境が悪かったのか、コマンド実行時に頻繁にエラーが発生しました。エラーを無視して根気よくコマンドを送れば使えますが、ストレスが溜まるのでLinux版へ替えました。

CLIをインストール後は任意のユーザでdotcloudコマンドを実行してください。初回実行時のみAPIキーの入力が求められます。

$ dotcloud
Warning: /home/aquilegia/.dotcloud/dotcloud.conf does not exist.
Enter your api key (You can find it at http://www.dotcloud.com/accounts/settings): (settingsページに表示されるAPIキーを入力する)
error: usage: dotcloud [-h]

                {info,status,stats,run,logs,versions,url,setup,list,rollback,alias,ssh,push,destroy,create,restart,history}
                ...

コンソールに表示されたURL(http://www.dotcloud.com/accounts/settings)へアクセスすればAPIキーが表示されるはずです。引数なしで実行すると上記のようにエラーになりますが問題ありません。

2、DotCloudにNexusを構築
NexusはそのままではDotCloud上で動きません。これはDotCloud上で動いているサーブレットコンテナはJettyでJettyユーザによって実行されていますが、Nexusがファイルを書き出すruntimeとnexus-workディレクトリに書込権限がなくエラーになるためです。

そのため私達が自由に使えるdotcloudユーザのホームディレクトリにnexusディレクトリを作成してそこを使わせるようにします。

2-1、NexusのWARファイルをDL
作業用のディレクトリを作成した後、ここからNexusのWARファイルをDLしてください。

$ mkdir -p nexus
$ cd nexus
$ wget http://nexus.sonatype.org/downloads/nexus-webapp-1.9.2.2.war

2-2、WARファイルから編集ファイルを抽出
WARから編集するファイルのみ展開してください。

$ unzip nexus-webapp-1.9.2.2.war WEB-INF/plexus.properties

2-3、ベースディレクトリの設定を変更
展開したディレクトリ内のWEB-INF/plexus.propertiesをエディタで開いてruntimeとnexus-workが/home/dotcloud/nexus配下になるよう編集してください。
(例はオリジナルからnexus-homeを追加し、runtimeとnexus-workがnexus-homeの子ディレクトリになるよう変更しました)

$ cd WEB-INF
$ cp -p plexus.properties plexus.properties.org
$ vi plexus.properties
nexus-home=/home/dotcloud/nexus
runtime=${nexus-home}/runtime
apps=${runtime}/apps
nexus-work=${nexus-home}/sonatype-work/nexus
nexus-app=${runtime}/apps/nexus
webapp=${runtime}/apps/nexus/webapp
security-xml-file=${nexus-work}/conf/security.xml
application-conf=${nexus-work}/conf
runtime-tmp=${runtime}/tmp

2-4、編集したファイルをWARファイルに戻す
編集したファイルをWARファイルに戻します。

$ cd ../
$ cp -p nexus-webapp-1.9.2.2.war nexus-webapp-1.9.2.2.war.org
$ zip nexus-webapp-1.9.2.2.war WEB-INF/plexus.propertie

2-5、DotCloudにnexusアプリケーションを作成
ここからはDotCloudへのデプロイ作業に移ります。コンソールから下記コマンドを実行し、DotCloudにnexusアプリケーションを作成してください。

$ dotcloud create nexus
Created application "nexus"

2-6、DotCloudへデプロイ
デプロイにはWARファイルとビルドファイルが必要になります。ビルドファイルは以下の内容でdotcloud.ymlという名前で作成してください。wwwはサービス名で任意の文字でかまいません。(ここでは公式ドキュメントと同じwwwとします)

$ cat > dotcloud.yml <<EOF
www:
type: java
EOF

次に適当な名前のディレクトリ(ここではdeployとします)を作成してWARファイルとビルドファイルと移してください。DotCloudのデプロイは内部でrsyncを使うのですが、指定したディレクトリの全ファイルを同期してしまうので無関係なファイルが送られないようにします。

$ mkdir deploy
$ mv nexus-webapp-1.9.2.2.war deploy/ROOT.war
$ mv dotcloud.yml deploy/

コンテキストルートは/にしたいのでWARファイルは名前をROOT.warに変更しておきます。
最後にコンソールから下記コマンドを実行し、DotCloudにnexusをデプロイする。

$ dotcloud push nexus deploy/
upload deploy/ ssh://dotcloud@uploader.dotcloud.com:443/nexus
rsync
Pseudo-terminal will not be allocated because stdin is not a terminal.
building file list ... done
./
ROOT.war
dotcloud.yml

sent 25.57M bytes received 53 bytes 616.03K bytes/sec
total size is 25.67M speedup is 1.00
Deployment for "nexus" triggered. Will be available in a few seconds.
2011-09-19 10:35:32 [api] Deploy nexus scheduled for revision=latest
2011-09-19 10:35:32 [api] Waiting for the build. (It may take a few minutes)
2011-09-19 10:35:32 [www.0] Deploying...
2011-09-19 10:35:57 [www.0] Service booted
2011-09-19 10:35:57 [api] All the services are ready. Beginning the build.
2011-09-19 10:35:57 [www.0] The build started
2011-09-19 10:35:58 [www.0] Fetched code revision rsync-xxxxxxxxx.xx
2011-09-19 10:36:01 [www.0] * Stopping Jetty servlet engine (was reachable on http://nexus-default-www-0:8080/). jetty
2011-09-19 10:36:03 [www.0] * Jetty servlet engine stopped. jetty
2011-09-19 10:36:03 [www.0] ...done.
2011-09-19 10:36:03 [www.0] * Starting Jetty servlet engine. jetty
2011-09-19 10:36:04 [www.0] * Jetty servlet engine started, reachable on http://nexus-default-www-0:8080/. jetty
2011-09-19 10:36:09 [www.0] ...done.
2011-09-19 10:36:09 [www.0] The build finished successfully
2011-09-19 10:36:09 [api] Deploy finished

Deployment finished. Your application is available at the following URLs
www: http://nexus-aquilegia.dotcloud.com/

ここでデプロイ結果を確認したくなりますがもう少し我慢してください。まだこの時点だと/home/dotcloud/nexusディレクトリが無いので正常に動いていません。

2-7、DotCloudにベースディレクトリを作成
コンソールから下記コマンドを実行し、DotCloudにNexusが使うディレクトリを作成してください。

$ dotcloud run nexus.www -- mkdir nexus \&\& ls -l

次にnexusディレクトリにグループ書込権限を追加します。こうすることでjettyユーザで実行されているNexusからディレクトリへファイルを書き込めるようになります。

$ dotcloud run nexus.www -- chmod g+w nexus \&\& ls -l

2-8、Nexusを再起動
今度は正常に起動できるはずなのでログを監視しながら再起動します。別のコンソールで下記コマンドを実行してログをtailしてください。

$ dotcloud logs nexus.www

そしてnexusアプリケーションを再起動してください。

$ dotcloud restart nexus.www

正常に起動すればログにスタックトレース等は出力されずに最終行が

15632 [main] INFO org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8080
となるはずです。

2-8、Nexusの初期設定
初期状態は外部に公開されている状態なので自分だけが利用できるように設定を変更します。

2-8-1、ログインユーザを作成
ダッシュボードでアプリ名の右側に表示されたサービス名をクリックするとデプロイしたNexusが表示されます。URLは"デプロイ名-アカウント名"を第4レベルドメインにしたものなので覚えられると思います。

http://nexus-aquilegia.dotcloud.com/

右上のLog Inリンクを押下し、下記ID/パスで管理者としてログインしてください。ログイン後は左のSecurityからChange Passwordを選択してパスワードを変更してください。

admin
admin123

ユーザの作成はSecurity→Usersから行います。Usersを選択すると右側に一覧が表示されるので上部に表示された緑色のAddボタンを押下し、Nexusユーザを作成してください。
(ここではnexusというIDで作成したとします)

ID: nexus
EMail: (メールアドレスを入力)
Status: Active
New Password: (パスワードを入力)
Confirm Password: (パスワードを入力)

Role Management: Nexus Developer Role
※メールアドレスは必須項目のため設定していますがAdministration → ServerでSMTPサーバや通知設定をしないと実際には送信されません。必要な方は試してみてください。

2-8-2、既存ユーザを無効にする
Usersの一覧にはもとからadmin、deployment、anonymousがありますがdeploymentは不要なので削除してください。またanonymousは非ログイン状態のユーザになり、削除不可ユーザです。今回は個人で利用するのでリポジトリを匿名ユーザに参照されないようStatusをDisabledへ変更してください。変更後のTOPページは以下のようにRespositoriesも参照できなくなります。


お疲れ様です。これでNexus環境ができました。
今回はここまでです。続きは次回ご紹介します。

1 件のコメント:

云海天潮 さんのコメント...

i also deploy sonatype nexus as you described, but i can not find search inbox in my sonatype nexus, can you provide some sugesstion?