2011-09-23

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

こんにちは!aquilegiaです。

その2の続きになります。今回で最後になりますのでもう少しお付き合いください。

4、Bitbucketの準備
Bitbucketのアカウントを作成して動作確認用プロジェクトのリポジトリを作成します。

4-1、Bitbucketのアカウントを作成してログイン
Bitbucket公式サイトのSign up freeボタンからサインアップしてください。


例ではアカウント名をaquilegiaで登録しています。今後、BItbucket接続URLなどにaquilegiaと出てきた場合は適宜読み替えてください。

4-2、リポジトリを作成
サインアップが完了したらページ上部にあるRepositoriesからcreate repositoryを選択した後、以下の内容で入力してください。

Name: helloworld
Private: チェック有
Language: Java
Description: 動作確認用プロジェクト
Website: (なし)
Project management: (Wiki、Issue trackingはお好みで)

入力が終わったらCreate repositoryボタンを押下してください。これでBitbucketの準備は終わりです。

5、動作確認用プロジェクトの作成
4-2で作成したリポジトリにプッシュするプロジェクトを作成します。動作確認用なので手間をかけずにMavenで作ります。

5-1、プロジェクトを作成
下記コマンドを実行すると

$ cd ~
$ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=sample -DartifactId=helloworld -Dversion=0.1-SNAPSHOT
(実行を確認にYと応える)

次の構造のQuickStartプロジェクトが作成されます。

helloworld
├── pom.xml
└── src
    ├── main
    │  └── java
    │      └── sample
    │          └── App.java
    └── test
        └── java
            └── sample
                └── AppTest.java

このままでも動きますが動作確認が目的なので、このプロジェクトが依存しているJUnitを
Nexusから取得するようにpom.xmlにリポジトリ定義を追加します。
</dependencies>の後にDotCloudアカウント名を書き換えたrepositoriesを追加してください。

$ vi helloworld/pom.xml
  <repositories>
    <repository>
      <id>com.dotcloud.nexus</id>
      <url>http://nexus-(DotCloudアカウント名).dotcloud.com/content/groups/public</url>
    </repository>
  </repositories>

5-2、リポジトリへコミット→プッシュ
作成したプロジェクトをBitbucketへプッシュするためにMercurialをインストールします。

$ sudo yum -y install mercurial
$ hg --help

次に作成したプロジェクトにローカルリポジトリを作成してコミットしてください。

