アレについて記す

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+αちょっとの学習コストで動かせるメリットは大きいです。

以上です。