Consulを使ってみる(インストール編)

概要

Consulを使ってみたので、そのまとめ。
まずは第一弾なので、インストール〜Consulの起動までやります。
Installing Consul - Consul
Run the Agent - Consul

http://labs.gree.jp/blog/wp-content/uploads/2014/12/consul_logo.png


Consul

前提

検証環境:Dockerのコンテナ
OS:CentOS6

インストールしてみる

まずは、
Dockerでコンテナを立ち上げます。

$ docker run -t -i -d \
--name consul_1 \
-h consul_1 \
-p 8300:8300 \
-p 8301:8301/tcp \
-p 8301:8301/udp \
-p 8302:8302/tcp \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-p 8600:53/tcp \
-p 8600:53/udp \
centos:centos6 /bin/bash
2158edd62ff537fa75596ed367544b8e411d0cee7b702999712b663c3b207755

$ docker attach consul_1

次に、Consulをダウンロードしてパスに配置します。

# wget https://dl.bintray.com/mitchellh/consul/0.4.1_linux_amd64.zip
--2015-02-02 20:16:54--  https://dl.bintray.com/mitchellh/consul/0.4.1_linux_amd64.zip
Resolving dl.bintray.com... 108.168.194.92, 108.168.194.91
Connecting to dl.bintray.com|108.168.194.92|:443... connected.
HTTP request sent, awaiting response... 302 
Location: https://d29vzk4ow07wi7.cloudfront.net/a3764e06bb49dbb78e5f27c8a576ff3c17ba7d8a?response-content-disposition=attachment%3Bfilename%3D%220.4.1_linux_amd64.zip%22&Policy=eyJTdGF0ZW1lbnQiOiBbeyJSZXNvdXJjZSI6Imh0dHAqOi8vZDI5dnprNG93MDd3aTcuY2xvdWRmcm9udC5uZXQvYTM3NjRlMDZiYjQ5ZGJiNzhlNWYyN2M4YTU3NmZmM2MxN2JhN2Q4YT9yZXNwb25zZS1jb250ZW50LWRpc3Bvc2l0aW9uPWF0dGFjaG1lbnQlM0JmaWxlbmFtZSUzRCUyMjAuNC4xX2xpbnV4X2FtZDY0LnppcCUyMiIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTQyMjkwODI3NX0sIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIwLjAuMC4wLzAifX19XX0_&Signature=E23oQL3RpSJ-e8vJElsE6ce5nQkgtm-6bRav1~8O5tuvPmE5X~TZmN4t3WaVbXC1KPyXbLjCRkaJ6ezC4m6MhICfeB-QTkafnBdmS4E1C66dOMBGpWXrWf0OkilMaHmNn2~kma8~O3UhbA-70avz0LeKxZGHjbdCushxz5I1tJAFlIvYxJkKY5s8JQKuv21CCzhEupLNsjuiJtYLlylKeJiY8ZD2UIZsSLFkN4R2T1ApaXIzJdqEgK1t4W7s1NMBVVN3hFqD0EHPYo6KQ2NU6C1~GlYXN5Ys1Co0ZKx54Ab9EOMmndwVchAE7f~jln7wDj1N43IIdB433xhc9~5HEw__&Key-Pair-Id=APKAIQIOJCQ5764M5VTQ [following]
--2015-02-02 20:16:55--  https://d29vzk4ow07wi7.cloudfront.net/a3764e06bb49dbb78e5f27c8a576ff3c17ba7d8a?response-content-disposition=attachment%3Bfilename%3D%220.4.1_linux_amd64.zip%22&Policy=eyJTdGF0ZW1lbnQiOiBbeyJSZXNvdXJjZSI6Imh0dHAqOi8vZDI5dnprNG93MDd3aTcuY2xvdWRmcm9udC5uZXQvYTM3NjRlMDZiYjQ5ZGJiNzhlNWYyN2M4YTU3NmZmM2MxN2JhN2Q4YT9yZXNwb25zZS1jb250ZW50LWRpc3Bvc2l0aW9uPWF0dGFjaG1lbnQlM0JmaWxlbmFtZSUzRCUyMjAuNC4xX2xpbnV4X2FtZDY0LnppcCUyMiIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTQyMjkwODI3NX0sIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIwLjAuMC4wLzAifX19XX0_&Signature=E23oQL3RpSJ-e8vJElsE6ce5nQkgtm-6bRav1~8O5tuvPmE5X~TZmN4t3WaVbXC1KPyXbLjCRkaJ6ezC4m6MhICfeB-QTkafnBdmS4E1C66dOMBGpWXrWf0OkilMaHmNn2~kma8~O3UhbA-70avz0LeKxZGHjbdCushxz5I1tJAFlIvYxJkKY5s8JQKuv21CCzhEupLNsjuiJtYLlylKeJiY8ZD2UIZsSLFkN4R2T1ApaXIzJdqEgK1t4W7s1NMBVVN3hFqD0EHPYo6KQ2NU6C1~GlYXN5Ys1Co0ZKx54Ab9EOMmndwVchAE7f~jln7wDj1N43IIdB433xhc9~5HEw__&Key-Pair-Id=APKAIQIOJCQ5764M5VTQ
Resolving d29vzk4ow07wi7.cloudfront.net... 54.230.142.31, 54.230.140.33, 54.192.141.193, ...
Connecting to d29vzk4ow07wi7.cloudfront.net|54.230.142.31|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4073679 (3.9M) [application/unknown]
Saving to: “0.4.1_linux_amd64.zip”

