EC2にJenkinsによるCI環境を作成する

2013.09.13

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

渡辺です。AWSチームにジョインしてから1ヶ月ほどになりますが、あまりAWSを活用していません。 これではイカンということで、JenkinsによるCI環境をEC2上に構築してみました。

構築の流れ

こんな流れで構築します。

  1. EC2インスタンスを作成し、ElasticIPを割り当てる
  2. 最新のJDKをインストールする
  3. Jenkinsを起動する
  4. Jenkinsのセキュリティを設定する

EC2インスタンスを作成し、ElasticIPを割り当てる

AWSを使い慣れている人にとっては簡単な作業ですが、使い慣れていないと戸惑う所も多いところです。折角なので丁寧に解説します。

予めAWSのアカウントは各自で作成しておき、AWSの管理コンソールにログインしてください。

EC2インスタンスの作成

はじめにEC2(Amazon Elastic Compute Cloud)のインスタンスを作成します。

EC2はAWSでも最も基本的なサービスのひとつで、いわゆるVPSです。好みのOSを選択し、時間借りでサーバを利用することができます。

AWS_Management_Console_Home

メニューからInstanesを選択してください。なお、インスタンスは世界中のリージョン(地域)に配置可能で、リージョンによって料金も異なります。ここではTokyoを選択してます。

EC2_Management_Console

はじめインスタンスが存在しないのでリストには表示されません。Launch Instanceをクリックしてインスタンスを作成しましょう。

EC2_Management_Console-3

インスタンスは幾つかの方法で作ることができますが、ここでは「Classic Wizard」を選択し、Contineをクリックします。

EC2_Management_Console-2

次にインスタンスで利用するOSを選択します。OSはAMI(Amazon Machine Image)という形で提供されていますが、自分でAMIを作って登録することもできます。ここでは、Amazon Linux AMI (64bit)を選択しました。Amazon LinuxはCentOSベースのLinuxで、概ねCentOSと同じように使うことができます。

EC2_Management_Console-3

次にインスタンスの設定をしていきますが、とりあえずはInstance Typeを選択すれば他はデフォルト設定で良いでしょう。勿論、高性能なInstance Typeであるほど利用料金は高くなります。Jenkinsを動かすにはMicro/Smallでは心許ないので、Mediumを選択します。後から変更も可能なのがAWSの利点でもあるので、とりあえず選択しておいて構いません(とりあえず試すだけならばSmallでも充分です)。

EC2_Management_Console

その後は幾つか設定項目がありますが、デフォルトのまま進んでください。インスタンスの名前を設定する画面では「Jenkins」など適当な名前をつけましょう。

EC2_Management_Console-2

次にEC2インスタンスへsshでログインする時に必要なキーペアを作成します。既にキーペアが作成されていれば選択すればOKですが、ここでは専用のキーペアを作成します。「Create a new Key Pair」を選択し、名前「jenkins-kp」を入力します。最後にCreate & Download your Key Pairをクリックし、pemファイルをダウンロードします。

EC2_Management_Console

最後にセキュリティグループを設定します。セキュリティグループは、ポートやIPアドレスによってEC2インスタンスへのアクセス制御を行う仕組みです。デフォルトでは22(ssh)のみが許可されているので、Jenkinsで利用する予定の8080ポートを開放しておきます。Group Nameに「jenkins」、Group Descriptionに「ssh 8080」と入力します。次にPort rangeに「8080」を入力し、「Add Rule」で許可するポートを追加します。

EC2_Management_Console

以上でEC2のインスタンスは作成されました。すぐにリストには表示されますが、インスタンスの起動には数秒から数十秒かかります。

EC2_Management_Console

仕上げとして、作成したEC2インスタンスにElastic IPを割り当てましょう。Elastic IPを割り当てることで、はじめてインターネットからアクセスできるようになります。Elastic IPsからAllocate New Addressで新しいIPアドレスを取得します。

EC2_Management_Console

次にAssociate Addressで先ほど作成したEC2インスタンスと関連付けます。

EC2_Management_Console

EC2_Management_Console

以上で、Elastic IPでEC2インスタンスにアクセスできるようになりました。

EC2_Management_Console

最新のJDKをインストールする

