アレについて記す

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

以上です。