100%[========================================================================>] 4,073,679    871K/s   in 5.1s    

2015-02-02 20:17:01 (775 KB/s) - “0.4.1_linux_amd64.zip” saved [4073679/4073679]

[root@consul_1 /]# unzip 0.4.1_linux_amd64.zip 
Archive:  0.4.1_linux_amd64.zip
  inflating: consul                 
 
# mv consul /usr/local/bin/.

では、Consulを起動させます。

# consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -bind=172.17.0.2 &
==> WARNING: BootstrapExpect Mode is specified as 1; this is the same as Bootstrap mode.
==> WARNING: Bootstrap mode enabled! Do not enable unless necessary
==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
         Node name: 'consul_1'
        Datacenter: 'dc1'
            Server: true (bootstrap: true)
       Client Addr: 127.0.0.1 (HTTP: 8500, DNS: 8600, RPC: 8400)
      Cluster Addr: 172.17.0.2 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false

==> Log data will now stream in as it occurs:

    2015/02/02 20:43:55 [INFO] raft: Node at 172.17.0.2:8300 [Follower] entering Follower state
    2015/02/02 20:43:55 [INFO] serf: EventMemberJoin: consul_1 172.17.0.2
    2015/02/02 20:43:55 [INFO] serf: EventMemberJoin: consul_1.dc1 172.17.0.2
    2015/02/02 20:43:55 [INFO] consul: adding server consul_1 (Addr: 172.17.0.2:8300) (DC: dc1)
    2015/02/02 20:43:55 [INFO] consul: adding server consul_1.dc1 (Addr: 172.17.0.2:8300) (DC: dc1)
    2015/02/02 20:43:55 [ERR] agent: failed to sync remote state: No cluster leader
    2015/02/02 20:43:57 [WARN] raft: Heartbeat timeout reached, starting election
    2015/02/02 20:43:57 [INFO] raft: Node at 172.17.0.2:8300 [Candidate] entering Candidate state
    2015/02/02 20:43:57 [INFO] raft: Election won. Tally: 1
    2015/02/02 20:43:57 [INFO] raft: Node at 172.17.0.2:8300 [Leader] entering Leader state
    2015/02/02 20:43:57 [INFO] consul: cluster leadership acquired
    2015/02/02 20:43:57 [INFO] consul: New leader elected: consul_1
    2015/02/02 20:43:57 [INFO] raft: Disabling EnableSingleNode (bootstrap)

無事、起動しました。
ちゃんと追加されているか確認します。