$ cd ~
$ mkdir bitbucket
$ hg clone https://(Bitbucketアカウント名)@bitbucket.org/(Bitbucketアカウント名)/helloworld bitbucket/helloworld
$ mv helloworld/* ./bitbucket/helloworld/
$ rm -rf helloworld
$ cd bitbucket/helloworld
$ hg status
$ hg add
$ hg commit -u (Bitbucketアカウント名) -m '初回コミット'

コミット時にユーザ名を指定しておくとBitbucketにリンク付きで表示されます。Bitbucketに存在しないユーザ名を指定するとデッドリンクになるので取得したアカウント名を指定するのが無難です。
最後にBitbucketへプッシュします。

$ hg push https://(Bitbucketアカウント名)@bitbucket.org/(Bitbucketアカウント名)/helloworld

プッシュが成功すればBitbucketのSourceタブにソースが表示されます。


6、動作確認
6-1、Nexus接続情報を設定
Nexusリポジトリは匿名ユーザではアクセスできないように設定したので、 Mavenでビルド時にNexusリポジトリを参照できるよう接続情報を設定したsettings.xmlを作成してください。
またJenkinsがNexusからDLした依存ファイルを保存するローカルリポジトリをjettyユーザが書き込める場所に変更するためlocalRepositoryを指定してください。

$ dotcloud run jenkins.www -- mkdir -p .m2/repository \&\& ls -al
$ dotcloud run jenkins.www -- chmod 775 .m2/repository \&\& ls -l .m2/
$ dotcloud run jenkins.www -- vi .m2/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings>
  <localRepository>/home/dotcloud/.m2/repository</localRepository>
  <servers>
    <server>
      <id>com.dotcloud.nexus</id>
      <username>nexus</username>
      <password>(Nexusパスワード)</password>
    </server>
  </servers>
</settings>

$ dotcloud run jenkins.www -- cat .m2/settings.xml

6-2、動作確認用プロジェクトをビルドするジョブを登録
ブラウザからJenkinsにログインし、左メニューから新規ジョブ作成を選択してください。
以下の内容を入力しOKボタンを押下する

ジョブ名: helloworld
ビルド: フリースタイル・プロジェクトのビルド

ビルドにMaven2/3プロジェクトを指定しないのはsettings.xmlを指定するためです。
次にジョブの細かな設定をします。

ソースコード管理システム: Mercurial
Repository URL: https://(Bitbucketアカウント名):(Bitbucketパスワード)@bitbucket.org/aquilegia/helloworld/

ビルド手順の追加: Mavenの呼び出し
使用するMaven: maven_2.2.1
ゴール: package
高度な設定
JVMオプション: -Dorg.apache.maven.user-settings=/home/dotcloud/.m2/settings.xml

JVMオプションのsettings.xmlファイルの指定は忘れないようにしてください。

6-3、ジョブを実行
登録したジョブの左メニューにあるビルド実行リンクを押下してジョブを実行してください。
ビルド履歴の日付リンクを押下し、左メニューのコンソール出力リンクから詳細を見ることができます。問題がなければ下のようにBUILD SUCCESSFULと表示されるはずです。


画像はわかりやすくするため何回か実行した後のものになりますが、初回はこれに加えてプラグインや依存のDLログが出力されます。



お疲れ様でした。これでDotCloud上にプライベートビルド環境ができました。Jenkinsのジョブ設定で「SCMをポーリング」を指定すればプッシュした後に変更を検知して自動でビルドすることもできます。また今回は手間を省くために動作確認用プロジェクトの作成にEclipseを使いませんでしたが、EclipseのMercurialEclipseプラグイン(updateサイト)を使うとBitbucketとのやり取りが簡単になります。

また注意点としてJenkinsとNexusはどちらもその機能上ディスクを多く使いますがDotCloudはまだディスクの使用制限がはっきりしていません。そのため過度な利用は避けたほうがよさそうです。

開発に使うツールをクラウド上に置くといつでも作業ができて便利です。他のサービスも組み合わせて快適な開発環境を構築してみてください。それではまた。

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

こんにちは!aquilegiaです。

その1の続きです。今回はDotCloudにJenkinsを構築します。
Jenkinsは少し面倒ですがお付き合いください。

3、DotCloudにJenkinsを構築
3-1、DotCloud用カスタムWARを作成
JenkinsもNexus同様にjettyユーザが書き込めるJENKINS_HOMEディレクトリが必要ですが、DotCloud環境だとJenkinsが提供する外部指定(JNDIや環境変数、システムプロパティなど)が全て利用できません。その為、あまりやりたくありませんがJenkinsのソースを直接変更してJENKINS_HOMEを指定します。

変更後のJENKINS_HOMEは/home/dotcloud/jenkinsとします。

3-1-1、GitHubからJenkinsのソースコードをDL
ローカルにgitがインストールされていない場合は事前にインストールしてください。

$ rpm -qa | grep git
$ sudo yum -y install git

次にカスタムWARを作るために編集対象のソースが含まれるcoreプロジェクトをcloneします。

$ mkdir -p jenkins/src
$ cd jenkins/src
$ git clone git://github.com/jenkinsci/jenkins.git core

最新ソースの状態になっているので安定してるリリースタグをチェックアウト(後でDLするWARファイルとバージョンを合わせておく)

$ cd core
$ git checkout jenkins-1.430

3-1-2、WebAppMain.javaを編集してJENKINS_HOMEを変更
WebAppMain.javaを開き

$ cd core/core/src/main/java/hudson/
$ cp -p WebAppMain.java WebAppMain.java.org
$ vi WebAppMain.java

getHomeDirメソッドの内容を次の2行にしてください。

        File newHome = new File("/home/dotcloud/jenkins");
        return new FileAndDescription(newHome,"/home/dotcloud/jenkins");

3-1-3、ソースをコンパイル
コンパイルはMavenを利用します。JDKも必要になるので無い場合はインストールしてください。

$ wget http://download.oracle.com/otn-pub/java/jdk/6u27-b07/jdk-6u27-linux-x64-rpm.bin
$ mv jdk-6u27-linux-x64-rpm.bin\?e\=1316438935\&h\=38edd1ecfcdb35d6dd0aa91215bb62fb jdk-6u27-linux-x64-rpm.bin
$ chmod u+x jdk-6u27-linux-x64-rpm.bin
$ sudo ./jdk-6u27-linux-x64-rpm.bin
$ java -version

次にMavenをインストールします。インストールはrootで作業します。

$ su -
# wget http://ftp.kddilabs.jp/infosystems/apache//maven/binaries/apache-maven-2.2.1-bin.tar.gz
# tar xzvf apache-maven-2.2.1-bin.tar.gz
# mv apache-maven-2.2.1-bin /opt/maven2
# rm -f apache-maven-2.2.1-bin.tar.gz
# vi /etc/profile.d/maven2.sh
export M2_HOME=/opt/maven2
export PATH=$PATH:$M2_HOME/bin
# exit
$ source /etc/profile
$ mvn -v

最後のmvnコマンドでバージョン情報が表示されればインストール成功です。

coreディレクトリの直下に移動した後、下記コマンドを実行してコンパイルします。(※数分かかります)

$ cd ~/jenkins/src/core/core
$ mvn compile

OpenJDKを使うとcom.sun.toolsが見つからないというエラーでビルドが失敗するかもしれません。その場合はOpenJDKをアンインストール後、OracleのJDKを入れて試してみてください。

3-1-4、JenkinsのWARファイルをDL
MavenでWARまで作っても構いませんが、無難にリリースされたWARファイルを利用します。

$ cd ~/jenkins/
$ wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war

3-1-5、WAR内のclassesに作成したWebAppMain.classを追加
$ mkdir -p WEB-INF/classes/hudson
$ cp -p src/core/core/target/classes/hudson/WebAppMain.class ./WEB-INF/classes/hudson/
$ cp -p jenkins.war jenkins.war.org
$ zip jenkins.war WEB-INF/classes/hudson/WebAppMain.class

3-2、DotCloudにjenkinsアプリケーションを作成
下記コマンドを実行し、jenkinsアプリケーションを作成してください。

$ dotcloud create jenkins

3-4、DotCloudへデプロイ
デプロイはNexusと同様にビルドファイルを作成し、ビルドファイルとWARファイルのみのディレクトリを作成した後にpushコマンドを実行します。

$ cat > dotcloud.yml <<EOF
www:
  type: java
EOF
$ mkdir deploy
$ mv jenkins.war deploy/ROOT.war
$ mv dotcloud.yml deploy/
$ dotcloud push jenkins deploy/
upload deploy/ ssh://dotcloud@uploader.dotcloud.com:443/jenkins
rsync
Pseudo-terminal will not be allocated because stdin is not a terminal.
building file list ... done
./
ROOT.war
dotcloud.yml

sent 45.19M bytes  received 53 bytes  772.50K bytes/sec
total size is 45.37M  speedup is 1.00
Deployment for "jenkins" triggered. Will be available in a few seconds.
2011-09-19 15:39:50 [api] Deploy jenkins scheduled for revision=latest
2011-09-19 15:39:51 [api] Waiting for the build. (It may take a few minutes)
2011-09-19 15:39:51 [www.0] Deploying...
2011-09-19 15:40:12 [www.0] Service booted
2011-09-19 15:40:12 [api] All the services are ready. Beginning the build.
2011-09-19 15:40:13 [www.0] The build started
2011-09-19 15:40:16 [www.0] Fetched code revision rsync-xxxxxxxxxx.xx
2011-09-19 15:40:18 [www.0]  * Stopping Jetty servlet engine (was reachable on http://jenkins-default-www-0:8080/). jetty
2011-09-19 15:40:21 [www.0]  * Jetty servlet engine stopped. jetty
2011-09-19 15:40:21 [www.0]    ...done.
2011-09-19 15:40:21 [www.0]  * Starting Jetty servlet engine. jetty
2011-09-19 15:40:21 [www.0]  * Jetty servlet engine started, reachable on http://jenkins-default-www-0:8080/. jetty
2011-09-19 15:40:26 [www.0]    ...done.
2011-09-19 15:40:26 [www.0] The build finished successfully
2011-09-19 15:40:26 [api] Deploy finished

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

この状態ではNexusと同じ理由でまだ正常に動きませんので、ディレクトリを作成する手順を進めてください。

3-5、DotCloudにJENKINS_HOMEを作成
下記コマンドを実行し、jenkinsディレクトリを作成してください。

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

Nexusと同様にグループに書込権限を付与してください。

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

3-6、Jenkinsを再起動
これでJenkinsを起動するまでの準備が整いました。
別コンソールでログをtailしつつ、Jenkinsを再起動します。

$ dotcloud logs jenkins.www
$ dotcloud restart jenkins.www

ログにスタックとレースが表示されず、最後に以下のログが表示されれば成功です。

INFO: JNLP slave agent listener started on TCP port 58600
Sep 19, 2011 3:48:56 PM hudson.WebAppMain$2 run
INFO: Jenkins is fully up and running

正常に起動すればブラウザでアクセスするとTOPページが表示されます。

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

3-7-1、ログインユーザを作成
Jenkinsにユーザを作成します。
  • 左メニューから「Jenkinsの管理→システム設定」を選択し、システム設定ページを表示
  • 6番目ぐらいにある「セキュリティを有効化」チェックボックスをON
  • アクセス制御のユーザ情報から「Jenkinsのユーザデータベース」を選択
  • 保存ボタンを押下
保存した後、ページ右上にサインアップリンクが表示されるようになるので
リンクを押下してユーザを作成してください。(例ではjenkinsとします)

ユーザ名: jenkins
パスワード: (パスワードを入力)
パスワードの確認: (パスワードを入力)
フルネーム: jenkins
メールアドレス: (メールアドレスを入力)

サインアップが完了すると作成したユーザでログインした状態になります。
その後はサインアップできないようにします。

  • 左メニューから「Jenkinsの管理→システム設定」を選択し、システム設定ページを表示
  • アクセス制御のユーザ情報にある「ユーザにサインアップを許可」チェックボックスを外す
  • 保存ボタンを押下
これでページ右上からサインアップリンクが消えたはずです。


3-7-2、権限を設定
Jenkinsを利用できるユーザをログインユーザのみにします。
  • 左メニューから「Jenkinsの管理→システム設定」を選択し、システム設定ページを表示
  • アクセス制御の管理権限を行列による権限設定に変更
  • 匿名ユーザはそのままでauthenticatedという名前のユーザを追加
  • 全権限を与える(チェックを全て入れる)
  • 保存ボタンを押下
権限のチェックを終えると次のようになります。


これでログアウトするとホームページにログインフォームが表示されます。ログインしなければ何も利用できなくなっているはずです。

3-7-3、Mavenの自動インストール設定
DotCloud上にMavenをインストールするのは手間なのでJenkinsにやってもらいます。
ですがJenkinsがインストールしたMavenではMavenリポジトリに書き込めないという
おなじみの問題が発生するので後で対処します。
  • 左メニューから「Jenkinsの管理→システム設定」を選択し、システム設定ページを表示
  • ページ中央にあるMeven追加ボタンを押下
  • 名前とバージョンを指定
名前: maven_2.2.1
バージョン: 2.2.1
  • 自動インストールはONのままとしてください。
  • 保存ボタンを押下
また少し下に「利用状況とクラッシュレポートをJenkinsプロジェクトに匿名で報告」という項目がありますが好みで変更してください。

3-7-4、Jenkins Mercurial pluginをインストール
次はBitbucketからソースコードを取得するプラグインをインストールします。
  • 左メニューから「Jenkinsの管理→プラグインの管理」を選択し、プラグインページを表示
  • 利用可能タブから「Mercurial Plugin」を探し、チェックを入れる
  • ページ下部にあるインストールボタンを押下してインストール
この時「インストール後ジョブがなければ再起動する」にチェックを入れると
DotCloudコマンドで再起動しなくて済むので簡単です。



お疲れ様です。以上でJenkinsの構築が終わりました。
次回は動作確認用プロジェクトを作成して動作確認します。

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環境ができました。
今回はここまでです。続きは次回ご紹介します。

2011-04-04

3arrows の OpenSocial RPC API (2-legged OAuth) で、節電呼びかけでんこちゃん社内 bot を作ってみたよ

こんにちは。Nobuhiro Nakajima @ YOKOHAMA です。

3arrows - Google Apps アカウントでも使える社内 Twitter
http://www.3arrows.jp/

3arrows は、2-legged OAuth による OpenSocial RPC API を提供しています。2-legged OAuth は mixiアプリなどソーシャルアプリの世界では、標準化されたリクエスト署名方式で、アプリと外部システムの連携に適しています。詳しくは、次のページを参考にしてください。

2-legged OAuth による API アクセス >> mixi Developer Center
http://developer.mixi.co.jp/appli/spec/pc/restful-api-for-pc/2-legged-oauth-api-access

このエントリでは 2-legged OAuth による OpenSocial RPC API を使って、電力使用状況と節電を呼びかける でんこちゃん 社内 bot の作り方を紹介します。

でんこちゃん社内 bot

就業時間中の1時間に1度、でんこちゃん bot がタイムラインに節電を呼びかける投稿をします。このとき、現在の電力使用状況とその日の推移グラフも合わせて投稿します。



①でんこちゃん bot
②東京電力アプリのロゴ
③東京電力アプリのリンク先 http://www.tepco.co.jp/forecast/index-j.html
④電力使用状況
⑤電力使用状況の推移グラフ (クリックすると、次のとおり拡大する)


でんこちゃんユーザの作成

コントロールパネルで、でんこちゃんを表すユーザを作成します。ここでは、メールアドレスを denkochan@lrlab.to とします。

東京電力アプリの作成

コントロールパネルで、東京電力を表すアプリを作成します。



アプリのガジェットXMLは次のとおりです。アプリのタイトルは東京電力とし、アイコンは Twitter 公式アカウント から拝借します。アプリは、コンテンツを持たせず、東京電力サイトにリンクさせます。
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="東京電力" description="東京電力から節電のお願いです">
<Link rel="icon" href="http://a0.twimg.com/profile_images/1276730827/tepco_normal.JPG" />
</ModulePrefs>
<Content type="url" href="http://www.tepco.co.jp/forecast/index-j.html"></Content>
</Module>
コンシューマキーとシークレットの入手

2-legged OAuth のコンシューマキーとシークレットは、コントロールパネルから入手できます。OpenSocial RPC API のエンドポイント (URL) も同様です。


バッチの作成

東京電力 から LWP::Simple を使って、電力の使用状況データ (CSV) をダウンロードします。そして、最新の電力使用状況を集計し、Google Chart API を使って、当日の推移グラフを作成します。
use strict;
use warnings;

use LWP::Simple;
use Encode 'decode_utf8';

my $url = 'http://www.tepco.co.jp/forecast/html/images/juyo-j.csv';
my @rows = split(/\r\n/, get($url));

shift @rows;
shift @rows;

# ピーク時供給力(万kW)
my ($cap) = split(/,/, shift @rows); 

shift @rows;
shift @rows;

# 24時間分の当日実績(万kW)
my @hours = map {
    my @cols = split(/,/, $_); $cols[2];
} @rows;

my $latest;

# 最新の当日実績(万kW)
for (reverse(@hours)) {
    last if $latest = $_;
}

# 電力使用率
my $per = sprintf('%.1f', $latest / $cap * 100);

# 当日実績(万kW)の推移グラフ
my $chart = 'http://chart.googleapis.com/chart' . 
    '?chs=400x240' .
    '&cht=bvo' .
    "&chxr=0,0,$cap|1,0,23" .
    '&chxt=y,x' .
    '&chbh=10' . 
    '&chd=t:' . join(',', map { int($_ / $cap * 100) } @hours);
続けて、Activities API を使って、電力使用状況を 3arrows に投稿します。アクティビティの作成を JSON RPC で組み立て、OAuth::Lite::Consumer を使って、リクエストを署名して発行します。

API の Endpoint、Consumer Key、Consumer Secret には、前述のコントロールパネルから入手した値を指定します。また、xoauth_requestor_id には、でんこちゃん(投稿者) を表す denkochan@lrlab.to を指定しています。

アクティビティの作成に成功すると、アクティビティID がレスポンスされます。万が一失敗したときは、JSON RPC のエラーか HTTP ステータスのエラーがレスポンスされます。
use Data::Dumper;
use JSON::XS;
use OAuth::Lite::Consumer;

# アクティビティのタイトル
my $title = <<EOB;
じゃん! 電気を大切にね。
> 電力使用状況 $cap 万kW 中 $latest 万kW ($per%)
> $chart
EOB

# アクティビティの作成を表す JSON RPC
my $content = JSON::XS::encode_json({
    jsonrpc => '2.0',
    method => 'activities.create',
    params => {
        userId => '@viewer',
        group => '@self',
        activity => { title => decode_utf8($title) } # UTF-8 フラグ
    },
    id => 1
});

# API の Endpoint, Consumer Key, Consumer Secret, Viewer
my %options = (
    endpoint => 'http://nakajiman.3arrows.jp/api/rpc/a',
    consumer_key => '{consumer key}',
    consumer_secret => '{consumer secret}',
    requester_id => 'denkochan@lrlab.to',
);

my $consumer = OAuth::Lite::Consumer->new(
    consumer_key => $options{consumer_key},
    consumer_secret => $options{consumer_secret}
);

# リクエストの署名と発行
my $response = $consumer->request(
    method  => 'POST',
    url => $options{endpoint},
    headers => [ 'Content-Type' => 'application/json' ],
    content => $content, 
    params => {
        xoauth_requestor_id => $options{requester_id},
    });

# リクエストの成否
if ($response->is_success) {
    print Dumper(JSON::XS::decode_json($response->decoded_content));
} else {
    warn $response->status_line;
}

1;
バッチの実行

就業時間の 9:00 から 18:00 の間で、1時間に一度、バッチを実行するように cron を登録します。

ダウンロード

でんこちゃん社内 bot のソースコードは、次のページからダウンロードできます。

ダウンロード - 3arrows.jp
https://sites.google.com/a/socialprise.jp/3arrows-jp/downloads

2011-03-30

3arrows アップデート! Google Apps アカウントでログインできるようになりました。

3月28日(月)、企業やチーム向けのプライベートマイクロブログ、3arrows をアップデートしました。アップデートの主な内容は次の通りです。

Google Apps アカウントでログインできるようになりました!

コントロールパネルの 「ユーザーの管理」 画面で、「Google Apps アカウントでログインする」 のチェックボックスにチェックを入れると、以後、3arrows に Google Apps アカウントでログインできるようになります。

なお、Google Apps for Business をご利用の方は、Google Apps の OpenID の設定を有効にする必要があります。


「ログイン」 画面では Google Apps アカウントのドメインを入力してください。


今回の Google Apps アカウントへの対応で、3arrows は個人間のコラボレーション、企業内のコラボレーション、企業間のコラボレーションを支援できるようになりました。

3arrows では、異なるドメインのメールアドレスのユーザー、異なるドメインの Google Apps アカウントのユーザーを、区別せずメンバーとして招待することができます。


全てのアプリケーションの更新をお願いします!

管理者の方は、コントロールパネルのアプリケーションタブから、全てのアプリケーションを更新してください。「更新する」 リンクをクリックすると、アプリケーションを更新できます。「最新」 と表示されれば更新の完了です。


3arrows では、引き続き α テストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を始めることができます。企業や個人等、利用条件に制限はありませんので、この機会にぜひお試しください。

2011-03-21

Google Apps Script に続けて Windows Script Host (WSH) で 2-Legged OAuth をやってみました

こんにちは。なかじまん @ YOKOHAMA です。
東北関東大震災で被災された皆さまには心よりお見舞い申し上げます。



Google Apps Script の UrlFetch Services は 2Legged OAuth に対応してないっぽいので自前でやってみた に続いて、Windows Script Host (WSH) を使って Windows のコマンドラインから 2-Legged OAuth をやってみました。

WSH の場合、いろいろな実装方法を選択できそうなのですが、前述の Google Apps Script の JavaScript をそのまま動かす方法を選択しています。

なので、ソースコードはほとんど同じで、UrlFetch Services ではなく XMLHttpRequest を同期で使っているくらいの違いです。
<job>
<script language="JavaScript" src="sha1.js"></script>
<script language="JavaScript" src="oauth.js"></script>
<script language="JavaScript" src="json2.js"></script>
<script language="JavaScript">

  var endpoint = 'http://nakajiman.3arrows.jp/api/rpc/a';
  var consumerKey = '{Consumer Key}';
  var consumerSecret = '{consumer Secret}';
  var requestor_id = 'nakajiman(at)lrlab.to';

  var message = { method: 'POST', action: endpoint, parameters: {} };

  OAuth.setParameter(message, 'oauth_consumer_key', consumerKey);
  OAuth.setParameter(message, 'oauth_version', '1.0');
  OAuth.setParameter(message, 'oauth_timestamp', OAuth.timestamp());
  OAuth.setParameter(message, 'oauth_nonce', OAuth.nonce(6));
  OAuth.setParameter(message, 'xoauth_requestor_id', requestor_id);

  OAuth.SignatureMethod.sign(message, { consumerSecret: consumerSecret });

  var url = OAuth.addToURL(endpoint, message.parameters);
  var data = JSON.stringify({
      jsonrpc: '2.0',
      method: 'activities.create',
      params: { userId: '@viewer', group: '@self', activity: { title: 'Say hello!' } },
      id: 1
  });
  
  var xhr = WScript.CreateObject('MSXML2.XMLHTTP');
  xhr.open(message.method, url, false);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.send(data);
  
  if (xhr.status != 200)
    WScript.Echo(xhr.status + ' ' + xhr.statusText);
  else {
    var res = JSON.parse(xhr.responseText);
    WScript.Echo(res.result);
  }

</script>
</job>
ただいま、 企業やチーム向けのプライベートマイクロブログ 3arrows では、お客様のシステムやサービスとの連携を目的とした「シングルサインオン」と「2-Legged OAuth ベースの API」に取り組んでいます。

2-Legged OAuth ベースの API 公開により、システムやサービスの統合に加えて、Google Apps Script や Windows Script Host から 3arrows を操作して、ユーリティティの用途としても活用できるようになります。

2011-03-07

3arrows アップデート! 投稿内容を引用して返信できるようになりました! Gmail や Trac のような明瞭な引用です!

3月2日(水)、企業やチーム向けのプライベートマイクロブログ、3arrows をアップデートしました。アップデートの主な内容は次の通りです。

ステータスの引用機能の追加

マイクロブログの各ステータスを引用できるようになりました。


Twitter の以前の RT 機能と類似の機能となりますが、引用したステータスがそれと分かるようにスタイリングされ、また、3arrows は Twitter と比較して文字数の制限が緩いため、ステータスを途中で切ることなく引用することができます。

ステータス上でのアプリケーションのアイコンと名前の表示

日報等、各アプリケーションからマイクロブログに通知されたステータスには、それと分かるようにアプリケーションのアイコンと名前を表示するようになりました。


これにより、どのアプリケーションからの通知なのかが一目で分かるようになります。

全てのアプリケーションの更新をお願いします!

管理者の方は、コントロールパネルのアプリケーションタブから、全てのアプリケーションを更新してください。「更新する」 リンクをクリックすると、アプリケーションを更新できます。「最新」 と表示されれば更新の完了です。


3arrows では、引き続き α テストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を始めることができます。企業や個人等、利用条件に制限はありませんので、この機会にぜひお試しください。