1. 程式人生 > >gitlab+jenkins自動化上線部署持續集成

gitlab+jenkins自動化上線部署持續集成

防火 eureka load jdk環境變量 apache 本地部署 term else 直接

相信大家開始玩gitlab+jenkins的時候對著兩個工具有肯定有一定了解,我就不做詳細解釋了,下面就跟大家簡單的說下gitlab,jenkins之間工作關系:

GitLab是一個代碼倉庫,用來管理代碼。Jenkins是一個自動化服務器,可以運行各種自動化構建、測試或部署任務。所以這兩者結合起來,就可以實現開發者提交代碼到GitLab,Jenkins以一定頻率自動運行測試、構建和部署的任務,幫組開發團隊更高效的集成和發布代碼,下面是形象的圖片:

技術分享圖片

廢話也不多說直接把我自己在摸索使用過程積攢下來的心德記錄下來,給大家做技術分享也方便以後自己回顧,如果有參考不是很清楚的地方,可以多看幾遍或者結合官方文檔研究研究肯定是會成功的,世上無難事只怕有心人。

漢化部分參考文檔:
https://www.cnblogs.com/straycats/p/7637373.html

實驗所需安裝包:
鏈接:https://pan.baidu.com/s/1ZzOHQQIhXk7gjtFSZ_hNYw 密碼:z9zy

環境部署:

  1. 安裝gitlab:(漢化版)

首先安裝git:

yum -y install git

獲取最新漢化版本庫:

git clone https://gitlab.com/xhang/gitlab.git

查看漢化補丁包:

cat gitlab/VERSION

安裝gitlab依賴項:

yum install -y curl openssh-server openssh-clients postfix cronie policycoreutils-python

啟動postfix並設置開機自啟動:

systemctl start postfix
systemctl enable postfix

若防火墻是開啟狀態的則需要配置一下規則:

firewall-cmd --add-service=http --permanent
firewall-cmd --reload

下載gitlab安裝包:

方法一、
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.0.2-ce.0.el7.x86_64.rpm

方法二、
https://packages.gitlab.com/gitlab/gitlab-ce/

安裝rpm包:

rpm -i gitlab-ce-10.0.2-ce.0.el7.x86_64.rpm

配置gitlab:

gitlab-ctl reconfigure

修改gitlab配置:

vim /etc/gitlab/gitlab.rb

將external_url變量地址改為gitlab所在主機IP
技術分享圖片

重新加載配置文件:

gitlab-ctl reconfigure
gitlab-ctl restart

查看gitlab版本:

head -1 /opt/gitlab/version-manifest.txt

覆蓋漢化包:

gitlab-ctl stop                                                  #停掉gitlab

cd /root/gitlab                                                 #切換到gitlab漢化包目錄下

git diff v10.0.2 v10.0.2-zh > ../10.0.2-zh.diff   #比較漢化標簽和源標簽並導出patch用的diff文件導/root

cd /root                                                           #切回/root目錄下並將10.0.2-zh.diff作為補丁更新到gitlab中

yum install patch -y
patch -d /opt/gitlab/embedded/service/gitlab-rails -p1 < 10.0.2-zh.diff

啟動gitlab:

gitlab-ctl start

註:如果gitlab啟動失敗需要查看本地80端口是否被占用,gitlab默認使用的是80,若需要修改默認端口號查看參考:https://segmentfault.com/a/1190000011266124

重新載入配置:

gitlab-ctl reconfigure

通過Web登錄查看:

http://IP
#默認是root和root密碼即可登錄

訪問結果如下:
技術分享圖片

  1. 下面安裝jenkins依賴環境:

安裝jdk:

tar zxf jdk-8u91-linux-x64.tar.gz –C /usr/local
ln –s /usr/local/jdk1.8.0_91 /usr/local/jdk

添加jdk環境變量:

vim /etc/profile
JAVA_HOME=/usr/local/jdk
export JRE_HOME=/usr/local/jdk/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

安裝maven:

tar zxf apache-maven-3.5.3-bin.tar.gz –C /usr/local/
ln –s /usr/local/apache-maven-3.5.3 /usr/local/maven

添加maven環境變量:

M3_HOME=/usr/local/maven
export PATH=$M3_HOME/bin:$PATH

加載環境變量:

source /etc/profile

查看jdk是否安裝成功:
技術分享圖片

查看maven是否安裝成功:
技術分享圖片

部署tomcat8.0:
註:tomcat版本和jdk版本需要需要吻合否則啟動成功web訪問jenkins始終不成功,最好使用jdk1.8,tomcat8.0

創建tomcat存放目錄:

mkdir -p /home/app/tomcat8.0

解壓tomcat:

tar zxf apache-tomcat-8.0.51.tar.gz -C /home/app/tomcat8.0

啟動tomcat查看是否成功:

/home/app/tomcat8.0/bin/startup.sh 

查看端口啟動情況,並使用web訪問:
技術分享圖片

技術分享圖片

將jenkins程序包放到tomcat裏面並重新啟動:

mv jenkins.war /home/app/tomcat8.0/webapps/Jenkins.war 