// メンバーに追加されている
# consul members
    2015/02/02 20:47:34 [INFO] agent.rpc: Accepted client: 127.0.0.1:43570
Node      Address          Status  Type    Build  Protocol
consul_1  172.17.0.2:8301  alive   server  0.4.1  2

// API経由でもnodeの確認が出来る
#  curl localhost:8500/v1/catalog/nodes
[{"Node":"consul_1","Address":"172.17.0.2"}]

// DNSでも引ける
# dig @127.0.0.1 -p 8600 consul_1.node.consul

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.1 <<>> @127.0.0.1 -p 8600 consul_1.node.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31212
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;consul_1.node.consul.		IN	A

;; ANSWER SECTION:
consul_1.node.consul.	0	IN	A	172.17.0.2

;; Query time: 5 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Mon Feb  2 20:45:15 2015
;; MSG SIZE  rcvd: 74

問題なさそうです。

PHPMDを使ってみた

PHPMD-2.1.3

概要

PHPの静的コード解析ツールPHPMDについて調べてみたので、そのまとめです。

インストール

installはcomposerを使います。 composer.jsonに下記を追記して、$ composer installでinstall完了です。

{
  "require": {
    "phpmd/phpmd": "*"
  }
}

コマンドの詳細

http://phpmd.org/documentation/index.html

$ vendor/bin/phpmd
Mandatory arguments:
1) A php source code filename or directory. Can be a comma-separated string
2) A report format
3) A ruleset filename or a comma-separated string of rulesetfilenames

Available formats: xml, text, html.
Available rulesets: cleancode, codesize, controversial, design, naming, unusedcode.

Optional arguments that may be put after the mandatory arguments:
--minimumpriority: rule priority threshold; rules with lower priority than this will not be used
--reportfile: send report output to a file; default to STDOUT
--suffixes: comma-separated string of valid source code filename extensions
--exclude: comma-separated string of patterns that are used to ignore directories
--strict: also report those nodes with a @SuppressWarnings annotation

ルールの詳細

ルールセットは、全てで6種類あります。

Ruleset 内容
cleancode きれいなコードかどうか
codesize コードの複雑さチェック
controversial 命名規則チェック
design 設計上の問題
naming 変数や関数の名称チェック
unusedcode 使われていない要素の検知

cleancode

BooleanArgumentFlag

PHPMD >= 1.4.0

priority : 1 関数の引数にbooleanのデフォルト値を設定しているものを検出する。

ElseExpression

PHPMD >= 1.4.0

priority : 1 if文でelseを使っているものを検出する。

StaticAccess

PHPMD >= 1.4.0

priority : 1 クラスの静的関数の呼び出しを検出する。

codesize

CyclomaticComplexity

PHPMD >= 0.1

priority : 3 ifやwhile, for, case labelの数が多いものを検出する。 デフォルトは10個以上。

NPathComplexity

PHPMD >= 0.1

priority : 3 Nパスの複雑数が高いものを検出する。 デフォルト値は200以上。

ExcessiveMethodLength

PHPMD >= 0.1

priority : 3 1関数内の行数が多いものを検出する。 デフォルトは100行以上。

ExcessiveClassLength

PHPMD >= 0.1

priority : 3 行数の多いクラスを検出する。 デフォルトは、1000行以上。

ExcessiveParameterList

PHPMD >= 0.1

priority : 3 関数のパラメータ数が多すぎるものを検出する。 デフォルトは10個より多い場合。

ExcessivePublicCount

PHPMD >= 0.1

priority : 3 1クラス内でのpublicの数が多すぎるものを検出する。 デフォルトは45個より多い場合。

TooManyFields

PHPMD >= 0.1

priority : 3 クラス内にプロパティの数が多すぎるものを検出する。 デフォルトは、10個より多い場合。

TooManyMethods

PHPMD >= 0.1

priority : 3 クラス内に関数数が多すぎるものを検出する。 デフォルト値は、10個より多い場合。

ExcessiveClassComplexity

PHPMD >= 0.2.5

priority : 3 クラスの複雑さを検出する。

