LoginSignup
4
4

More than 5 years have passed since last update.

CentOS6でJenkins(Master/Node)を構築するshell

Posted at

Jenkins Master

#!/usr/bin/env bash
# Fail on unset variables and command errors
set -ex -o pipefail
# Prevent commands misbehaving due to locale differences
export LC_ALL=C

JESNKINS_BACKUP_STORE_DIR=/var/lib/jenkins/backup
TOTAL_NODE_NUM=1
JDK_VERSION="8u91-b14" # [Java Version]-[Build Number]
JENKINS_PLUGINS=(
  # maintenance plugins
  "thinBackup"
  # security plugins
  # "active-directory"
  # view plugins
  # "greenballs"
  # "delivery-pipeline-plugin"
  # "extra-columns"
  # "dashboard-view"
  # "sectioned-view"
  # job plugins
  # "git"
  # "gitlab-hook"
  # "job-import-plugin"
  # "purge-job-history"
  # "jobConfigHistory"
  # "nodelabelparameter"
  # "parameterized-trigger"
  # "multiple-scms"
  # "uno-choice"
  # "email-ext"
  # "plot"
  # "ws-cleanup"
  # "rebuild"
  # "timestamper"
)

PROXY_HOST=192.168.56.102
PROXY_PORT=3128
NO_PROXY=localhost,127.0.0.1
SMTP_HOTS=localhost
SMTP_PORT=9090
export http_proxy="http://${PROXY_HOST}:${PROXY_PORT}"
export https_proxy="http://${PROXY_HOST}:${PROXY_PORT}"
export no_proxy="${NO_PROXY}"

# initialize package repositories
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm

# install packages
yum -y install git

# install oracle-jdk
curl -s -LO -b "oraclelicense=accept-securebackup-cookie" \
               "http://download.oracle.com/otn-pub/java/jdk/${JDK_VERSION}/jdk-${JDK_VERSION:0:4}-linux-x64.rpm"
rpm -ivh jdk-${JDK_VERSION:0:4}-linux-x64.rpm

# install jenkins (latest)
curl -o /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
yum -y install jenkins

# disable jenkins setupwizard
sed -i -e 's/^JENKINS_JAVA_OPTIONS=.*/JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Djenkins.install.runSetupWizard=false"/' /etc/sysconfig/jenkins

# init jenkins
chkconfig jenkins on #[CentOS6]
service jenkins start #[CentOS6]

# wait until jenkins is ready
while [ `curl -LI http://localhost:8080 -o /dev/null -w '%{http_code}\n' -s` -ne "200" ]; do sleep 5; done

service jenkins stop #[CentOS6]

# configure proxy
cat << EOS >> /var/lib/jenkins/proxy.xml
<?xml version='1.0' encoding='UTF-8'?>
<proxy>
  <name>${PROXY_HOST}</name>
  <port>${PROXY_PORT}</port>
</proxy>
EOS

# configure thinBackup
cat << EOS >> /var/lib/jenkins/thinBackup.xml
<?xml version='1.0' encoding='UTF-8'?>
<org.jvnet.hudson.plugins.thinbackup.ThinBackupPluginImpl plugin="thinBackup@1.7.4">
  <fullBackupSchedule></fullBackupSchedule>
  <diffBackupSchedule></diffBackupSchedule>
  <backupPath>${JESNKINS_BACKUP_STORE_DIR}</backupPath>
  <nrMaxStoredFull>5</nrMaxStoredFull>
  <excludedFilesRegex></excludedFilesRegex>
  <waitForIdle>true</waitForIdle>
  <forceQuietModeTimeout>120</forceQuietModeTimeout>
  <cleanupDiff>false</cleanupDiff>
  <moveOldBackupsToZipFile>true</moveOldBackupsToZipFile>
  <backupBuildResults>true</backupBuildResults>
  <backupBuildArchive>false</backupBuildArchive>
  <backupUserContents>true</backupUserContents>
  <backupNextBuildNumber>true</backupNextBuildNumber>
  <backupBuildsToKeepOnly>false</backupBuildsToKeepOnly>
</org.jvnet.hudson.plugins.thinbackup.ThinBackupPluginImpl>
EOS

# start jenkins
service jenkins start #[CentOS6]

# wait until jenkins is ready
while [ `curl -LI http://localhost:8080 -o /dev/null -w '%{http_code}\n' -s` -ne "200" ]; do sleep 5; done

