CentOS 7でGitBucketを動かしてJenkinsで自動デプロイ

WEB+DB開発, サーバ構築

CentOS 7でGitBucketを動かしてJenkinsで自動デプロイ

CentOS 7にLAMP環境とOpenJDK + Tomcatを導入して、GitBucketとJenkinsを動かしてみます。それだけでは芸がありませんので、WebHookを使ってpushされたらJenkinsで自動ビ […]

スポンサーリンク

CentOS 7にLAMP環境とOpenJDK + Tomcatを導入して、GitBucketJenkinsを動かしてみます。それだけでは芸がありませんので、WebHookを使ってpushされたらJenkinsで自動ビルド、「apache ユーザーでの」自動デプロイまでやってみます。

なおGitBucketはGitHubクローンで、似たものに有名なGitLabがあります。
GitLabも最近はrpmコマンド一発でインストールできるほど簡単になっていますが、今回はより簡単 (.warファイルを置くだけ) で、見た目や使い勝手もGtiHubに近いGitBucketを選びました。

概要

  • ソースからのビルドは行わず、yumパッケージや.warファイルを使用
  • Apacheのmod_proxy_ajpを使い、Tomcatへはポート8080ではなく80でアクセス
  • GitBucketでリポジトリにpushがあったらJenkinsで自動ビルド
  • Jenkinsのビルドでは、rsyscでApacheの公開ディレクトリに自動デプロイ
  • 自動デプロイ時のユーザーはtomcatではなくapacheで行う

動作環境

https://www.centos.org/

CentOS 7のミラーサイト一覧です。日本のミラーから最新版をダウンロードしてください。

Vagrantで起ち上げた仮想マシンやDockerコンテナでも構いませんが、一部読み替えたり、ポートマッピング等の追加設定が必要になります。

リポジトリの準備

デフォルトではパッケージが少なかったり古かったりするので、EPELとremiのリポジトリを追加します。

EPELリポジトリの追加

# yum install -y epel-release

remiリポジトリの追加

# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

パッケージのインストールと起動設定

とりあえずは最新の状態にしておきます。

# yum -y update

必須パッケージに加え、普段よく使うパッケージも入れておきます。

# yum --enablerepo=epel,remi install -y sudo vim-enhanced syslog httpd httpd-devel php php-devel php-pear php-mysql php-gd php-mbstring php-pecl-imagick mariadb-server phpmyadmin wget git java-1.7.0-openjdk-devel tomcat

各種サービスを起動し、さらに再起動時にもサービスが有効になるように設定します。

CentOS 6まではservice(または/etc/rc.d/init.d/のスクリプト)とchkconfigコマンドを使用しましたが、CentOS 7ではsystemctlに変更されています。

# systemctl start httpd
# systemctl enable httpd
# systemctl start tomcat
# systemctl enable tomcat
# systemctl start mariadb
# systemctl enable mariadb

サービスの状況は以下のコマンドで確認できます。

# systemctl list-unit-files

GitBucketをインストール

先述の通り、.warファイルを置くだけの簡単インストールです。

https://github.com/gitbucket/gitbucket

releaseから最新版のgitbucket.warをダウンロードして、実行用のディレクトリにコピーします。

# cp gitbucket.war /var/lib/tomcat/webapps/

Jenkinsをインストール

こちらも.warファイルを置くだけです。なんて簡単!

http://jenkins-ci.org/

最新版のJava Web Archive (.war)をダウンロードして、以下のディレクトリにコピーします。

# cp jenkins.war /var/lib/tomcat/webapps/

ここでTomcatを再起動しておきます。

# systemctl restart tomcat

ファイアウォールの設定

CentOS 6まではiptablesを使用しましたが、CentOS 7ではfirewalldに変更されています。

# firewall-cmd --add-port=80/tcp --permanent

Apacheのプロキシ設定

AJPというプロトコルによって、ApacheとTomcatの相互通信を行い、外部への配信はApacheが担当するようにします。

TomcatのAJP通信は、ポート8080ではなく8009を用います。

以下のファイルを作成します。

/etc/httpd/conf.d/gitbucket.conf

<Location /gitbucket>
    ProxyPass ajp://localhost:8009/gitbucket
</Location>

/etc/httpd/conf.d/jenkins.conf

<Location /jenkins>
    ProxyPass ajp://localhost:8009/jenkins
</Location>

ファイルを作成したら、Apacheを再起動しておきます。

# systemctl restart httpd

アクセスしてみる

まずはGitBucketにアクセスしてみます。

http://[hostname]/gitbucket

  • ユーザー名:root
  • パスワード:root

ログイン後はrootのパスワードを変更し、新規ユーザーを作成しておきます。

次にJenkinsにアクセスしてみます。

http://[hostname]/jenkins

正常に起動し、アクセスできました。

Jenkinsにプラグインをインストールする

「Jenkinsの管理」→「プラグインの管理」→「利用可能」へと進みます。