controversial

Superglobals

PHPMD >= 0.2

priority : 1 スーパーグローバル変数の利用箇所を検出する。

CamelCaseClassName

PHPMD >= 0.2

priority : 1 キャメルケースではないクラス名を検出する。

CamelCasePropertyName

PHPMD >= 0.2

priority : 1 キャメルケースではないプロパティ名を検出する。

CamelCaseMethodName

PHPMD >= 0.2

priority : 1 キャメルケースではない関数名を検出する。

CamelCaseParameterName

PHPMD >= 0.2

priority : 1 キャメルケースではない関数のパラメータ変数名を検出する。

CamelCaseVariableName

PHPMD >= 1

priority : 0.2 キャメルケースではない変数名を検出する。

design

ExitExpression

PHPMD >= 0.2

priority : 1 exit()を使っている箇所を検出する。

EvalExpression

PHPMD >= 0.2

priority : 1 eval()を使っている箇所を検出する。

GotoStatement

PHPMD >= 1.1.0

priority : 1 gotoを使っている箇所を検出する。

NumberOfChildren

PHPMD >= 0.2

priority : 2 子クラスの数が多すぎるクラスを検出する。 デフォルトは、15個以上。

DepthOfInheritance

PHPMD >= 0.2

priority : 2 継承の階層が深すぎるものを検出する。 デフォルトは、6階層以上。

CouplingBetweenObjects

PHPMD >= 1.1.0

priority : 2 ひとつのオブジェクトで使っているクラスの種類が多すぎる場合を検出する。 デフォルトは、13種類以上。

naming

ShortVariable

PHPMD >= 0.2

短すぎる変数名を検出する。 デフォルトだと3文字未満。

LongVariable

PHPMD >= 0.2

priority : 3 長過ぎる変数名を検出する。 デフォルトだと20文字より多いとアウト。

ShortMethodName

PHPMD >= 0.2

priority : 3 短すぎる関数名を検出する。 デフォルトだと3文字未満。

ConstructorWithNameAsEnclosingClass

PHPMD >= 0.2

priority : 3 コンストラクタ_construct()ではなく、クラス名と同名にしているものを検出する。

ConstantNamingConventions

PHPMD >= 0.2

priority : 4 大文字じゃない定数を検出する。

BooleanGetMethodName

PHPMD >= 0.2

priority : 4 getXXX()という名称で返り値がbooleanの関数を検出する。 デフォルトだと、引数が設定されてる関数は対象外になる。 関数上のコメントで判断しているらしいので、コメントを忘れずに書かないと検出されない。boolでもNG。booleanと記述する必要があります。

    /**
     * @return boolean
     */

unusedcode

UnusedPrivateField

PHPMD >= 0.2

priority : 3 使われていないprivate変数を検出する。

UnusedLocalVariable

PHPMD >= 0.2

priority : 3 使われていないローカル変数を検出する。

UnusedPrivateMethod

PHPMD >= 0.2

priority : 3 使われていないprivte関数を検出する。

UnusedFormalParameter

PHPMD >= 0.2

priority : 3 使われていない関数の引数を検出する。

まとめ

使うに当たって、下記が問題になりそうです。

  • どのルールセットをチェックするんでしたっけ?
  • チェックするpriorityの最適値は?

unusedcodeのUnusedPrivateFieldが使いたいという場合は、XMLを記述する方式を使えば可能。

Jenkins Workflow Pluginを使ってみる

概要

Jenkinsカンファレンス2015に参加してきたところ、
Workflow Pluginなるイケてるプラグインを紹介していたので実際に試してみる。


jenkinsci/workflow-plugin · GitHub

実際に試してみる

Jenkinsは、過去記事を元にDockerで構築

dockerでJenkins環境を構築 - rabbit's blog

JenkinsのUIからインストール
「Workflow: Aggregator」を選択。
むむ、何だか沢山インストールされるんですが。。
f:id:rkobayas:20150201025643p:plain

まあ、それは置いておいて。
次にジョブを新規作成します。
f:id:rkobayas:20150201032645p:plain

