天天看點

Jenkins 自動化部署上線 ​

Jenkins 自動化部署上線

由于51cto格式問題,可以直接通路https://www.abcdocker.com/abcdocker/3174 檢視原文

[TOC]

##一、Jenkins是什麼

Jenkins是一款自包含的開源自動化服務,可用于自動執行與建構,測試和傳遞或部署軟體有關的各種任務。
Jenkins目前可以通過本地系統軟體包Docker進行安裝,甚至可以通過任何安裝了Java運作環境的計算機獨立運作      

##二、上線流程圖

既然我們說到自動化上線,我們就不得不說說一個項目上線的流程.隻有規範起來才可以做到不出事故!

上線流程圖如下圖所示

Jenkins 自動化部署上線 ​

##三、Jenkins安裝配置

Jenkins依賴Java環境,我們需要安裝Java環境以及相關的環境準備
###關閉防火牆
$ iptables -F
$ iptables -X
$ systemctl stop firewalld
$ systemctl disable firewalld

###安裝yum源
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
$ yum clean all && yum makecache      

1.下載下傳Jdk包

Jenkins 自動化部署上線 ​

下載下傳位址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

上傳jdk包到伺服器

###解壓拷貝jdk
$ tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local/
$ ln -s /usr/local/jdk1.8.0_171/ /usr/local/jdk
$ ln -s /usr/local/jdk/bin/java /usr/bin/java

###設定環境變量
$ vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

$ source  /etc/profile      

2.安裝Jenkins

$ wget  -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
$ rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
$ yum install jenkins -y

$ systemctl start jenkins
##如果我們啟動Jenkins出現錯誤可以直接使用systemctl status jenkins檢視錯誤      

jenkins相關目錄釋義:

(1)/usr/lib/jenkins/:jenkins安裝目錄,war包會放在這裡。
(2)/etc/sysconfig/jenkins:jenkins配置檔案,“端口”,“JENKINS_HOME”等都可以在這裡配置。
(3)/var/lib/jenkins/:預設的JENKINS_HOME。
(4)/var/log/jenkins/jenkins.log:jenkins日志檔案。      

檢查端口是否存在

Jenkins 自動化部署上線 ​

3.配置Jenkins

Jenkins 自動化部署上線 ​

Jenkins有安全政策,我們按照提示拷貝驗證碼即可

Jenkins 自動化部署上線 ​

将驗證碼複制到Web框裡

Jenkins 自動化部署上線 ​

我們這裡使用推薦就可以了,因為後期我們都可以在安裝

Jenkins 自動化部署上線 ​

安裝插件中,有的插件會因為網絡問題無法安裝成功

Jenkins 自動化部署上線 ​

我們這裡可以建立一個管理者,或者直接使用admin

我們最好不要直接使用

admin

Jenkins 自動化部署上線 ​
Jenkins 自動化部署上線 ​

安裝完成通路位址:iP:8080

Jenkins 自動化部署上線 ​

到這裡我們Jenkins已經安裝成功,剩下的就是配置插件和配置環境

Jenkins 自動化部署上線 ​

因為我們目前什麼都沒有需要安裝插件,點選下步安裝插件

Jenkins 自動化部署上線 ​
為了模拟環境我們需要安裝Jenkins一些相關插件

下面2個maven 插件都需要勾選

插件名稱:

maven lntergration

Jenkins 自動化部署上線 ​

我們勾選安裝重新開機

Jenkins 自動化部署上線 ​
Jenkins 自動化部署上線 ​

安裝完成後如下圖所示

預設是沒有下面的maven項目的

Jenkins 自動化部署上線 ​

4.Jenkins配置項目

配置SVN位址

因為我是建立的Jenkins目錄,沒有權限,是以需要建立一個用于認證.

Jenkins 自動化部署上線 ​
填寫SVN位址,因為我這裡的svn已經連結到ldap,是以不需要輸入svn的密碼,預設這裡是svn的使用者和密碼