註:如果是本地jenkins的話想關閉web登錄校驗,可以參考:
##################################

查看jenkins程序包是否正常啟動:
直接查看webapps目錄即可
技術分享圖片

測試訪問jenkins:
http://IP:8080/jenkins
註:第一次訪問jenkins等待時間可能較長,等待的時候需要看服務器的性能
技術分享圖片

打開界面後,會根據提示發到服務器上查看初始密碼:
技術分享圖片

登錄進入後選擇安裝插件:
註:最省事的方式就是安裝官方推薦的插件,但有些時候點擊無效,不用著急後面我們進入jenkins可以選擇我們需要安裝插件

方法一、
技術分享圖片

插件等待過程中:
技術分享圖片

方法二、
登錄jenkins後點擊管理插件:
技術分享圖片

如果在可選插件中看不到插件,點擊高級:
技術分享圖片

高級地下有個提升站點:
站點地址:http://mirror.xmission.com/jenkins/updates/update-center.json

技術分享圖片

然後點擊左下角提交,在點擊右下角立即獲取後查看可選插件看是否有插件可選擇,如果沒有重啟jenkins即可(重啟jenkins方式即重啟tomcat)

安裝插件:
jenkins自帶的過濾不好用,使用瀏覽器的過濾器過濾ctrl+f 進行搜索
技術分享圖片

搜索一下幾個關鍵字,把帶有此關鍵字的全部安裝:shell,maven,jdk,git,gitlab,ssh 把搜索到的插件都安裝後重啟jenkins

配置全局工具:
技術分享圖片

配置JDK:
把自動選的“自動安裝”取消掉,並點擊新增JDK
技術分享圖片

註:JAVA_HOME為jdk路徑

配置Git:
查找git路徑
技術分享圖片

技術分享圖片

配置maven:
技術分享圖片

最後選擇save

下面是三個jenkins需要調用的腳本:cloud-run.sh(jenkins服務端),run-pord.sh(客戶端),check-port.sh(客戶端),放在/opt/work/目錄下,也可以修改腳本內容自己定義:(此處的腳本支持java的spring cloud程序,其他語言或者框架如使用此腳本請稍作修改)
vim /opt/work/cloud-run.sh

#!/bin/bash  

#變量定義
jenkins_item=$1
app_name=$2
source_jar_path="/root/.jenkins/workspace/${jenkins_item}/${app_name}/target/${app_name}-*.jar"
run_cmd_path="/opt/work/run-prod.sh"
run_cmd="/opt/work/./run-prod.sh"
app_home=/opt/work/$app_name
now_user=root
all_param=$3
#本地通過ssh執行遠程服務器的腳本  
function check_http(){
        now_ip=$1
        now_app_port=$2
        sleep_time=$3
        justWeb=`curl -I -m 10 -o /dev/null -s -w %{http_code} http://${now_ip}:${now_app_port}`
        if [ !"$justWeb" = 404 ];
        then
                if [ !"$sleep_time" = 10 ];
                then
                        echo "執行${justWeb}時間${sleep_time}s,構建失敗"
                        exit 1;
                else
                        sleep_time=$(($sleep_time+1))
                        check_http $now_ip $now_app_port $sleep_time
                fi
        fi
}
for i in ${all_param[@]}
do
        OLD_IFS="$IFS"
        IFS=","
        arr=($i)
        IFS="$OLD_IFS"
        now_ip=${arr[0]}
        now_port=${arr[1]}
        now_app_port=${arr[2]}
        jar_path=$app_home/$app_name-$now_app_port.jar
        echo $now_ip
        echo $now_port
                echo $now_app_port
        #復制腳本到遠程地址
        scp -P $now_port $run_cmd_path $now_user@$now_ip:$run_cmd_path

        ssh -t -p $now_port $now_user@$now_ip "mkdir -p $app_home"
        #復制程序jar到遠程地址
        scp -P $now_port $source_jar_path $now_user@$now_ip:$jar_path

        #執行遠程腳本
        ssh -t -p $now_port $now_user@$now_ip "chmod +x $run_cmd_path"
    ssh -t -p $now_port $now_user@$now_ip "$run_cmd restart $app_name $now_app_port"
        check_http $now_ip $now_app_port 1
        sleep 30s
        ID=`ssh root@$now_ip ‘/opt/work/check-port.sh‘`
        if [ "$ID" == 0 ]; then
                echo "$ID"
                echo "程序啟動正常"
        else
                echo "$ID"
                echo "程序啟動失敗"
                exit
        fi
        sleep 30s
done

vim /opt/work/run-pord.sh

#!/bin/bash --login

APP_NAME=$2
APP_PORT=$3
APP_HOME=/opt/work/$APP_NAME

#創建目錄
if [ ! -d "$APP_HOME" ];then
  mkdir -p $APP_HOME
fi

if [ ! -d "$APP_HOME/logs" ];then
  mkdir $APP_HOME/logs
fi

