CentOS 7にLAMP環境を構築。GitBucketとJenkinsを動かし、自動ビルドや自動デプロイまでやってみます。
なぜGitBucketか
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で行う
動作環境
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 enable --now httpd
systemctl enable --now tomcat
systemctl enable --now mariadb
サービスの状況は以下のコマンドで確認できます。
systemctl list-unit-files
GitBucketをインストール
先述の通り、.warファイルを置くだけの簡単インストールです。
releaseから最新版のgitbucket.warをダウンロードして、実行用のディレクトリにコピーします。
cp gitbucket.war /var/lib/tomcat/webapps/
Jenkinsをインストール
こちらも.warファイルを置くだけです。
簡単でいいですね!
最新版の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上で構築してみるのも良いかと思います。