具體文章可以參考 VisualSVN 遷移至Linux SVN+Apache+ssl內建LDAP

Jenkins 自動化部署上線 ​

認證成功之後

Jenkins 自動化部署上線 ​

了解maven 配置

首先我們的svn分支下面需要有pom.xml

Jenkins 自動化部署上線 ​

繼續往下

因為我們隻安裝maven的插件,并沒有安裝maven服務,是以這裡需要我們配置

Jenkins 自動化部署上線 ​

我們就在這裡添加一個名字,maven就自動安裝了

Jenkins 自動化部署上線 ​

Maven安裝完成了,需要依賴吧都是從maven.apache.org下載下傳會比較慢,是以我們指定私服的位址,因為在實際生産中也都是使用私服的。

在maven的配置檔案裡面也需要配置 配置檔案

conf/settings.xml

 因為我們所使用的是Jenkins的自動安裝,而不是指定路徑是以我們要查到這個配置檔案

maven 自動安裝的配置路徑

Jenkins 自動化部署上線 ​

配置Maven倉庫位址

這裡配置的都是私服位址

相關文章 Jenkins+Maven+SVN+Nexus 搭建持續內建環境

Jenkins 自動化部署上線 ​

配置Maven 鏡像位址

Jenkins 自動化部署上線 ​

配置Maven 編譯參數 [研發都會]

相關文章:maven 編譯指令

Jenkins 自動化部署上線 ​
這個pom.xml裡面配置是私服的位址
因為代碼裡面有很多東西是需要拉去依賴包,這些依賴包就存放在本地的私有倉庫裡(Nexus)      

代碼中pom.xml配置如下

私有倉庫的位址

Jenkins 自動化部署上線 ​

5.建構測試

Jenkins 自動化部署上線 ​

控制台輸出說明

Jenkins 自動化部署上線 ​
Jenkins 自動化部署上線 ​
Jenkins 自動化部署上線 ​

6.Jenkins 工程目錄

Jenkins 自動化部署上線 ​

可以通過修改Jenkins主目錄

Jenkins 自動化部署上線 ​

Jenkins打包好後的目錄,這個war包就是我們需要拷貝的tomcat下面的

Jenkins 自動化部署上線 ​

##四、Jenkins 自動化部署項目案例

因為目前環境原因,我這裡隻是截圖Jenkins釋出的流程(本次示範隻是針對測試環境日常釋出版本)

###(1) Java 環境示範 [Jenkins和Tomcat在一台伺服器上]

1.Jenkins 配置

Jenkins 自動化部署上線 ​

SVN部配置設定置

Jenkins 自動化部署上線 ​

maven及腳本設定

Jenkins 自動化部署上線 ​

2.不發腳本配置如下:

相關參考:Jenkins可用環境變量清單

腳本的存放路徑可以在

系統管理->全局配置->Jenkins路徑

Last login: Thu Jun 28 18:01:59 2018 from 172.16.29.39
[root@tomcat ~]# cat /jenkins/deploy.sh
#!/bin/bash

#
# Jenkins工程建構通用TOMCAT部署腳本
# @author abcdocker
# @create_time 2017-08-19
#
# 在Jenkins内配置部署單元參數
#      參數格式:MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH  MAVEN子產品名稱:需要部署的目标TOMCAT絕對路徑
#      隻有單個部署單元且沒有Maven子子產品時,子產品名稱參數可以沒有,參數格式為:TOMCAT_ABSOLUTE_PATH
#
# 注意:
#      在本部署腳本内會執行TOMCAT啟動腳本,為避免Jenkins在建構成功以後殺掉所有衍生的背景程序,需要在Jenkins内配置全局環境變量 BUILD_ID 值為 allow_to_run_as_daemon
#
#

DEPLOY_TARGET_TOMCAT=$TOMCAT

