groovy-sshを使ってCentOSにGitBucketとJenkinsをインストールする
Posted on January 21, 2015 at 22:45 (JST)
groovy-sshでサーバのプロビジョニングをしてみました。
作成したサンプルはGithubにて公開しています。[ ci-server-provisioning ]
1. Vagrantの設定
動作検証を行ったVagrantのバージョンは 1.7.2 です。
プロビジョニングする仮想マシンは下記のBoxを使用しました。
https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
(Vagrantbox.esに記載されていたもの)
[ Vagrantfile (修正箇所のみ抜粋) ]
# 下記を有効化し、ipを変更
config.vm.network "private_network", ip: "192.168.33.11"
# 下記を有効化し、メモリを変更
config.vm.provider "virtualbox" do |vb|
# Don't boot with headless mode
vb.gui = true
# Use VBoxManage to customize the VM. For example to change memory:
vb.customize ["modifyvm", :id, "--memory", "2048"]
end
2. サーバー構築手順(ShellScript)を記述
今回はGradleのapplicationプラグインから実行できるよう、mainメソッドを用意したClassにしています。
groovy-sshではリモートサーバのShell実行結果(ExitStatus)が 0 ではない場合は例外とする仕様なので、Shellが冗長になっています。
[ CIServerProvisioning.groovy (※ 表示の都合により改行を行っています。動くソースはGithubをご参照ください)]
package com.example
import org.hidetake.groovy.ssh.Ssh
import org.hidetake.groovy.ssh.session.BadExitStatusException
class CIServerProvisioning {
def setup() {
def ssh = Ssh.newService()
ssh.remotes {
webServer {
host = '192.168.33.11'
port = 22
user = 'vagrant'
password = 'vagrant'
knownHosts = allowAnyHosts
}
}
ssh.run {
session(ssh.remotes.webServer) {
// Wget
def existsWget = execute 'echo `yum list installed | grep wget`' // ※1
if (!existsWget) {
executeSudo 'yum install wget -y'
}
// Oracle JDK8
// 下記URLを確認の上、同意する場合のみ実行してください。
// http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
def existsJava8 = execute('echo `java -version 2>&1 | grep version`') // ※2
if (!existsJava8) {
println("installing Java8...")
try {
executeSudo 'wget --no-verbose --no-check-certificate --no-cookies -
--header "Cookie: oraclelicense=accept-securebackup-cookie"
http://download.oracle.com/otn-pub/java/jdk/8u25-b17/jdk-8u25-linux-x64.rpm'
} catch (BadExitStatusException e) {
if (!e.message.contains('Command returned exit status 4')) { // ※3
throw e
}
executeSudo "rpm -ivh jdk-8u25-linux-x64.rpm"
execute "rm -f jdk-8u25-linux-x64.rpm"
}
}
// Tomcat8
def existsTomcat8 = execute('echo `/sbin/chkconfig --list tomcat8`')
if (!existsTomcat8) {
println("installing Tomcat8...")
executeSudo 'wget --no-verbose
http://ftp.tsukuba.wide.ad.jp/software/apache/tomcat/tomcat-8/v8.0.15/bin/
apache-tomcat-8.0.15.tar.gz'
executeSudo "useradd -s /sbin/nologin tomcat8"
execute "tar -xzf ~/apache-tomcat-8.0.15.tar.gz"
execute "rm -f ~/apache-tomcat-8.0.15.tar.gz"
executeSudo "mkdir /opt/tomcat8"
executeSudo "mv ~/apache-tomcat-8.0.15 /opt/tomcat8"
executeSudo "chown -R tomcat8:tomcat8 /opt/tomcat8"
executeSudo "chmod -R 770 /opt/tomcat8/apache-tomcat-8.0.15/webapps
/opt/tomcat8/apache-tomcat-8.0.15/temp /opt/tomcat8/apache-tomcat-8.0.15/logs
/opt/tomcat8/apache-tomcat-8.0.15/work /opt/tomcat8/apache-tomcat-8.0.15/conf"
executeSudo "chown -R tomcat8:tomcat8 /opt/tomcat8/apache-tomcat-8.0.15/logs"
// 自動起動設定
put 'src/main/resources/tomcat8/init.d', '/home/vagrant/tomcat8'
executeSudo 'chmod +x /home/vagrant/tomcat8'
executeSudo 'mv /home/vagrant/tomcat8 /etc/rc.d/init.d/tomcat8'
executeSudo 'service tomcat8 start'
executeSudo 'chkconfig tomcat8 on'
}
// Jenkins
def existsJenkins = execute('echo `sudo find
/opt/tomcat8/apache-tomcat-8.0.15/webapps -name "jenkins"`')
if (!existsJenkins) {
println("installing Jenkins...")
executeSudo 'wget --no-verbose http://mirrors.jenkins-ci.org/war/latest/jenkins.war'
executeSudo 'mv jenkins.war /opt/tomcat8/apache-tomcat-8.0.15/webapps'
}
// Gitbucket
def existsGitbucket = execute('echo `sudo find
/opt/tomcat8/apache-tomcat-8.0.15/webapps -name "gitbucket"`')
if (!existsGitbucket) {
println("installing Gitbucket...")
executeSudo 'wget --no-verbose
https://github.com/takezoe/gitbucket/releases/download/2.7/gitbucket.war'
executeSudo 'mv gitbucket.war /opt/tomcat8/apache-tomcat-8.0.15/webapps'
}
}
}
}
static void main(String[] args) {
new CIServerProvisioning().setup()
}
}
- ※1 Grep結果がなかった場合はExitStatusが1になるので、echoで囲ってExitStatusが0となるようにしている
- ※2 Javaのバージョン結果は標準エラーに吐かれるので 2>&1 で標準出力に出している
- ※3 ファイルのダウンロードが完了すると、ExitStatusが4で帰ってくるので例外つかまえてゴニョゴニョしてる
3. Gradleから実行
DB接続先などもこのファイルに定義します
[ build.gradle ]
apply plugin: "groovy"
apply plugin: "application"
mainClassName = 'com.example.CIServerProvisioning'
version = '1.0'
repositories {
jcenter()
}
dependencies {
compile 'org.hidetake:groovy-ssh:latest.release'
compile 'ch.qos.logback:logback-classic:1.1.2' // ※1
compile 'org.codehaus.groovy:groovy-all:2.3.+'
}
- ※1 作成したClassでは使用していませんが、 コレでエラーになるのを回避するために追加しています。
vagrant up後、プロジェクトルートでgradle runすれば、構築実施・完了します。
GitBucketは下記のアドレスになります。
http://192.168.33.11:8080/gitbucket/
アカウント・パスワードの初期値はともに root です。
Jenkinsは下記のアドレスになります。
http://192.168.33.11:8080/jenkins/
こちらはログインせずに使えます。
開発環境の構築手順を「動く形」で残せるのは良いですね!
遊びで最新の環境試したのを残すのはもちろん、日々の運用の自動化にも使えそうです。
なにより、JavaとGroovy+αちょっとの学習コストで動かせるメリットは大きいです。
以上です。