jenkins是一個自動構建工具,在jenkins的服務器上指定配置一些應用服務器後,能夠實現自動從git拉取代碼,然java
後將項目部署和啓動到應用。本文的目的是想詳盡介紹,如何配置整個的部署環境。git
我整理了下公司真實環境的配置方式。僅供參考,本公司是小公司,若是有什麼不足的地方歡迎指出,我好改進啊~web
節點方式docker
經過jenkins配置的節點信息進行構建,後面有具體介紹。shell
jenkins服務器配置簡單,可是應用服務器須要安裝git
,maven
。由於會在應用服務器進行構建vim
Publish插件方式tomcat
經過安裝插件Publish Over SSH
進行構建,後面有具體介紹。bash
jenkisn服務器配置複雜,可是應用服務器只需安裝jdk便可服務器
ip地址 | 類型 | 軟件 | 構建方式 |
---|---|---|---|
121.40.XX.XX | 應用服務器 | jdk git maven | 節點方式 |
192.168.1.112 | 應用服務器 | jdk | Publish插件方式 |
192.168.1.233 | 應用服務器 | jdk | Publish插件方式 |
192.168.1.254 | jenkins服務器 | jdk git maven jenkins | jenkins服務器 |
120.79.XX.XX | 應用服務器 | jdk git maven | 節點方式 |
官網:jenkins.io/zh/download…less
先安裝docker
啓動鏡像
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /data/jenkins:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--privileged=true \
jenkinsci/blueocean
複製代碼
運行是可能會報錯
Permission Denied
,因此加上了--privileged=true \
,參考:www.jianshu.com/p/1ed499037…
先須要下載war包:
下載後,使用命令以下命令運行:
nohup java -jar jenkins.war &
複製代碼
經過 ps -ef | grep jenkins
查找啓動的進程:
[root@localhost ~]# ps -ef | grep jenkins
jenkins 1445 1 0 Apr08 ? 10:21:30 /usr/local/jdk/bin/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8080 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20
root 89082 88082 0 13:07 pts/0 00:00:00 grep --color=auto jenkins
複製代碼
上文中顯示-DJENKINS_HOME=/var/lib/jenkins
,這個是jenkins實際的工做目錄。
若是須要指定更多的參數,好比指定端口進行啓動,那麼能夠經過以下命令進行啓動:
java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /data/jenkins/jenkins.war --logfile=/var/logs/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8989 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20 複製代碼
$ http://yourdomain:8080/exit # 中止服務
$ http://yourdomain:8080/restart # 重啓服務
$ http://yourdomain:8080/reload # 從新加載配置信息
複製代碼
訪問jenkins: http://localhost:8080
第一次解鎖須要複製密碼:
上圖有顯示密碼在服務器中的位置。若是是經過docker安裝的,那麼密碼文件在掛載的目錄下面
# vim /data/jenkins/secrets/initialAdminPassword
8079fb5d3e3f444d857fa5c8e7add6e9
複製代碼
點擊上圖【繼續】後,點擊【安裝推薦的插件】
插件正在安裝中,稍等片刻
登陸jenkins後,右邊菜單中有個【系統管理】菜單,點擊進去
下圖的紅框框部分是部署必須設置項,其餘的看狀況設置:
下面咱們具體來設置這幾項。
這裏是默認的一些基本信息
配置訪問信息
配置pulish over ssh
插件,須要配置用戶名和密碼,在應用服務器192.168.1.233
建立目錄/wms/services/jenkins
,點擊Test Configuration
進行驗證,提示Success
纔是驗證成功。
SSH Server節點中目錄
/wms/services/jenkins
很是關鍵。在後面的構建任務中,的兩個任務就是基於該目錄的。
固然,若是不是經過SSH Publishers插件來構建那麼這裏的SSH Server節點配置不配置都不要緊。
192.168.1.112應用服務器是
Publish插件方式
構建,會關聯這裏配置的SSH Server信息:![]()
jenkisn服務器須要安裝maven,jdk,git。我是預先安裝的,您沒預先安裝也能夠試試勾選這裏的自動安裝。
確保git
和Publish Over SSH
插件安裝成功
回顧上文的服務器規劃
,其中120.79.XX.XX
和121.40.XX.XX
是節點方式
進行構建,因此須要在這裏單獨配置節點:
以121.40.XX.XX爲例,點擊右邊齒輪
後,再點擊配置從節點
,能夠查看到須要配置的節點狀況:
JVM選項:-Djava.awt.headless=true -Djava.encoding=UTF-8
配置環境變量
保存後,返回到節點列表。點擊右上角的容許自動刷新
,發現已經正常鏈接上,效果如上午的節點列表。
系統管理設置好後才能開始進行構建,我總結了兩種構建方式
該方式須要先配在系統管理
配置節點,而後在遠程管理進行打包和啓動。
指定運行節點,節點在【系統管理】【節點管理】中配置
同SSH方式,指定git的url和認證信息
git 的基本信息信息在【系統管理】【全局工具配置】中進行指定
同SSH方式。
maven版本
在【系統設置】【全局工具配置】中配置了maven環境,maven1
是添加的maven環境的名稱
目標
經過maven命令進行父模塊下子模塊的打包命令
clean package -pl zhirui-zuul-server/ -am -Dmaven.test.skip=true
複製代碼
若是是子模塊下還有子模塊,打包命令以下:
clean package -pl zhirui-zmgj-business/zhirui-zmgj-server/ -am -Dmaven.test.skip=true
複製代碼
由於經過指定節點運行,因此無需經過SSH的那個插件進行部署。【系統管理】【節點管理】節點配置:
![]()
遠程工做目錄
, jenkins會在遠程工做目錄 + workspace + 任務名稱
下進行編譯。因此jar的路徑還須要再拼上git的項目路徑。執行shell中的腳本以下:
#!/bin/bash
#Jenkins推包到應用服務器的目錄
jenkins="/root/.jenkins/workspace/zhirui-zmgj-server-pro/zhirui-zmgj-business/zhirui-zmgj-server/target"
#發佈目錄(修改成對應的發佈目錄)
deployDir="/wms/services/zhirui-zmgj-server"
#jar名稱(修改成對應的jar名稱)
jarName="zhirui-zmgj-server-0.0.1-SNAPSHOT.jar"
#固定配置
jarLib=$deployDir"/lib"
jarBin=$deployDir"/bin"
jarBak=$deployDir"/bak"
jarLog=$deployDir"/logs"
#目錄構建
if [ ! -d ${jarLib}"/" ];then
mkdir ${jarLib} -p
fi
if [ ! -d ${jarBin}"/" ];then
mkdir ${jarBin} -p
fi
if [ ! -d ${jarBak}"/" ];then
mkdir ${jarBak} -p
fi
if [ ! -d ${jarLog}"/" ];then
mkdir ${jarLog} -p
fi
echo "**********************基礎配置信息***********************"
java -version
echo "發佈項目:"${jarName}
echo "發佈目錄:"${deployDir}
echo "bin目錄:"${jarBin}
echo "lib目錄:"${jarLib}
echo "bak目錄:"${jarBak}
echo "日誌目錄:"${jarLog}
echo "*******************************************************"
#檢查新報是否已經推送到本地,若是存在則進行後續操做
if [ "$(ls ${jenkins}/${jarName} 2> /dev/null | wc -l)" != "0" ]; then
#備份文件
oldJarName="`ls ${jarLib} | grep .jar | sort -nr | head -1`"
echo "開始備份Jar包:"${jarLib}"/"${oldJarName}
bakJarName=${oldJarName}$(date +%s)
echo "備份"${jarLib}"/"${oldJarName}"到"${jarBak}"/"${bakJarName}
cd ${deployDir}
if [ "$(ls "lib/"*.jar 2> /dev/null | wc -l)" != "0" ]; then
mv ${jarLib}"/"${oldJarName} ${jarBak}"/"${bakJarName}
echo "備份Jar包成功"
else
echo "無Jar能夠備份"
fi
echo "複製新的包到指定的目錄"
cd ${jenkins}
echo "遷移新包到目錄:"${jarLib}
cp ${jenkins}"/"${jarName} ${jarLib}
echo "重啓服務:"${jarBin}
cd ${jarBin}
#將start.sh和restart.sh從/var複製到項目的bin目錄下
cp /var/env/start.sh .
cp /var/env/restart.sh .
chmod 775 *
sh restart.sh
else
echo "找不到發佈包:${jenkins}/${jarName}"
exit 1
fi
複製代碼
該構建方式基於插件Publish Over SSH,我叫作Publish插件方式
。該方式jenkins服務器打包成jar再推送到模板服務器進行運行。
SSH 方式指定運行的節點爲master
須要去git拉取代碼而後編譯運行,須要添加
身份信息用於訪問git
maven版本
在【系統設置】【全局工具配置】中配置了maven環境,maven2
是添加的maven環境的名稱
目標
經過maven命令進行單個模塊的構建
clean package -pl zhirui-zuul-server/ -am -Dmaven.test.skip=true
複製代碼
若是是二級子模塊,構建命令以下:
clean package -pl zhirui-wms-business/zhirui-handle-file-server/ -am -Dmaven.test.skip=true
複製代碼
配置文件和全局配置
選擇默認的maven設置,也就是在【系統設置】【全局工具配置】配置的maven環境。
這裏配置的是jenkins插件Publish Over SSH的參數配置。用於配置插件推送到模板應用服務器後的操做,好幾個路徑配置比較容易混淆,稍微理解下,而後本身多試試。
在執行該步驟以前,須要在【系統管理】【系統設置】中添加的SSH server配置以下:
![]()
說明以下:
A:SSH Server業務服務器的ip
B和D:jenkins服務器推送jar到業務服務器的用戶賬號密碼信息
C:推送後到SSH Server後的jar存放的
遠端基礎目錄
,下文我會稱之爲遠端基礎目錄
在下面的SSH Server
中關聯在【系統管理】【系統設置】中配置的SSH Server:
按上圖的紅框框編號進行說明:
主目錄``/var/lib/jenkins
下的workspace
,進行編譯後的jar包,位於jenkins服務器工做空間下。如,目錄全稱實際是/var/lib/jenkins/workspace/zhirui-zmgj-oauth-service/zhirui-oauth-service/target/zhirui-oauth-service-0.0.1-SNAPSHOT.jar
。jenkins默認拼上了/var/lib/jenkins/workspace/zhirui-zmgj-oauth-service/
, 其中zhirui-zmgj-oauth-service
是本次構建的任務名稱
。target
前面的這個前綴去掉。Remote Directory
是一個相對路徑, 須要和本次構建任務名稱
保持一致,maven編譯後會將jar傳到目標服務器(也就是192.168.1.112
服務器)遠端基礎目錄
+ 任務名稱
的目錄下,不一致會致使後面的shell腳本找不到jar。如,會將jar copy到的徹底路徑實際是/wms/services/jenkins/zhirui-zmgj-oauth-service/target
,也就是下圖紅框框6位置的路徑。Exec command的腳本以下:
腳本說明:
- 按照實際狀況修改幾個
發佈目錄
,工程名稱
,Jenkins推包目錄
。jarBin
目錄下須要放置啓動shell腳本
,先須要將兩個腳本 start.sh, 和 restart.sh 建立在/var/env目錄下,點擊查看啓動shell腳本。
#!/bin/bash
#發佈目錄(修改成對應的發佈目錄)
deployDir="/wms/services/zhirui-wms-erp-server"
#工程名稱(修改成對應的服務名稱)
jarName="zhirui-wms-erp-server-0.0.1-SNAPSHOT.jar"
#Jenkins推包目錄
jenkins="/wms/services/jenkins/zhirui-wms-erp-server/target"
#固定配置
jarLib=$deployDir"/lib"
jarBin=$deployDir"/bin"
jarBak=$deployDir"/bak"
jarLog=$deployDir"/logs"
#目錄構建
if [ ! -d ${jarLib}"/" ];then
mkdir ${jarLib} -p
fi
if [ ! -d ${jarBin}"/" ];then
mkdir ${jarBin} -p
fi
if [ ! -d ${jarBak}"/" ];then
mkdir ${jarBak} -p
fi
if [ ! -d ${jarLog}"/" ];then
mkdir ${jarLog} -p
fi
echo "**********************基礎配置信息***********************"
java -version
echo "發佈項目:"${jarName}
echo "發佈目錄:"${deployDir}
echo "bin目錄:"${jarBin}
echo "lib目錄:"${jarLib}
echo "bak目錄:"${jarBak}
echo "日誌目錄:"${jarLog}
echo "*******************************************************"
#檢查新報是否已經推送到本地,若是存在則進行後續操做
if [ "$(ls ${jenkins}/${jarName} 2> /dev/null | wc -l)" != "0" ]; then
#備份文件
oldJarName="`ls ${jarLib} | grep .jar | sort -nr | head -1`"
echo "開始備份Jar包:"${jarLib}"/"${oldJarName}
bakJarName=${oldJarName}$(date +%s)
echo "備份"${jarLib}"/"${oldJarName}"到"${jarBak}"/"${bakJarName}
cd ${deployDir}
if [ "$(ls "lib/"*.jar 2> /dev/null | wc -l)" != "0" ]; then
mv ${jarLib}"/"${oldJarName} ${jarBak}"/"${bakJarName}
echo "備份Jar包成功"
else
echo "無Jar能夠備份"
fi
#複製新的包到指定的目錄
cd ${jenkins}
echo "遷移新包到目錄:"${jarLib}
cp ${jenkins}"/"${jarName} ${jarLib}
#重啓服務
cd ${jarBin}
#將start.sh和restart.sh從/var複製到項目的bin目錄下
cp /var/env/start.sh .
cp /var/env/restart.sh .
chmod 775 *
sh ./restart.sh
else
echo "找不到發佈包:${jenkins}/${jarName}"
exit 1
fi
複製代碼
感受這裏配置的路徑很複雜,我再嘗試說清楚,若是以爲比較繞,能夠跳過,多測試下便可。
配置的參數:
說明:
1紅框框和下圖1紅框框對應,填寫的是基於主目錄
+workspace
後的想到路徑
2.1,2.2紅框框和下圖2紅框框對應,填寫的是推送到應用服務器後jar的路徑。2.1紅框框是基於遠端基礎目錄
的路徑,jar安裝2.1的配置推送到目標服務器,結果就是2.2紅框框的路徑。
3紅框框和下圖3紅框框對應,是圖中Exec command
裏面配置的shell腳本執行後jar會拷貝到3紅框框的路徑進行執行,是程序實際的運行路徑。
應用服務器和jinkins服務器的一些目錄結構圖:
說明:
主目錄``workspace
下的位置。遠端基礎目錄
後的位置。除了jenkins服務器外,其餘的應用服務器都須要進行配置
須要將setEnv.sh建立在/var/env目錄下, 下文的啓動和重啓腳本會加載/var/env/setEnv.sh
。
這些環境變量是在我程序的eureka server和configserver用到 , 因此須要配置。若是沒用到能夠不配置。
$vim setEnv.sh
#!/bin/bash
source ~/.bash_profile
export BUILD_ID=dontkillme
# for jdk env
#export JAVA_HOME=/usr/jdk1.8.0_112
#export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
#export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
# 指定profile
export ENV_OPTS="-Dconfig.profile=dev"
# 指定eureka地址
export WMS_EUREKA_SERVER_URL="http://192.168.1.254:8090/eureka/"
# 指定配置中心地址
export WMS_CONFIG_SERVER_URL="http://192.168.1.254:8861"
export WMS_DEVELOPER_NAME=""
export WMS_CONFIG_GIT_USER="config-read"
export WMS_CONFIG_GIT_PWD="config-read"
export WMS_CONFIG_GIT_URI="http://192.168.1.254:8000/config/config-file.git"
export WMS_CONFIG_GIT_SEARCHPATHS="dev"
複製代碼
手動或者jenkins推包後,應用程序實際目錄爲/wms/services
,結構以下:
[root@localhost services]# ll
total 8
drwxr-xr-x. 11 root root 4096 Jul 24 19:02 jenkins #SSH server的時候配置的目錄
----------. 1 root root 632 Jul 2 10:55 setEnv.sh #須要添加的環境變量
drwxr-xr-x. 6 root root 99 Apr 9 18:08 zhirui-console-server
drwxr-xr-x. 6 root root 51 Jul 2 00:04 zhirui-oauth-service-zmgj
drwxr-xr-x. 6 root root 51 Jul 1 23:42 zhirui-platform-sysmanager-server-zmgj
drwxr-xr-x. 6 root root 51 Jul 24 17:57 zhirui-zmgj-oauth-service
drwxr-xr-x. 6 root root 51 Jul 1 19:28 zhirui-zmgj-server
drwxr-xr-x. 6 root root 51 Jul 1 23:09 zhirui-zuul-server-zmgj
複製代碼
進入其中一個應用項目下查看目錄:
start.sh
, restart.sh
,。經過jenkins啓動時,兩個腳本須要預先放置在/var/env
目錄下,會將/var/env
下的start.sh和restart.sh複製到bin目錄下。若是手動啓動程序,須要手動在bin下添加。[root@localhost services]# cd zhirui-zuul-server-zmgj/
[root@localhost zhirui-zuul-server-zmgj]# ll
total 4
drwxr-xr-x. 2 root root 4096 Jul 24 14:02 bak
drwxr-xr-x. 2 root root 40 Jul 1 23:09 bin
drwxr-xr-x. 2 root root 51 Jul 24 14:02 lib
drwxr-xr-x. 2 root root 6 Jul 1 23:09 logs
[root@localhost zhirui-zuul-server-zmgj]#
複製代碼
start.sh
, restart.sh
以下:
直接建立文件後複製粘貼便可,腳本中有加載上文的
環境變量
:source $DEPLOY_DIR/../setEnv.sh 複製代碼
兩個腳本須要受權:
chmod 775 *
start.sh:
#!/bin/bash
source ~/.bash_profile
echo "Sping Cloud ops script.wms"
function green() {
echo -e "\033[32m$1 \033[0m"
}
function red() {
echo -e "\033[31m$1 \033[0m"
}
# set dir
cd `dirname $0`
DISK_DIR=/wms/logs
BIN_DIR=`pwd`
DEPLOY_DIR=`cd ..;pwd`
CONF_DIR=${DEPLOY_DIR}/conf
LIB_DIR=${DEPLOY_DIR}/lib
LOGS_DIR=${DEPLOY_DIR}/logs
LOGS_ROOTPATH=${DISK_DIR}/${SERVER_NAME}
# set env
# source $DEPLOY_DIR/../setEnv.sh
source /var/env/setEnv.sh
# check config
# set APP's OPT
JAR_NAME="`ls ${LIB_DIR} | grep .jar | sort -nr | head -1`"
# for jcdz project
RUN_JAR_PATH=${LIB_DIR}/${JAR_NAME}
# echo desc
echo "################################################################################"
java -version
echo "JAVA_HOME=$JAVA_HOME"
echo "DEPLOY_DIR=$DEPLOY_DIR"
echo "RUN_JAR_PATH=$RUN_JAR_PATH"
echo "################################################################################"
# check process
PIDS=`ps -ef | grep java | grep "$LIB_DIR" |awk '{print $2}'`
if [ -n "$PIDS" ]; then
red "ERROR: The [$DEPLOY_DIR:$SERVER_NAME] already started! PID is $PIDS!"
exit 1
fi
#init log
ERROR="-Dpro.log.level=ERROR"
# init logs dir
if [ ! -d $LOGS_ROOTPATH ]; then
mkdir -p $LOGS_ROOTPATH
fi
JAVA_OPTS="${ENV_OPTS} -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8"
JAVA_DEBUG_OPTS=""
if [ "$1" = "debug" ]; then
JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
fi
JAVA_JMX_OPTS=""
if [ "$1" = "jmx" ]; then
JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
fi
JAVA_MEM_OPTS=""
BITS=`java -version 2>&1 | grep -i 64-bit`
if [ -n "$BITS" ]; then
JAVA_MEM_OPTS=" -server -Xms512m -Xmx512m -XX:MaxMetaspaceSize=512m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
else
JAVA_MEM_OPTS=" -client -Xms512m -Xmx512m -XX:MaxMetaspaceSize=512m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
fi
green "Starting the $SERVER_NAME ...\c"
nohup java -Dlog.rootPath=$LOGS_ROOTPATH $ERROR $JAVA_OPTS $JAVA_MEM_OPTS -jar $RUN_JAR_PATH > /dev/null 2>&1 &
green "OK! \c"
PIDS=`ps -ef | grep java | grep "$LIB_DIR" | awk '{print $2}'`
green "PID: $PIDS"
green "LOGS_FILE: $LOGS_ROOTPATH"
複製代碼
restart.sh:
#!/bin/bash
function green() {
echo -e "\033[32m$1 \033[0m"
}
function red() {
echo -e "\033[31m$1 \033[0m"
}
DEPLOY_DIR=`cd ..;pwd`
LIB_DIR=${DEPLOY_DIR}/lib
echo "${LIB_DIR}"
# check process
PIDS=`ps -ef | grep java | grep "${LIB_DIR}" |awk '{print $2}'`
if [ -n "$PIDS" ]; then
red "ERROR: already started! PID is $PIDS!"
kill -9 "$PIDS"
green "正在從新啓動。。。"
fi
sh ./start.sh
複製代碼
最近在操做Jenkins時,忘記了管理員密碼。只好重置了:
先中止tomcat服務,而後 vim /root/.jenkins/users/admin_***/config.xml 文件,
找到 字段,將裏面的內容替換爲:
#jbcrypt:$2a$10$MiIVR0rr/UhQBqT.bBq0QehTiQVqgNpUGyWW2nJObaVAM/2xSQdSq
複製代碼
這樣,管理員帳號的密碼就變成了123456,啓動tomcat,打開Jenkins登陸。