APP_LOG_PATH=$APP_HOME/logs/$APP_PORT
LOG_PATH=$APP_HOME/logs/$APP_PORT.out
JAR_FILE=$APP_NAME-$APP_PORT.jar
BACK_JAR_FILE=$APP_NAME-$APP_PORT.back
PID_FILE=$APP_HOME/$APP_PORT.pid

pid=""
function start(){
  checkpid
  if [ ! -n "$pid" ]; then
    nohup java -server -Xms512m -Xmx1024m -jar $APP_HOME/$JAR_FILE --spring.pid.file=$PID_FILE --server.port=$APP_PORT --logging.path=$APP_LOG_PATH > $LOG_PATH 2>&1 &
    echo "---------------------------------"
    echo "啟動完成>>>>>"
    echo "---------------------------------"
    sleep 2s
        exit 0
  else
      echo "$APP_NAME is runing PID: $pid"  
  fi

}

function reback(){
        #還原備份文件
        cp $APP_HOME/$BACK_JAR_FILE $APP_HOME/$JAR_FILE
        restart
}

function status(){
   checkpid
   if [ ! -n "$pid" ]; then
     echo "$APP_NAME not runing"
   else
     echo "$APP_NAME runing PID: $pid"
   fi
}

function checkpid(){
        pid=`ps -ef |grep $JAR_FILE |grep -v grep |awk ‘{print $2}‘`
}

function stop(){
    checkpid
    if [ ! -n "$pid" ]; then
     echo "$APP_NAME not runing"
    else
      echo "$APP_NAME stop..."
          #curl -X POST ‘http://127.0.0.1:$APP_PORT/system/shutdown‘
          kill -9 $pid
          sleep 1s
          stop
    fi
}

function restart(){
    stop
    sleep 1s
    start
}

case $1 in
          start) start;;
          stop)  stop;;
          restart)  restart;;
          status)  status;;
          reback)  reback;;
#              *)  echo "require start|stop|restart|status|reback"  ;;  
esac

vim /opt/work/check-port.sh

#!/bin/bash
#檢測本地程序端口
source /opt/work/run-prod.sh
check_port() {
        netstat -tlpn | grep "\b$1\b" >> /dev/null
}
if check_port $APP_PORT
then
        echo "0"
#    exit 1
else
        echo "1"
fi

此處構建需要用到無秘鑰登錄,即是jenkins服務器本地部署都需要本機無秘鑰登錄:

無秘鑰登錄配置方法:

ssh-keygen (接下來一路狂按回車即可)
cd /root/.ssh/
cat id_rsa.pub >> authorized_keys

測試是否可以無秘鑰登錄:
技術分享圖片

現在一切準備好了,開始創建個新任務構建下看看是否成功:
點擊新建項目
技術分享圖片

確定後進行配置:
General
技術分享圖片

源碼管理:
技術分享圖片

註:
Repositories配置:
Repository URL: 為gitlab中項目連接
Credentials:設置為gitlab中登錄的用戶名和密碼

gitlab中項目連接如下:
點擊到需要上線的項目中

技術分享圖片

Credentials設置:

技術分享圖片

Branch Specifier (blank for ‘any‘):項目分支

技術分享圖片

構建觸發器和構建環境不用設置:
技術分享圖片

配置構建:
剛開始是沒有調用頂層Maven目標和執行shell的,需要手動添加:
技術分享圖片

配置調用頂層Maven目標:
技術分享圖片

目標:進行打包方式,每種打包方式不同可以問研發,後面的-P dev 為代碼中配置文件

執行shell:
技術分享圖片

命令:/opt/work/cloud-run.sh hcb-eureka-dev hcb-eureka "192.168.3.206,22,10100"
/opt/work/cloud-run.sh :jenkins服務上運行在服務端的一個腳本
hcb-eureka-dev:jenkins項目名
hcb-eureka :gitlab中拉去打包代碼的子項目名,同時也是服務器中創建的文件夾名
192.168.3.206:程序需要上傳到的服務IP
22:遠程的端口號(每次都需要)
10100:程序的端口號
註:此腳本支持同一個程序往不同服務器上上線,可以是通一個端口也可以是不同端口,shell的配置方式如:
技術分享圖片

構建後操作可以不用設置,直接點擊保存即可:
技術分享圖片

此時可以點擊立即構建:
技術分享圖片

構建歷史中可以看到正在構建和已經構建過的項目:
技術分享圖片

點擊到一個構建項目中,項目中可以看到詳細信息,以及在構建中彈出的日誌:
控制臺輸出
技術分享圖片

構建結束後可以看到success:
技術分享圖片

在服務器中查看程序是否啟動,以及端口監聽:
技術分享圖片

查看端口監聽,以及進入目錄進行查看:
技術分享圖片

進入/opt/work/目錄下查看:
技術分享圖片

此時可以看到構建已經完成了,完全沒有瑕疵


gitlab+jenkins不僅可以自動化java程序其他程序也可以構建,不過構建方式和上線腳本有所改動,很妒忌人以為gitlab+jenkins只能上線java的代碼,其實是大家進入了誤區,只是市面上現在用java比較多而已

gitlab+jenkins自動化上線部署持續集成