それでは早速EC2インスタンスに接続しましょう。sshコマンドでpemファイルを指定し、接続します。この時、Amazon Linuxでは、ユーザ名はec2-userです。なお、pemファイルはパーミッションを600に設定しておかなければエラーになるので注意してください。

$ chmod 600 ~/.ssh/jenkins-kp.pem 
$ ssh -i ~/.ssh/jenkins-kp.pem ec2-user@54.XXX.XXX.XXX
The authenticity of host '54.XXX.XXX.XXX (54.XXX.XXX.XXX)' can't be established.
RSA key fingerprint is **:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '54.XXX.XXX.XXX' (RSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/
There are 10 security update(s) out of 21 total update(s) available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-***-**-*-*** ~]$

javaのバージョンを確認してみます。

$ java -version
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.11.90) (amazon-62.1.11.11.90.55.amzn1-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

折角なのでJDK7をインストールします。OracleのJDKは直接wgetするのが面倒なので、ローカルにダウンロードしからscpで転送する方が楽でしょう。Amazon LinuxはCentOS系なのでRPMファイルをOracleからダウンロードして転送します。

$ scp -i ~/.ssh/jenkins-pk.pem jdk-7u40-linux-x64.rpm  ec2-user@54.XXX.XXX.XXX:~

rpmなのでインストールは簡単です。

$ sudo rpm -ivh jdk-7u40-linux-x64.rpm

次にalternativesコマンドでインストールしたjava7を登録し、デフォルトのJava6と切り替えられるようにします。はじめにinstallで登録します。

$ sudo alternatives --install /usr/bin/java java /usr/java/jdk1.7.0_40/bin/java 2000

設定を変更するには、configを利用します。

$ sudo alternatives --config java

2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
   2           /usr/java/jdk1.7.0_40/bin/java

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:

jdk7の方(2)を選択し、確認してみます。

$ java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)

Jenkinsの実行

Jenkinsはwarファイルとして提供されていますが、アプリケーションサーバへデプロイするだけではなく、単体のJARファイルとして実行することができます。公式サイトから最新のWARファイルをダウンロードし、次のコマンドで実行してください。

$ java -jar jenkins.war &

起動したならば、ブラウザからhttp://54.XXX.XXX.XXX:8080にアクセスし、動作を確認します。

Jenkinsの初期設定

フルオープンでJenkinsを利用するならばこれで完了ですが、誰でもどんな操作も可能です。EC2に置いておくには危険すぎます。最低限のセキュリティを設定しておきましょう。なお、手順を間違えると自分もアクアセスできなくなるので注意してください。

はじめに「Jenkinsの管理」から「セキュリティを設定」をクリックします。

Jenkinsの管理__Jenkins_

最初に行う設定はセキュリティの有効化と、ユーザ情報の管理方法です。Jenkinsでは独自のデータベースを持っているのでこれを使うのが最も簡単です。LDAP等で連携可能なのであれば、LDAPを使ってください。また、ユーザのサインアップを許可してしまうと勝手にユーザを作られてしまうので無効にしておきます。

グローバルセキュリティの設定__Jenkins_

まずはこの状況で保存してください。

次にユーザを作成します。保存後に自動的にサインアップ画面が出たならば、そこで1人目のユーザを登録します。2人目以降のユーザは、管理画面の「ユーザの管理」から作成します。なお、ユーザの管理はセキュリティを有効化し、Jenkinsの独自データベースを設定しなければメニューに出てきません。ここで必要な数のユーザを作成してください。

Jenkinsの管理__Jenkins_

最後に先ほど設定した「グローバルセキュリティの設定」で、権限管理を設定します。Jenkinsの操作はブロックしても、誰でもジョブの一覧が参照可能で良いならば、「ログイン済みユーザに許可」を選択します。ジョブの一覧も見せたくない場合は、「行列による権限設定」を選択し、ユーザ毎に権限を設定してください。なお、右端に全選択ボタンがあります。

グローバルセキュリティの設定__Jenkins_-2

以上でEC2上にJenkinsによるCI環境を構築できました。AWSを利用すれば非常に簡単にCI環境を構築できますが、セキュリティには注意して利用してください。

設定に失敗したら...

セキュリティの設定に失敗してしまったら、一度Jenkinsをシャットダウンし、Jenkinsのホームディレクトリを削除してから再起動してしまいましょう。Jenkinsのホームディレクトリは、~/.jenkinsです。