GitHubとJenkins連動 自動デプロイ 開発環境設定編

前回の記事でGitHubとJenkinsを用いた自動デプロイ環境の概要をご説明しました。

GitHubやJenkinsと連携した開発環境作成でのrsyncとの出会い

今回は、その環境を実現するための設定手順を書いて行きたいと思います。

大きく4つの手順があります。

  1. Jenkinsのインストール
  2. Apacheの設定
  3. JenkinsとGitHubの連携
  4. 自動デプロイ設定

開発環境

・CentOS 6.2
・Apache がインストール済み

Jenkinsのインストール

まずは、Jenkinsのインストール
通常ならば、運用するサーバとJenkinsが動いているサーバを分けるべきですが、サーバコストの都合などで今回は同一サーバ上で動かすことにします。
ApacheサーバとJenkinsサーバが同じport80で待つことはできないので、jenkinsをport:8080で動かすことにします。

1台のサーバにApacheとJenkinsを起動

また、セキュリティ上必要最低限以外のportを開放したくないため、80番ポートのみ開放して内部的に8080に変換する方法をとります。仕組みとしては、port:80番で「あるURL」にアクセスが来た場合に、内部でport:8080に変換してアクセスするという方法です。この仕組みをリバースプロキシーと言います。

リバースプロキシでJenkinsにアクセス

まずは、この形を目指して設定していきます。
前置きが長くなりましたが、早速Jenkinsのインストール
Jenkinsは、yumでインストールしますが、まずはyumでインストール出来るようリポジトリに追加してから行います。

適当なフォルダ(通常 /tmpかな?)で


  sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins- ci.org/redhat/jenkins.repo sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

を実行後


  sudo yum install jenkins

次にJenkinsを実行するにはJavaが必要であるため、JDKがインストールされていない場合はインストールします。


  sudo yum list \*java-1\* | grep open
  sudo yum install java-1.6.0-openjdk.x86_64
  sudo yum install java-1.6.0-openjdk-devel.x86_64

参考:http://kumagonjp2.blog.fc2.com/blog-entry-103.html

次に『http://ホスト名/jenkins』でアクセスするとJenkinsにアクセス出来るように設定します。
/etc/sysconfig/jenkinsファイルを編集しましょう!

vim /etc/sysconfig/jenkins

デフォルトでは、PORTは8080になっているので、prefixの設定のみ行う


  JENKINS_PORT="8080"

  JENKINS_ARGS="––prefix=/jenkins"

これでJenkins側の設定は終了です。

Apacheの設定

Apacheで起動する際には、バーチャルホストの設定を行ってください。(必須ではありません)
バーチャルホストについては、こちらを参考に...
http://www.atmarkit.co.jp/flinux/rensai/apache08/apache08a.html

Jenkinsにアクセスするためにリバースプロキシの設定を行います。

/etc/httpd/conf/httpd.conf/ か バーチャルホスト別にファイルを分けている場合はそのファイルに下記の内容を追記する


  <VirtualHost *:80>の中に記載
    ...省略...
    
    #jenkinsへアクセス出来るように
    ProxyRequests Off
    ProxyPreserveHost on
    ProxyPass /jenkins http://127.0.0.1:8080/jenkins
    ProxyPassReverse /jenkins http://127.0.0.1:8080/jenkins
    <Proxy http://localhost:8080/jenkins*>
        Order deny,allow
        Allow from all
    </proxy>
  </VirtualHost>

Apacheの再起動!


  sudo service httpd restart

jenkinsの起動


  sudo service jenkins start

注意
※Apacheの開放しているポートに8080が無いことを確認する
※もし8080を開放しているのであれば、コメントアウトする
/etc/httpd/conf/httpd.confの


  Listen 80
  #Listen 8080

これで『http://ホスト名/jenkins』にアクセスして、Jenkinsが開くかどうか確認する。

jenkinsTOPページ

ついでに...

jenkinsの常駐化


  sudo chkconfig jenkins on

リストに入ったことを確認


  /sbin/chkconfig --list | grep jenkins

これで、ApacheとJenkinsが同じサーバで動き始めました!!

Jenkins参考:http://blog.livedoor.jp/tattyamm/archives/4147336.html

〜2013/01/25 追記〜

上記設定では、~~URL~~/jenkinseでアクセス出来ないとの声が多数上がっています。
多分何かの記入漏れだと思いますので、解決し次第追記させて頂きます。

〜2013/01/28 追記〜

上記問題についてですが、ファイアーウォールで8080ポートが解放されていると上手くつながらないそうです。
一度、ファイアーウォール(iptables)で8080ポートを閉じてみて、試してみて下さい。

JenkinsとGitHubの連携

ここからは、自動デプロイ環境構築に向けて、GitHubとの連携を構築していきたいと思います。
前回のおさらいで今目指している形は以下の図の通りです。

理想の開発環境

JenkinsとGitHubの連携を行うために、jenkinsでgit pluginをインストールします。
Jenkinsの管理->プラグインの管理->利用可能で検索してインストール

JenkinsでGit pluginのインストール手順