#校驗部署參數,不能為空
if [ -z "$DEPLOY_TARGET_TOMCAT" ]
then
    echo
    echo 部署參數為空,部署失敗!
    echo "#####################################################################"
    echo
    echo 單個部署單元參數格式:
    echo          MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH MAVEN子產品名稱:需要部署的目标TOMCAT絕對路徑
    echo
    echo 多個部署單元參數格式:(多個部署單元使用空格分割)
    echo          MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH
    echo
    echo "#####################################################################"
    exit 1
fi

echo
echo 部署參數:${DEPLOY_TARGET_TOMCAT}

TOMCAT_ARR=${DEPLOY_TARGET_TOMCAT//;/ }
ARR=($TOMCAT_ARR)
ARR_LEN=${#ARR[*]}
echo 共 ${ARR_LEN} 個部署單元

i=1
#擷取Jenkins傳入的目标TOMCAT組
for T in $TOMCAT_ARR
do
    echo
    echo 開始 處理第 ${i} 個部署單元
    echo 第一個部署單元:$T

    #擷取目标TOMCAT的WAR路徑和TOMCATA的絕對路徑
    TOMCAT_PARAM=(${T//:/ })
    MODULE_NAME=${TOMCAT_PARAM[0]}
    TARGET_TOMCAT_PATH=${TOMCAT_PARAM[1]}
    WAR_PATH="$WORKSPACE/$MODULE_NAME/target/*.war"

    echo 部署單元子產品名稱:"${MODULE_NAME}"
    echo 部署WAR包路徑:"${WAR_PATH}"
    echo 部署TOMCAT路徑:"${TARGET_TOMCAT_PATH}"

    #需要考慮MAVEN單子產品下的部署問題
    #if [ "${#ARR[*]}" -eq 1 -a -z "$TARGET_TOMCAT_PATH" ]
    if [ "$ARR_LEN" -eq 1 -a -z "$TARGET_TOMCAT_PATH" ]
    then
        #MAVEN過程沒有子子產品,單個部署單元
        TARGET_TOMCAT_PATH=$MODULE_NAME
    MODULE_NAME="NULL"
    fi

    #校驗參數,WORKSPACE變量來自于Jenkins環境變量
    if [ -z "$MODULE_NAME" -o ! -f $WAR_PATH ]
    then
        echo 錯誤:MAVEN部署子產品名稱 參數為空 或 找不到WAR包!
        echo 部署失敗!
        exit 1
    fi

    if [ -z "$TARGET_TOMCAT_PATH" -o ! -d "$TARGET_TOMCAT_PATH" ]
    then
        echo 錯誤:目标TOMCAT絕對路徑 參數為空 或 該TOMCAT目錄不存在!
        echo 部署失敗!
        exit 1
    fi

    echo 開始清理目标TOMCAT啟動程序...
    TOMCAT_PID=`ps -ef |grep "$TARGET_TOMCAT_PATH" |grep  "start" |awk '{print $2}'`
    if [ -n "$TOMCAT_PID" ]
    then
        echo TOMCAT_${i},PID${TOMCAT_PID},正在結束該程序...
        kill -9 $TOMCAT_PID && echo PID${TOMCAT_PID} 已被幹掉!
    else
        echo TOMCAT_${i} 程序未啟動!
    fi

    echo 開始清理目标TOMCAT緩存...
    rm -rf $TARGET_TOMCAT_PATH/webapps/*
    rm -rf $TARGET_TOMCAT_PATH/logs/*
    rm -rf $TARGET_TOMCAT_PATH/work/*

    echo 開始部署WAR包...
    cp -a $WAR_PATH $TARGET_TOMCAT_PATH/webapps/ROOT.war && echo WAR包部署完畢。

    echo 開始啟動目标TOMCAT服務...
    sleep 10
    /bin/bash $TARGET_TOMCAT_PATH/bin/startup.sh

    echo 開始配置web目錄的FTP權限...
    #啟動過程會自動解壓WAR包,是以在這裡需要等待WAR包解壓完成再調整目錄權限
    sleep 30
    chown -R vftpuser.vftpuser ${TARGET_TOMCAT_PATH}/webapps/ && echo 目錄權限配置完畢。

    echo 部署成功
    echo 完成 第 ${i} 個部署單元處理。
    echo

    ((i++))
done      

3.建構效果如下圖所示:

Jenkins 自動化部署上線 ​

###(2) Java 環境示範 [Jenkins和Tomcat不在一台伺服器上]

上面的腳本是針對Jenkins和Tomcat都在相同的目錄,有的時候我們測試環境會存在不在一台伺服器的情況,腳本如下

隻是腳本簡單的修改
[root@tomcat ~]# cat /jenkins/ysc.sh
#!/bin/bash

#
# Jenkins工程建構通用TOMCAT部署腳本
# @author 劉曙
# @create_time 2017-08-19
#
# 在Jenkins内配置部署單元參數
#      參數格式:MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH  MAVEN子產品名稱:需要部署的目标TOMCAT絕對路徑
#      隻有單個部署單元且沒有Maven子子產品時,子產品名稱參數可以沒有,參數格式為:TOMCAT_ABSOLUTE_PATH
#
# 注意:
#      在本部署腳本内會執行TOMCAT啟動腳本,為避免Jenkins在建構成功以後殺掉所有衍生的背景程序,需要在Jenkins内配置全局環境變量 BUILD_ID 值為 allow_to_run_as_daemon
#
#

DEPLOY_TARGET_TOMCAT=$YSC
[email protected]
#校驗部署參數,不能為空
if [ -z "$DEPLOY_TARGET_TOMCAT" ]
then
    echo
    echo 部署參數為空,部署失敗!
    echo "#####################################################################"
    exit 1
fi

echo
echo 部署參數:${DEPLOY_TARGET_TOMCAT}

TOMCAT_ARR=${DEPLOY_TARGET_TOMCAT//;/ }
ARR=($TOMCAT_ARR)
ARR_LEN=${#ARR[*]}
echo 共 ${ARR_LEN} 個部署單元

i=1
#擷取Jenkins傳入的目标TOMCAT組
for T in $TOMCAT_ARR
do
    echo
    echo 開始 處理第 ${i} 個部署單元
    echo 第一個部署單元:$T

    #擷取目标TOMCAT的WAR路徑和TOMCATA的絕對路徑
    TOMCAT_PARAM=(${T//:/ })
    MODULE_NAME=${TOMCAT_PARAM[0]}
    TARGET_TOMCAT_PATH=${TOMCAT_PARAM[1]}
    #WAR_PATH="/jenkins/workspace/ysc-all/${MODULE_NAME}/target/*.war"
    WAR_PATH="${WORKSPACE}/${MODULE_NAME}/target/*.war"

    echo 部署單元子產品名稱:"${MODULE_NAME}"
    echo 部署WAR包路徑:"${WAR_PATH}"
    echo 部署TOMCAT路徑:"${TARGET_TOMCAT_PATH}"

    #判斷IP是否有相關目錄
    ssh 172.16.1.35 "[ -d $TARGET_TOMCAT_PATH ]" >/dev/null 2>&1
    if [ $? != 0 ];then
       echo 錯誤
    else
       echo  正确
    fi

    #校驗參數,WORKSPACE變量來自于Jenkins環境變量
    if [ -z "$MODULE_NAME" -o ! -f $WAR_PATH ]
    then
        echo 錯誤:MAVEN部署子產品名稱 參數為空 或 找不到WAR包!
        echo 部署失敗!
        exit 1
    fi

    #scp 軟體包
   ssh $HOST /etc/init.d/${MODULE_NAME} stop
   ssh 172.16.1.35 "[ -d $TARGET_TOMCAT_PATH/webapps/ROOT/ ]" >/dev/null 2>&1
   if [ $? = 0 ];then
      ssh 172.16.1.35 rm -rf $TARGET_TOMCAT_PATH/webapps/ROOT
        if [ $? = 0 ];then
           scp  $WAR_PATH [email protected]:$TARGET_TOMCAT_PATH/webapps/ROOT.war && echo WAR包部署完畢。
           echo $TARGET_TOMCAT_PATH is OK
        else
           echo 删除$TARGET_TOMCAT_PATH is error
        fi
   else
           echo "not found $TARGET_TOMCAT_PATH/webapps/ROOT"
           scp  $WAR_PATH [email protected]:$TARGET_TOMCAT_PATH/webapps/ROOT.war && echo WAR包部署完畢。
           ssh $HOST /etc/init.d/${MODULE_NAME} restart
   fi

####################啟動檔案

done
  #scp /home/config.properties/ysc/${MODULE_NAME}.js [email protected]:$TARGET_TOMCAT_PATH/webapps/ROOT/web/js/basePath.js
  ssh $HOST /etc/init.d/${MODULE_NAME} restart      

Jenkins配置如下修改

Jenkins 自動化部署上線 ​
Jenkins 自動化部署上線 ​

修改完成後我們建構示範

Jenkins 自動化部署上線 ​

提示:這種環境下配置檔案都是通過maven build進行控制,也就是通過研發控制配置檔案

+

###(3) Java 環境示範 [上線腳本]

線上環境示範

我們的上線流程如下:

Jenkins 自動化部署上線 ​

Jenkins配置如下:

Jenkins 自動化部署上線 ​
Jenkins 自動化部署上線 ​
Jenkins 自動化部署上線 ​

1.首先測試環境腳本:

[root@tomcat ~]# cat /server/scripts/.upgrade-smscenter.sh
#!/bin/bash
WAR="/jenkins/workspace/portal-smscenter/bxg-sms-center-web/target/*.war"
Path="/data/hub/bxg-smscenter/`date +%Y%m%d`/"

scp_war(){

if [ ! -d $Path ];then
    ssh root@file-server mkdir -p $Path
    scp $WAR root@file-server:$Path
else
    scp $WAR root@file-server:$Path
fi
}
ssh_file(){
  ssh root@file-server "/bin/bash /server/script/bxg/bxg-smscenter.sh"
}
scp_war
ssh_file      

2.跳闆機腳本修改

[root@File-server1 ~]# cat /server/script/bxg/bxg-smscenter.sh
#!/bin/bash
HOST=online-server2
WAR="/data/hub/bxg-smscenter/`date +%Y%m%d`"
DIR="/application/smscenter/webapps/ROOT/"
function scp_file {
    if `ssh root@$HOST "[ ! -d $WAR ]"`;then
            ssh root@$HOST "mkdir -p $WAR"
    fi
            scp $WAR/*.war root@$HOST:$WAR/
            echo "scp $WAR/*.war root@$HOST:$WAR/"
}
ssh_deploy(){
    ssh root@$HOST "/bin/bash /server/scripts/deploy_smscenter.sh"
}
scp_file
ssh_deploy      

3.web 伺服器腳本

[root@online-server2 ~]# cat /server/scripts/deploy_smscenter.sh
#!/bin/bash
WAR="/data/hub/bxg-smscenter/`date +%Y%m%d`"
OBJECT="/application/smscenter/webapps/ROOT/"
Backup="/data/tomcat/bxg-smscenter-`date +%Y%m%d`"
SCR_D="/application/smscenter/webapps/ROOT"
#config="/data/bak"

backup_tar(){
    tar zcvf $Backup.tar.gz $SCR_D/
    echo "為了防止意外cp整個項目目錄存放"
    cp -a $SCR_D/ $Backup
    rm -rf $OBJECT/*
}

cp_war(){
    unzip $WAR/*.war -d $SCR_D/
}

cp_config(){
    cat $Backup/WEB-INF/classes/application-prod.properties >$SCR_D/WEB-INF/classes/application-prod.properties
    /etc/init.d/smscenter restart
}
backup_tar
cp_war
cp_config
[root@online-server2 ~]#      

相關文章 企業必會技能 tomcat

###(4) NodeJs 環境示範 [上線腳本]

node 環境上線流程

Jenkins配置如下 

[node項目不适用maven,是以可以不用建立maven項目,直接在Jenkins建立普通項目就可以]

Jenkins 自動化部署上線 ​
Jenkins 自動化部署上線 ​

1.測試環境腳本

[root@tomcat ~]# cat /server/scripts/mobile/mobile.sh
#!/bin/bash
source /etc/profile

HOST=file-server
BASE_DIR=/server/scripts/mobile/m
url=$1
server=$2
DATE=`date +%Y%m%d`

tar(){
rm -rf $BASE_DIR

    [ -d $BASE_DIR ] || mkdir $BASE_DIR
    cd $BASE_DIR
    echo "##########################################################"
    echo "代碼拉取中!!!"
    svn co -q $url/ .
    echo "##########################################################"

}

cp(){

    cd ${BASE_DIR}
    /bin/tar -zcvf m_${DATE}.tar.gz ./*
    echo "##########################################################"
    echo "檔案已經打包完成! 正在拷貝中!!!"
    echo "##########################################################"
    sleep 5
    scp  m_${DATE}.tar.gz root@$HOST:/data/hub/bxg-mobile/
    echo "##########################################################"
    echo "檔案已經拷貝完成! 正在上傳伺服器中!!!"
    echo "##########################################################"
        ssh root@file-server "/bin/bash /server/script/bxg/bxg-mobile.sh $server"

}

tar
cp
[root@tomcat ~]#      

2.跳闆機腳本

[root@File-server1 ~]# cat /server/script/bxg/bxg-mobile.sh
#!/bin/bash
HOST=$1
Mobile_tar="/data/hub/bxg-mobile"
DIR="/application/node"
DATE=`date +%Y%m%d`

scp_file(){
    if `ssh root@$HOST "[ ! -d $Mobile_tar ]"`;then
            ssh root@$HOST "mkdir -p $Mobile_tar"
    fi
            scp $Mobile_tar/m_${DATE}.tar.gz root@$HOST:$DIR/
        sleep 3
        echo "   "
        echo "##########################################################"
        echo "File-server 正在拷貝 ${HOST}!!!"
        sleep 3
        echo "##########################################################"
}

ssh_deploy(){
           echo "Hi"
    ssh root@$HOST "/bin/bash /server/scripts/bxg/bxg-mobile.sh"
}

scp_file
ssh_deploy      

3.web 釋出腳本

[root@iZbp11tefvghtcfn5mudgdZ ~]# cat /server/scripts/bxg/bxg-mobile.sh
#!/bin/bash
source /etc/profile
DIR="/application/node"
DATE=`date +%Y%m%d`

Backup="/application/node/m/"
BAK="/data/hub/bxg-mobile"

backup_tar(){
    echo "為了防止意外cp整個項目目錄存放"
    cp -ar $Backup ${BAK}/mobile_$DATE
    echo "online-server 原目錄拷貝備份完成!"
}

cp_war(){
    /etc/init.d/mobile stop
    #mv $Backup /tmp/m_${DATE} && rm -rf /tmp/m_${DATE}
    rm -rf $Backup
    mkdir $Backup && cd /application/node/
    tar xf m_${DATE}.tar.gz -C $Backup

}
npm_config(){
    cd $Backup
    cnpm install
    npm run build-prod
    npm run start-prod &>/var/log/mobile_${DATE}.log &

}

C(){
    echo "++++++++++++++++++++++++++++++++++++++++++++++++++++"
    curl  -I 127.0.0.1:3000
    echo "###################################################"
    echo "若是200 服務啟動正常! 可以啟動另一台!"
    echo "###################################################"
}

backup_tar
cp_war
npm_config
C      

Jenkins 建構結果如下:

Jenkins 自動化部署上線 ​

相關文章 Node.js 環境搭建