Workflowが増えてますね。
それを選択します。

?!

ビルド前、ビルド後の設定が出来ないです。。
設定できるのはWorkflowのみ、ビルドに失敗した時にメールを送りたい!、などの場合はどうしたら。。
Workflowにmail関数を記述すれば出来るようですが、デフォルトでついているメール通知は宛先だけ設定すれば良くって楽だったんですが。

メール通知がネックですが、便利そうです。
リトライも出来ますし、色々使い勝手が良さそう。
※複雑にしすぎても保守していけるか分からんですが。

DSL書けない ><

こういう人も大丈夫!
書きたいDSLをジェネレートする機能までついてるんです!

dockerでJenkins環境を構築

概要

いろいろ試すのにJenkins環境が欲しいのでDockerで構築してみる。
後片付けも楽ですし。

Let's try

まずはJenkins用のコンテナを作る

$ docker run -t -i -d --name jenkins  -p 8080:8080 centos:centos6 /bin/bash
d9afa41b2e4d4cf124e4e8a37cd78d5034730736fbccb17c6571e9faa13654b8
$ docker attach jenkins

Javaをインストールする

$ yum install wget java-1.7.0-openjdk

次にJenkinsをインストールする。

// wgetでJenkinsをダウンロード
# wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-1.580.3-1.1.noarch.rpm
--2015-01-28 16:41:08--  http://pkg.jenkins-ci.org/redhat-stable/jenkins-1.580.3-1.1.noarch.rpm
Resolving pkg.jenkins-ci.org... 199.193.196.24
Connecting to pkg.jenkins-ci.org|199.193.196.24|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://mirrors.jenkins-ci.org/redhat-stable/jenkins-1.580.3-1.1.noarch.rpm [following]
--2015-01-28 16:41:08--  http://mirrors.jenkins-ci.org/redhat-stable/jenkins-1.580.3-1.1.noarch.rpm
Resolving mirrors.jenkins-ci.org... 199.193.196.24
Connecting to mirrors.jenkins-ci.org|199.193.196.24|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://ftp.tsukuba.wide.ad.jp/software/jenkins/redhat-stable/jenkins-1.580.3-1.1.noarch.rpm [following]
--2015-01-28 16:41:09--  http://ftp.tsukuba.wide.ad.jp/software/jenkins/redhat-stable/jenkins-1.580.3-1.1.noarch.rpm
Resolving ftp.tsukuba.wide.ad.jp... 203.178.132.80, 2001:200:0:7c06::9393
Connecting to ftp.tsukuba.wide.ad.jp|203.178.132.80|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 62031675 (59M)
Saving to: “jenkins-1.580.3-1.1.noarch.rpm”

100%[========================================================================>] 62,031,675  3.86M/s   in 24s     

2015-01-28 16:41:33 (2.50 MB/s) - “jenkins-1.580.3-1.1.noarch.rpm” saved [62031675/62031675]

[root@d9afa41b2e4d /]# rpm install jenkins-1.580.3-1.1.noarch.rpm
RPM version 4.8.0
Copyright (C) 1998-2002 - Red Hat, Inc.
This program may be freely redistributed under the terms of the GNU GPL

// rpmでJenkinsをインストール
# rpm -Uvh jenkins-1.580.3-1.1.noarch.rpm 
warning: jenkins-1.580.3-1.1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID d50582e6: NOKEY
Preparing...                ########################################### [100%]
   1:jenkins                ########################################### [100%]

あとは、起動させるだけ。

# service jenkins start
Starting Jenkins                                           [  OK  ]

アクセスするとJenkinsがちゃんと立ち上がってます。

f:id:rkobayas:20150201022359p:plain

コンテナ仮想化「Docker」技術勉強会(2014-12-11) まとめ

概要

別件で参加できなかった。。


【200名に最終増枠!】第2回エンタープライズ向けのオープンソース勉強会 - 『コンテナ仮想化「Docker」技術勉強会』 - : ATND

動画


コンテナ仮想化「Docker」技術 - YouTube