フィルタに「git」と入力して、以下のプラグインを選択して「再起動後にインストール」します。

必要なプラグインがインストールされますので、「インストール完了後、ジョブがなければJenkinsを再起動する」にチェックを入れて待ちましょう。

長時間インストールが終わらない場合、実は既に終っているのに表示に変化がないだけということもあります。

GitBucketとJenkinsの連携設定

GitBucketのリポジトリを作成し、pushがあった際にJenkinsで自動デプロイを行うよう設定します。

GitBucket の設定

画面右上のレンチ型アイコンから設定画面へ進み、「System Settings」を選択します。

項目 設定値
Base URL http://[hostname]/gitbucket/
SSH access ■ Enable SSH access to git repository

GitBucketでリポジトリを作成する

「new repository」からリポジトリ名を入力、「Initialize this repository with a README」にチェックを入れて新規リポジトリを作成します。

これで、リポジトリのトップページに表示されるREADME.mdのみがInitial commitされた状態になります。

次にリポジトリの「Settings」→「Service Hooks」と進み、「WebHook URLs」を入力します。

http://[hostname]/jenkins/gitbucket-webhook/

GitBucket側での設定は、このWebHookのみです。

apacheユーザーでデプロイするための設定

普通にデプロイの設定をすると、ファイル群はtomcatユーザーのままデプロイされます。
これだとApache的に都合が悪い場合もあるため、デプロイをapacheユーザーで行うようにします。

そのためには、Jenkinsを動かしているtomcatユーザーが、sudo -u apacheできるようにしなければなりません。

# visudo

↓ 変更前

Defaults    requiretty

↓ 変更後(コメントアウトする)

# Defaults    requiretty

さらにtomcatユーザーがパスワード無しでsudoできるよう設定します。

以下の行を追加

tomcat  ALL=(ALL)       NOPASSWD: ALL

そして、デフォルトでは/var/www/htmlの所有者がrootになっており、このために自動デプロイが失敗するので、権限を変更しておきます。

# chown -R apache. /var/www/html

Jenkinsの自動デプロイ用ジョブを作成

新規ジョブ作成から、ジョブ名を入力 (例:project01)、「フリースタイル・プロジェクトのビルド」を選択してOKをクリックします。

GitBucketのリポジトリページからコピペできる項目が多いです。

項目 設定値
GitBucket – URL http://[hostname]/gitbucket/
ソースコード管理 –
Git – Repository URL
http://[hostname]/gitbucket/git/username/project01.git
リポジトリ・ブラウザ GitBucket
リポジトリ・ブラウザ – URL http://[hostname]/gitbucket/username/project01/
ビルド・トリガ ■ Build when a change is pushed to GitBucket

最後に「ビルド手順の追加」から「シェルの実行」を選択し、下記シェルスクリプトを記入します。割とここが目玉です。

sudo -u apache rsync -vr --delete --exclude ".git/" /usr/share/tomcat/.jenkins/jobs/project01/workspace/ /var/www/html/project01/

動作確認

gitコマンド、またはお使いのGitクライアントから、ファイルに適当な修正を加えてコミット → プッシュしてみてください。

※尋ねられるアカウントは、GitBucketのユーザーアカウントです。

GitBucketでは、GitHub同様にコミット履歴が加わっていれば成功です。こちらはまず大丈夫でしょう。

Jenkinsでは、リポジトリに対応するジョブが実行されて、/var/www/html以下に自動デプロイが行われたことを確認できればOKです。

CentOS 6で構築する場合

CentOS 6でも同様に、まずyumのリポジトリとしてEPELとremiをインストールします。

Tomcat 7もインストールできるため、一部CentOS 7独特の部分 (systemctlやファイアウォール等) 以外はそのまま進められます。

しかしJenkinsのGit Pluginがエラーを吐きます

これはCentOS 6にyumでインストールしたGitのバージョンが、1.7.1等の古いバージョンだからです。

解決するためには、最新のソースからGitをインストールすることです。

古いGitを削除

# yum remove -y git

必要になるパッケージをあらかじめインストール

# yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel

新しいGitのソースファイルをダウンロード

# wget https://git-core.googlecode.com/files/git-1.9.0.tar.gz

解凍してインストール

# tar zxf git-1.9.0.tar.gz
# cd git-1.9.0
# ./configure --prefix=/usr/local/
# make
# make install

もし/usr/local/binにPATHが通っていなければ、下記のように.bash_profileに追加しておいてください。

.bash_profile

PATH=$PATH:/usr/local/bin

export PATH

そして上記変更を適用します。

# source ~/.bash_profile

一応Gitのバージョンを確認しておきましょう。

# git --version

これでJenkinsもエラーを吐くこと無く動作するはずです。

CentOS 7で採用されたApache 2.4の設定は従来とかなり変わっており、そのせいで戸惑うこともあるかと思いますので、馴染めない方は、少々面倒ですが上記の方法でCentOS 6上で構築してみるのも良いかと思います。


PAGE TOP