相信大家開始玩gitlab+jenkins的時候對着兩個工具有肯定有一定了解,我就不做詳細解釋了,下面就跟大家簡單的說下gitlab,jenkins之間工作關係:
GitLab是一個代碼倉庫,用來管理代碼。Jenkins是一個自動化服務器,可以運行各種自動化構建、測試或部署任務。所以這兩者結合起來,就可以實現開發者提交代碼到GitLab,Jenkins以一定頻率自動運行測試、構建和部署的任務,幫組開發團隊更高效的集成和發佈代碼,下面是形象的圖片:
廢話也不多說直接把我自己在摸索使用過程積攢下來的心德記錄下來,給大家做技術分享也方便以後自己回顧,如果有參考不是很清楚的地方,可以多看幾遍或者結合官方文檔研究研究肯定是會成功的,世上無難事只怕有心人。
漢化部分參考文檔:
https://www.cnblogs.com/straycats/p/7637373.html
實驗所需安裝包:
鏈接:https://pan.baidu.com/s/1ZzOHQQIhXk7gjtFSZ_hNYw 密碼:z9zy
環境部署:
- 安裝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密碼即可登錄
訪問結果如下:
- 下面安裝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登錄校驗,可以參考:
https://blog.51cto.com/13859393/2166335
查看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比較多而已
有志者事竟成,破釜沉舟,百二秦關終屬楚;
苦心人天不負,臥薪嚐膽,三千越甲可吞吳;