# install jenkins plugins
JENKINS_CLI=/var/cache/jenkins/war/WEB-INF/jenkins-cli.jar
for ((i = 0; i < ${#JENKINS_PLUGINS[@]}; i++)) {
  java -jar ${JENKINS_CLI} -s http://localhost:8080 install-plugin ${JENKINS_PLUGINS[i]}
}

# wait until all nodes is ready
node_count=0
while [ ${node_count} -lt ${TOTAL_NODE_NUM} ]; do
  sleep 30
  curl -s -L -o nodes.xml http://localhost:8080/computer/api/xml
  node_count=`echo "xpath count(/computerSet/computer[not(displayName/text()='master')]/offline[text()='false'])" | xmllint --shell nodes.xml | sed 's/\/ > //g' | sed 's/Object is a number : //g'`
done

# reboot jenkins to apply changes
service jenkins restart #[CentOS6]

# wait until jenkins is ready
while [ `curl -LI http://localhost:8080 -o /dev/null -w '%{http_code}\n' -s` -ne "200" ]; do sleep 5; done
java -jar ${JENKINS_CLI} -s http://localhost:8080 list-plugins

Jenkins Slave

#!/usr/bin/env bash
# Fail on unset variables and command errors
set -ex -o pipefail
# Prevent commands misbehaving due to locale differences
export LC_ALL=C

JENKINS_MASTER_HOST=192.168.100.7
JENKINS_MASTER_PORT=8080
JDK_VERSION="8u91-b14" # [Java Version]-[Build Number]
JENKINS_WORKDIR=/var/lib/jenkins
OS_SHORTNAME=cent6
NODE_ROLE=build
INSTANCE_ID=i-1234567890

# install oracle-jdk
mkdir -p ${JENKINS_WORKDIR}
curl -s -L -o ${JENKINS_WORKDIR}/jdk-${JDK_VERSION:0:4}-linux-x64.rpm \
           -b "oraclelicense=accept-securebackup-cookie" \
              "http://download.oracle.com/otn-pub/java/jdk/${JDK_VERSION}/jdk-${JDK_VERSION:0:4}-linux-x64.rpm"
rpm -ivh ${JENKINS_WORKDIR}/jdk-${JDK_VERSION:0:4}-linux-x64.rpm

# wait until master jenkins is ready
while [ `curl -LI http://${JENKINS_MASTER_HOST}:${JENKINS_MASTER_PORT} -o /dev/null -w '%{http_code}\n' -s` -ne "200" ]; do sleep 5; done

# download jenkins cli tools
curl -s -L -o ${JENKINS_WORKDIR}/jenkins-cli.jar http://${JENKINS_MASTER_HOST}:${JENKINS_MASTER_PORT}/jnlpJars/jenkins-cli.jar
curl -s -L -o ${JENKINS_WORKDIR}/slave.jar http://${JENKINS_MASTER_HOST}:${JENKINS_MASTER_PORT}/jnlpJars/slave.jar

# create jenkins user
useradd jenkins

# create node to master jenkins
mkdir -p ${JENKINS_WORKDIR}/jobs
NODE_NAME=${OS_SHORTNAME}_${NODE_ROLE}_${INSTANCE_ID}
cat <<EOS | java -jar ${JENKINS_WORKDIR}/jenkins-cli.jar -s http://${JENKINS_MASTER_HOST}:${JENKINS_MASTER_PORT} create-node ${NODE_NAME}
<slave>
<name>${NODE_NAME}</name>
<description/>
<remoteFS>${JENKINS_WORKDIR}/jobs</remoteFS>
<numExecutors>1</numExecutors>
<mode>EXCLUSIVE</mode>
<retentionStrategy class="hudson.slaves.RetentionStrategy\$Always"/>
<launcher class="hudson.slaves.JNLPLauncher"/>
<label>${OS_SHORTNAME} ${NODE_ROLE} ${OS_SHORTNAME}_${NODE_ROLE}</label>
<nodeProperties/>
<userId>anonymous</userId>
</slave>
EOS

# get node token
curl -s -L -o ${JENKINS_WORKDIR}/slave-agent.jnlp \
           http://${JENKINS_MASTER_HOST}:${JENKINS_MASTER_PORT}/computer/${NODE_NAME}/slave-agent.jnlp
secret=`echo "cat /jnlp/application-desc/argument[1]" | xmllint --shell ${JENKINS_WORKDIR}/slave-agent.jnlp | sed '/^\/ >/d' | sed 's/<[^>]*.//g'`

# register jenkins as a service
cat << EOS >> /etc/sysconfig/jenkins-slave
JENKINS_WORKDIR=${JENKINS_WORKDIR}
JENKINS_USER=jenkins
JENKINS_URL="http://${JENKINS_MASTER_HOST}:${JENKINS_MASTER_PORT}"
JENKINS_NODENAME=${NODE_NAME}
JENKINS_SECRET=${secret}
EOS
chmod 600 /etc/sysconfig/jenkins-slave
chown -R jenkins:jenkins ${JENKINS_WORKDIR}

cat << 'EOS' >> /etc/init.d/jenkins-slave
#!/bin/sh
#
# jenkins-slave:    Launch a Jenkins BuildSlave instance on this node
#
# chkconfig:    - 99 01
# description:  Enable this node to fulfill build jobs
#

# Source function library.
. /etc/rc.d/init.d/functions

[ -f /etc/sysconfig/jenkins-slave ] && . /etc/sysconfig/jenkins-slave

[ -n "$JENKINS_URL" ] || exit 0
[ -n "$JENKINS_WORKDIR" ] || exit 0
[ -n "$JENKINS_USER" ] || exit 0
[ -n "$JENKINS_NODENAME" ] || exit 0
[ -n "$JENKINS_SECRET" ] || exit 0
[ -x /usr/bin/java ] || exit 0

download_jar()
{
    curl -s -o slave.jar $JENKINS_URL/jnlpJars/slave.jar || exit 0
}

start()
{
  cd $JENKINS_WORKDIR
  [ -f slave.jar ] || download_jar

  echo -n $"Starting $prog: "

  su $JENKINS_USER sh -c "\
    java -jar slave.jar -jnlpUrl $JENKINS_URL/computer/$JENKINS_NODENAME/slave-agent.jnlp -secret $JENKINS_SECRET >slave.log 2>&1 &"

  if [ $? = 0 ]; then echo '[OK]'; else echo '[NG]'; fi
}

stop()
{
  echo -n $"Shutting down $prog: "

  PID=`ps -ef | grep '[j]ava -jar slave.jar' | awk '{print $2}'`
  [ -n "$PID" ] && kill $PID

  if [ $? = 0 ]; then echo '[OK]'; else echo '[NG]'; fi
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart|reload)
    stop
    start
    ;;
  status)
    status java
    ;;
  *)
    echo $"Usage: $0 {start|stop|restart|reload}"
    exit 1
esac

exit 0
EOS

chmod 755 /etc/init.d/jenkins-slave
chkconfig --add jenkins-slave
chkconfig jenkins-slave on

# start jenkins node
service jenkins-slave start

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4