次にGitHubへは鍵認証が必要であるため、Jenkinsユーザで鍵の認証設定を行います。
Jenkinsをインストールした際に、Jenkinsユーザが既に作成されており、
Jenkinsユーザのホームディレクトリは /var/lib/jenkinsにあります。

では、jenkinsユーザでsshキーの作成を行います


  cd /var/lib/jenkins
  cd .ssh (なければmkdir .ssh)
  sudo -u jenkins -H ssh-keygen -t rsa -C jenkins@hoge.com
  chmod 744 ../.ssh

※パーミッションなどの問題が合った場合、root権限で鍵を作成し/root/.ssh以下に出来た鍵を
/var/lib/jenkins/.sshに移動しchownで所有者をjenkinsに変えるという方法でも大丈夫です。

これで、公開鍵(id_rsa.pub)と秘密鍵(id_rsa)の設定は終了。

次に公開鍵をGitHubに登録します。
プロジェクトごとのキーに設定すると重複してエラーなど出るのでユーザのSSHKeyとして登録する

GitHubに公開鍵の登録

ここで、先ほど作成した公開鍵(id_rsa.pub)の中身を貼り付ける。Titleは好きな名前で良い。

次に大事なのは、GitHubにアクセスできるよう初期アクセスを行うことです。
以下のコマンドでGitHugにアクセス出来るかどうか確認を行なって下さい。


  sudo -u jenkins ssh -T git@github.com
  (メッセージが出たらyesと入力)

最後にJenkinsのgit情報の登録を行う


  sudo -u jenkins git config --global user.email "jenkins@hoge.com"
  sudo -u jenkins git config --global user.name "jenkins"

とりあえずuser.emailは適当で大丈夫です。

次にJenkinsでGitHubからコードを取得するという設定を行います。
そのために、まずは、自動デプロイしたいプロジェクトを作成します。

新規ジョブ作成でフリースタイル・プロジェクトのビルドを選択し、ジョブ名を入力してOKを押します

Jenkins新規ジョブの登録

すると、設定画面が出てくるので中段付近にある「ソースコード管理システム」でGitを選択します。
(この項目が出ていない場合は、Gitプラグインを正しくインストールして下さい)
ここのRepository URLに自動デプロイしたいリポジトリのアドレスを入力して下さい。

JenkinsにgitリポジトリのURLを登録

ここで入力するURLは、http://から始まるURLではなくgit@github.com:から始まるURLを入力して下さい。
これで保存を押して、Jenkinsの初期設定は終了です。

GitHubの設定

次にGitHubへpushしたタイミングで最新のコードをpullしてくる設定を行いたいと思います。
これには、フックという仕組みを利用します。

簡単に説明すると何かアクションが起きたタイミングで、なんらかの処理を行う仕組みのことを言います。
ここでは、GitHubへpushされたタイミングで、Jenkinsがコードをpullしてくるということを実装したいと思います。

フックの仕組み

ここでは、GitHubのService hooksという仕組みを使用します。
Service hooksの設定には、Jenkinsの「ビルドを実行」というところのURLが必要になるためこのURLをコピーしておきます。

ビルド実行URLコピー

右クリックでリンクアドレスをコピーします。

次にGitHubのページへ行き、自動デプロイしたいリポジトリのsettingからService hooksの設定を行います。

GitHub Service Hooksの設定

ここのWebHook URLs に先ほどコピーしたURLを貼り付けて保存します。

これで、GitHubへPushしたタイミングで先ほど入力したURL(ビルドの実行)が呼び出され
最新のコードがJenkinsへpullされるという仕組みの実装が出来ました。

自動デプロイ設定

最後にWebサーバで公開しているディレクトリに最新のコードをデプロイする設定を行います。
ここからは、先日の記事に書いたrsyncを使用します。
rsyncについては、以前の記事を参考に
GitHubやJenkinsと連携した開発環境作成でのrsyncとの出会い

Jenkinsのジョブの設定->ビルドのプルダウンメニューからシェルの実行を選択

Jenkinsシェルの実行

空欄に


    rsync -vr --delete --exclude ".git/" /var/lib/jenkins/jobs/ジョブ名/workspace/ 公開しているディレクトリへの絶対パス

上記設定で、GitHubへpushしたタイミングで自動デプロイが実行され、またテスト用に直接ファイルをサーバにあげてテスト実行後GitHubへPushしたタイミングで公開ディレクトリがGitHubの最新のコードの状態に保たれるという自分にとっての理想の開発環境を構築することが出来ました。

ちなみに別サーバでJenkinsを動かし、そのサーバからrsyncを利用する場合は


    sudo -u user名 rsync -rlptgvC -e "ssh -i 公開鍵名"  /var/lib/jenkins/jobs/Job名/workspace/* user名@IPアドレス:公開ディレクトリ絶対パス

ってな感じで行けるはず,,,

Jenkinsさんは、他にもブランチを切って作業している場合にはブランチの指定やテストが通った場合のみテスト環境へアップさせるなど色々と出来るため、もっと勉強して活用して行きたいと思います!!

ご意見ご指摘、ご感想などありましたらコメント欄へどしどしお書き下さい。
勉強させて頂きます。

長々とありがとうございました!!

参考サイト

  1. No Comments

*