CICD-Jenkins筆記2014-2018
20141119 chenxin
20180726 chenxin update
四個環境,開發/測試/預發布/生產.
文中涉及的最新腳本,請查看西部戰紀部署文檔腳本備份文件.
涉及的腳本,如CI,CD等,除本文檔外,其他部分參考備份文檔.
安裝Jenkins
docker 鏡像方式(不推薦)
To use the latest LTS: docker pull jenkins/jenkins:lts (LTS為長期支持版,每12周發布1次)
To use the latest weekly: docker pull jenkins/jenkins (每周發布)
docker search jenkins
docker pull jenkins
docker run -d -p 10080:8080 jenkins 啟動容器(會自動啟動Jenkins服務)
docker container exec -it 7b5cb169167c /bin/bash 進入容器
目錄結構docker方式
/usr/local/bin/jenkins.sh #啟動腳本
/usr/local/bin/jenkins-support
/usr/share/jenkins/jenkins.war #war包存放位置
/var/jenkins_home/ #Jenkins的主目錄
yum方式(推薦)
JDK的安裝方式,請參考對應筆記/文檔內容.
cd /etc/yum.repos.d/
wget http://pkg.jenkins.io/redhat/jenkins.repo
rpm --import http://pkg.jenkins.io/redhat/jenkins.io.key
yum install -y jenkins
systemctl start jenkins
目錄說明
/etc/sysconfig/jenkins #主文件(默認端口8080->13972)運行用戶,端口,HTTPS端口,綁定IP,AJP端口,HTTP最大並發數,HTTP最大等待數,JENKINS_HOME路徑配置JENKINS_HOME="/var/lib/jenkins"
/etc/rc.d/init.d/jenkins #啟停腳本,jenkins把java路徑遍歷寫死在這里了,需要修改(將java路徑注釋掉,添加自己的),candidates=處,增加一行 /usr/local/jvm/bin/java
/etc/logrotate.d/jenkins #日志翻滾配置
/var/log/jenkins 日志
/var/lib/jenkins #yum后為空,之后會作為數據存放目錄.是jenkins的HOME目錄
/var/lib/jenkins/jobs 任務
/usr/lib/jenkins #war包,/usr/lib/jenkins/jenkins.war WAR存放路徑
/var/cache/jenkins/war (圖片,css,js等) 其他數據存放路徑
/var/lib/yum/repos/x86_64/latest/jenkins
/var/cache/yum/x86_64/latest/jenkins
頁面進行插件和基本配置的安裝
http://192.168.31.129:13972/ 根據頁面提示,到對應的文件目錄下去找pw,進行認證,之后開始安裝
在安裝過程中,如果有無法處理的報錯(比如安裝過程中,人都開了,連接中斷后,報錯.在url后添加"restart",重新啟動Jenkins並安裝)
安裝選擇默認安裝(大多數用戶的選擇)
默認8080端口:
vim /etc/sysconfig/jenkins #主配置文件(需要通過頁面方式安裝完成才會生成該文件)
JENKINS_PORT="13972"
用戶配置與登陸 權限重置
配置用戶
http://13.251.138.240:13972/ 或域名方式: http://xbzj-taihe-bei-jks.soomigame.com:13972/
admin user: chenxin
pw: jks123....
chenxin@soomigame.com
LDAP認證
FreeIPA LDAP 用戶認證請參考FreeIPA筆記
jenkins配置權限不對導致無法登陸的重置方法
一旦由於用戶配置錯誤,導致用戶無法登陸,或者登陸后權限不對,無法切回管理員權限,則只能通過這種重置的方式了.
找到/var/lib/jenkins/config.xml 文件
替換:
1、
這個權限對應“任何用戶可以做任何事(沒有任何限制)”
2、
這個權限對應“登錄用戶可以做任何事”
3、
這個權限對應 test用戶可以是管理員、打標簽權限。
安全矩陣
Overall是全局權限,slave是集群權限,job,run,view,scm是業務權限。overall中的read要勾選,否則用戶登陸后什么也看不到。
最大的權限是Overall的Administer,擁有該權限可以干任何事情。
憑據: 這里保存這在Jenkins中配置的git svn或其它的用戶名密碼之類的都在這個里面,這里可以設置對應角色的權限.
Agent: 這個是配置Jenkins結點的權限,反正現在用不到, 我也不會。
Job: 任務的,對應權限
Run: 這個不知道,反正問度娘無果
View: 這個是視圖權限,就是把某個項目關聯到類於瀏覽器的選項卡上面的,項目多用的上,項目少基本就不用去分類
SCM: 這個貌似是對git svn等部署設置定時部署任務的,也用不到,也沒測試過
ps:如果有個用戶被賦予了Overall的Read,並沒有被賦予Job的Read權限,那么該用戶就無法訪問job。原因:沒有權限。
其他說明
啟用矩陣認證方式后,保存時,提示:
Builds in Jenkins run as the virtual Jenkins SYSTEM user with full Jenkins permissions by default. This can be a problem if some users have restricted or no access to some jobs, but can configure others. If that is the case, it is recommended to install a plugin implementing build authentication, and to override this default.
No implementation of access control for builds is present. It is recommended that you install Authorize Project Plugin or another plugin implementing the QueueItemAuthenticator extension point.
備份,遷移,升級
遷移/備份
首先找到JENKINS_HOME,因為Jenkins的所有的數據都是以文件的形式存放在JENKINS_HOME目錄 (從/etc/sysconfig/jenkins的配置文件中可知,一般配置的是/var/lib/jenkins/xxx)中。所以不管是遷移還是備份,只需要操作JENKINS_HOME就行了.壓縮打包,存放.
遷移:建議將JENKINS_HOME打包后在拷貝.
可以做個jenkins的定時計划任務本地備份與遠程備份,防止誤刪除掉jenkins的job或者是project等.
注意:/var/cache/jenkins/war/這個文件夾下是否有需要備份的內容.包括images,css等自己在服務器上直接修改的文件.
備份Jenkins案例
這里使用rsync,主要是為了保持備份的屬性,如果使用scp或cp有時會導致文件屬性的改變而導致jenkins異常。
創建備份目錄
[root@linux-node2 ~]# mkdir /data/backup/jenkins -p
備份/var/lib/jenkins目錄
[root@linux-node2 ~]# rsync -raz --delete --progress /var/lib/jenkins /bak/jenkins/
刪除/var/lib/jenkins/
[root@linux-node2 ~]# rm -rf /var/lib/jenkins/
[root@linux-node2 ~]# service jenkins restart
Restarting jenkins (via systemctl): Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details. [FAILED]
[root@linux-node2 ~]# service jenkins status
JENKINS_HOME directory does not exist: /var/lib/jenkins
恢復備份
[root@linux-node2 ~]# rsync -raz --delete /bak/jenkins/jenkins /var/lib/
[root@linux-node2 ~]# service jenkins restart
備份腳本
[root@ip-10-0-0-200 ~]# cat jenkins_bak.sh
!/bin/bash
writer:201808 Chenxin
Set execs default search path.
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
umask=022
BACKUPDIR="/bak" ; [ ! -d $BACKUPDIR ] && mkdir $BACKUPDIR -p
Datadate=date +%Y%m%d%H%M
File=jenkins
delete old files
cd $BACKUPDIR
find $BACKUPDIR -mtime +7 -name "*.gz" -exec rm -rf {} ;
rsync -raz --delete --progress /var/lib/jenkins /bak/jenkins/ && tar czf "$File"_"$Datadate".tar.gz $File
升級版本
推薦: 直接在控制台點按升級按鈕(升級前做好備份工作).
如果當前版本並非最新版本的話,在jenkins的全局配置中,會有相應的版本升級提示信息,直接點擊也可以完成升級.
升級前,請測試該版本和你本地數據的兼容性。如何測試:將JENKINS_HOME拷貝一份到新的機器,用新版的程序啟動。測試對應的插件和配置。
升級Jenkins的war包
Jenkins的開發迭代非常快,每周發布一個開發版本,長期支持版每半年更新一次(ps:大版本更新)。如此頻繁的更新,怎么升級呢?war:下載新版的war文件,替換舊版本war文件。重啟即可.(WAR存放路徑 /usr/lib/jenkins/jenkins.war)
二進制:卸載舊版本,安裝新版本即可.yum install jenkins.Jenkins程序下載地址:http://mirrors.jenkins-ci.org/
其他方式升級Jenkins版本
下載Jenkins的最新war包
docker container cp ./jenkins.war container_id:/usr/share/jenkins/jenkins.war_2.121.2 #將war包拷貝到docker對應目錄
docker container exec -it --user root 7b5cb169167c /bin/bash #以root身份進入docker容器
/usr/share/jenkins/jenkins.war #將最新的war包替換原有包
http://192.168.31.129:10080/restart #從控制台進行重啟Jenkins
控制台->系統管理->關於Jenkins2.121.2 #確認版本號
CD過程中用到過的腳本案例
發布上傳好的程序文件到生產服
在Jenkins上,以xbzj用戶名義(sudo)調用數據管理機的rsync腳本(rsync是用ssh的密鑰認證)
sudo -u xbzj /home/xbzj/server-bin/server-ip/rsync-codex.fight.sh
Jenkins的機器需要配置好私鑰,生產服配置好公鑰.以便Jenkins機器將文件上傳過去(rsync).
腳本文件例如:
cat rsync-codex.fight.sh
!/bin/bash
dir=codex.fight
cd /home/xbzj/server-bin/server-ip
cat rsync-ip.txt |grep "$dir\ "|awk '{print $3,$2}' > ./$dir.txt
cat ./$dir.txt |while read line
do
ip=echo "${line}"|awk '{print $1}'
#class=echo "${line}"|awk '{print $2}'
echo "++++++++++++++ 開始同步服務器 $ip 上的目錄 $dir +++++++++++++++++ "
#echo $class
rsync -vzrtopg -e "ssh -p 4399" --delete --progress --exclude "logs/" /home/xbzj/server-bin/game-func/game-classes/$dir xbzj@$ip:/home/xbzj/game-func/game-classes/
if [ $? == 0 ];then
echo " 😃 😃 😃 成功 😃 😃 😃"
else
echo " 😦 😦 😦 失敗 😦 😦 😦"
fi
done
發布資源文件到S3
S3資源文件的同步:
cat sync-local-to-s3.sh
!/bin/bash
/usr/bin/aws s3 sync /home/xbzj/s3-cloudfront/xbzj-taihe-s3-01-cdn/test s3://xbzj-taihe-s3-01-cdn/test --delete --acl public-read
if [ $? == 0 ];then
echo " 😃 😃 😃 成功 😃 😃 😃"
else
echo " 😦 😦 😦 失敗 😦 😦 😦"
fi
/usr/bin/aws s3 sync /home/xbzj/s3-cloudfront/xbzj-taihe-s3-01-cdn/xbzj-taihe-bei s3://xbzj-taihe-s3-01-cdn/xbzj-taihe-bei --delete --acl public-read
if [ $? == 0 ];then
echo " 😃 😃 😃 成功 😃 😃 😃"
else
echo " 😦 😦 😦 失敗 😦 😦 😦"
fi
產品啟動和停止
以下是遠程調用游戲進程啟動和停止.
步驟:
在Jenkins上,以xbzj用戶名義(sudo)調用數據管理機的腳本,腳本內容是通過xbzj用戶ssh密鑰認證遠程執行各游戲服上的啟停腳本文件.
任務名稱 構建執行的shell命令
start-01-xbzj-taihe-codex.log.receiver sudo -u xbzj /home/xbzj/server-bin/server-ip/manage-codex.log.receiver.sh --start
start-02-xbzj-taihe-codex.payments sudo -u xbzj /home/xbzj/server-bin/server-ip/manage-codex.payments.sh --start
...
stop-01-xbzj-taihe-codex.login sudo -u xbzj /home/xbzj/server-bin/server-ip/manage-codex.login.sh --stop
stop-02-xbzj-taihe-codex.gateway sudo -u xbzj /home/xbzj/server-bin/server-ip/manage-codex.gateway.sh --stop
...
cat manage-codex.fight.sh
!/bin/bash
Chenxin 20180804
cd /home/xbzj/server-bin/server-ip
dir=codex.fight
action=$1
if [ "$action" == "--start" ];then
action1="啟動"
else
action1="停止"
fi
exe_path=$(echo $dir|awk -F '.' '{print $2}')
echo $exe_path
cat rsync-ip.txt |grep "$dir\ "|awk '{print $3,$2}' > ./${dir}_manage.txt
cat ./${dir}_manage.txt |while read line
do
ip=echo "${line}"|awk '{print $1}'
#class=echo "${line}"|awk '{print $2}'
echo "++++++++++++++ 開始 $ip 上的 $dir $action1 操作 +++++++++++++++++ "
/usr/bin/ssh $ip -p 4399 -n "cd /home/xbzj/game-func/game-script/$exe_path && ./Manage.sh $action;sleep 3;tail nohup.out";
pwd
#echo $class
if [ $? == 0 ];then
echo " 😃 😃 😃 成功 😃 😃 😃 請檢查控制台輸出信息,確定成功"
else
echo " 😦 😦 😦 失敗 😦 😦 😦 "
fi
done
CI案例 (maven,nexus私有倉庫) - 采用腳本編譯的方式(非Jenkins插件)
參考
maven全局配置文件settings.xml詳解
http://www.cnblogs.com/jingmoxukong/p/6050172.html
maven指令介紹(Maven學習:常用mvn命令)
https://blog.csdn.net/lfsfxy9/article/details/12200915
nexus搭建私有倉庫
https://www.cnblogs.com/fanzhenyong/p/7709434.html
目錄
cd /home/jenkins/build-dir/svn-download/
svn co svn://192.168.31.31/project_a/server
svn co svn://192.168.31.31/project_a/tools
maven配置
/usr/local/maven/conf/settings.xml
配置文件解析
settings.xml是maven的全局配置文件。而pom.xml文件是所在項目的局部配置。
Settings.xml中包含類似本地倉儲位置、修改遠程倉儲服務器、認證信息等配置。
配置優先級
需要注意的是:局部配置優先於全局配置。
配置優先級從高到低:pom.xml> user settings > global settings
如果這些文件同時存在,在應用配置時,會合並它們的內容,如果有重復的配置,優先級高的配置會覆蓋優先級低的。
配置maven加載庫后放置的本地路徑
在最后,mvn install項目的時候,會下載非常多的文件(有pom,有jar),默認放到用戶的根目錄.m2/下,類似/home/coinw/.m2/repository/.而如果采用的是Jenkins的mvn構建項目,則為Jenkins自己權限,所以默認放置位置就變成了 /var/lib/jenkins/.m2/.
鏡像地址
倉庫
包的輸出路徑可以加在mvn xxx 后面-DoutputDirectory="$OUT_DIR/$3/lib"
以下為一個示例setting.xml
編譯腳本-示例
[xbzj@local-test build-dir]$ cat package.sh
!/bin/bash
20180817
source /etc/profile
export JAVA_HOME="/usr/local/jvm"
export MAVEN_HOME="/usr/local/maven"
export OUT_DIR="/home/jenkins/build-dir/package"
export GAME_CONFIG_PATH="/home/jenkins/build-dir/svn-download/tools/轉表工具/csv"
export MAP_CONFIG_PATH="/home/jenkins/build-dir/svn-download/tools/轉表工具/mapConfig"
export CFG_CONFIG_PATH="/home/jenkins/build-dir/svn-download/tools/轉表工具/cfg"
export MVN="/usr/local/maven/bin/mvn"
export AGENT_LIB="D:\agent.jar"
export AGENT_LIB="/home/jenkins/build-dir/extra-jar/agent.jar"
export SERVER_CODEX="/home/jenkins/build-dir/svn-download/server/codex"
cd /home/jenkins/build-dir
rm $OUT_DIR -rf
mkdir $OUT_DIR
cd $SERVER_CODEX
svn cleanup;
rm -rf $SERVER_CODEX/codex.proto/src/main/java
svn up $SERVER_CODEX
svn up $GAME_CONFIG_PATH
svn up $CFG_CONFIG_PATH
for i in ls ./*.sh;do
echo "當前目錄:"
pwd .
cp -aprf $i $OUT_DIR
done
$MVN -f=pom.xml clean install -q -P product -U -Dmaven.test.skip=true
$MVN -f=codex.proto/pom.xml clean protobuf:compile install -q -P product -U -Dmaven.test.skip=true
echo "公共包 完成"
function COPY_CFG_CONFIG()
{
cp -aprf "$CFG_CONFIG_PATH" "$OUT_DIR/$1/config"
echo "$1 策划配置 完成"
}
function SVN_UP()
{
rm -rf $1
svn up $1
}
function COPY_GAME_CONFIG()
{
if [ "$2" != "" ];then
COPY_GAME_CONFIG2 $1 $2
else
COPY_GAME_CONFIG2 $1 $1
fi
}
function COPY_GAME_CONFIG2()
{
cp -aprf "$GAME_CONFIG_PATH" "$OUT_DIR/$2/gameConfig"
echo "$1 游戲配置 完成"
}
function COPY_MAP_CONFIG()
{
SVN_UP $MAP_CONFIG_PATH
cp -aprf "$MAP_CONFIG_PATH" "$OUT_DIR/$1/mapConfig"
echo "$1 地圖配置 完成"
}
function COPY_LIB()
{
if [ "$3" != "" ];then
COPY_LIB2 $1 $2 $3
else
COPY_LIB2 $1 $2 $1
fi
}
function COPY_LIB2()
{
$MVN -f=$1/pom.xml assembly:assembly dependency:copy-dependencies -DoutputDirectory="$OUT_DIR/$3/lib" -DincludeScope=runtime -q -P product -U -Dmaven.test.skip=true
cp -aprf "$1/target/bin.zip" "$OUT_DIR/$3/"
mkdir -p $OUT_DIR/$3/ref
cp -aprf $1/target/classes/.properties $OUT_DIR/$3/ref
cp -aprf $AGENT_LIB "$OUT_DIR/$3/lib"
for i in ls $OUT_DIR/$3/lib/*.jar;do
echo lib/$i>> $OUT_DIR/$3/jarlist.txt
done
if [ "$2" != "" ];then
echo $2 >> $OUT_DIR/$3/Main
fi
echo "$1 編譯拷貝 完成"
}
COPY_LIB codex.gameCenter com.aly.codex.gcenter.Boot
COPY_GAME_CONFIG codex.gameCenter
echo "中心服務器 完成"
COPY_LIB codex.fight com.aly.codex.fight.Boot
COPY_GAME_CONFIG codex.fight
COPY_MAP_CONFIG codex.fight
echo "戰斗服 完成"
COPY_LIB codex.game com.aly.codex.game.Boot
COPY_GAME_CONFIG codex.game
COPY_CFG_CONFIG codex.game
echo "游戲服 完成"
COPY_LIB codex.match2 com.aly.codex.match2.Boot codex.match
COPY_GAME_CONFIG codex.match2 codex.match
echo "匹配服務器 完成"
COPY_LIB codex.login com.aly.codex.login.Boot
echo "登陸服務 完成"
COPY_LIB codex.gateway com.aly.codex.gateway.Boot
echo "登陸服務 完成"
echo "全部完成 請檢查"
echo "生成文件:"
ls $OUT_DIR
echo "文件大小:"
du -sh $OUT_DIR
du -sh $OUT_DIR/
echo "修改Start.sh,BuildOpts.sh文件權限"
chmod 755 $OUT_DIR/*.sh && echo "權限修改成功"
echo
echo "全部編譯和操作完成"
加入Jenkins
visudo:
jenkins ALL=(xbzj) NOPASSWD: /home/jenkins/build-dir/package.sh,/home/xbzj/server-bin/server-ip/rsync-codex-*.sh
文件權限:
[root@MiWiFi-R3P-srv ~]# ll /home/jenkins/build-dir/
total 12
drwxrwxr-x 5 xbzj xbzj 103 Aug 23 15:42 package
-rwxr-xr-x 1 xbzj xbzj 3121 Aug 23 15:40 package.sh
drwxr-xr-x 29 xbzj xbzj 4096 Aug 22 19:32 repository
drwxr-xr-x 4 xbzj xbzj 33 Aug 22 18:48 svn-download
Jenkins任務(西部戰紀-游戲服-CI)
sudo -u xbzj /home/jenkins/build-dir/package.sh
CICD 采用插件方式 (采用Jenkins插件 JDK GIT MAVEN 的方式)
2013 Chenxin
2019/08/22 update Chenxin
參考
jenkins插件方式CICD http://blog.51cto.com/zero01/2074341
maven常用命令 mvn -s /usr/local/maven/conf/settings.xml clean install
插件CICD涉及的步驟
安裝JDK(略)
安裝/配置tomcat(略)
安裝maven
Jenkins里配置JDK(供編譯用)
Jenkins里配置maven
安裝Maven Integration插件(Jenkins對mvn項目支持的插件,構建Job的時候第一步選擇)
構建job(構建maven項目.最重要的步驟)
配置Git項目的拉取URL和憑證(用戶名+密碼)
發布war包
涉及的知識
maven: 構建java項目時,解決眾多依賴性問題的管理器,提高編譯打包便利性
settings.xml: maven的setting配置文件,里面可以配置nexus倉庫路徑(在線依賴包倉庫),默認是使用的本地環境.
pom.xml: 構建java項目的配置文件(由開發人員提交到git或給出)
安裝maven
編譯和打包都是用maven完成.
官網下載地址:https://maven.apache.org/download.cgi 截止2019/08/22,最新版本3.6.1 wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven...tar.gz
cd /opt/; tar -zxvf apache-maven-3.5.4-bin.tar.gz; mv apache-maven-3.5.4 /usr/local/maven;
檢查maven版本 /usr/local/maven/bin/mvn -version
在build那步,mvn install項目的時候,會下載非常多的文件(有pom,有jar),默認放置到 /var/lib/jenkins/.m2/.如果是腳本調用方式,則類似/home/coinw/.m2/目錄.
配置JDK
系統管理 -> 全局工具配置->別名 JDK_1.8.0_221 , 取消"Install automatically"的鈎,JAVA_HOME為/usr/local/jvm .點擊"保存".
配置maven
系統管理 -> 全局工具配置->先配置maven的setting.xml文件的路徑. -> /usr/local/maven/conf/settings.xml
然后往下拉,找到Maven,配置maven的安裝路徑:maven安裝->新增maven->Name: Apache Maven 3.6.1;將"Install automatically"的鈎去掉,填入"MAVEN_HOME"的路徑: /usr/local/maven .點擊保存.
安裝Maven Integration插件
系統管理 -> 管理插件,安裝 Maven Integration和 Deploy to container().
安裝Maven Integration:如果沒有的話,構建任務時是沒有Maven項目的選項的.
安裝Deploy to container:非必須.發布到tomcat的8080端口時用.需要tomcat管理admin權限.是用於發布遠程war包的.
安裝完成,重啟Jenkins.
構建job
1.構建一個maven項目的job類型
名稱 test-201908
1.1General
->參數化構建(這里給出之后需要用到的git項目的分支參數,比如名稱 "branch",選項"release/otc1.2"(可以添加多個分支選項).之后在Git那步,就可以調用這個$branch變量.
1.2源碼管理
->SVN/GIT.這里選擇Git.
->Repositories->Repository URL為http://47.75.218.30/gitlab/coinw/coinw-web.git ->Credentials 添加git對應的用戶名和密碼,比如用戶名gitlab+deploy-token-2,密碼xxx.
->Branches to build(分支)->Branch Specifier (blank for 'any')這里填入"$branch"(參數化構建里指定的分支變量名).
1.3構建觸發器
默認
1.4構建環境
默認
1.5Pre Steps(構建前執行)
因git拉取到的配置文件,是內網或開發者的本地配置.所以需要將配置文件重新導入,以便構建測試/生產環境的war包.選擇執行shell腳本,
cp -aprf /home/coinw/yure_server/project_coinw_web/deploy_webroot/config/* src/main/resources/ #配置文件
cp -aprf /home/coinw/yure_server/project_coinw_web/project_build/pom.xml . #指定的pom.xml文件(git也會拉取到該文件).
1.6Build(構建)編譯源碼並打包
->Root POM為 pom.xml #就是Jenkins這個job的workspace的根目錄/var/lib/jenkins/workspace/test-201908/.
->Goals and options 為 install (直接輸入mvn的參數選項)
->高級選項默認
1.7Post Steps(構建后執行)
默認
1.8構建設置
默認(可以mail通知)
保存后嘗試構建,測試,查看控制台輸出.
2.構建的目錄和數據說明
構建job的時候,所有數據都會放入到/var/lib/jenkins/下(主目錄).
job/ 存放每次作業的log和xml信息.
workspace/ 存放每個job對應的工作目錄.比如 /var/lib/jenkins/workspace/test-201908/ 為test-201908 job的主目錄.
構建后的目錄結構
[coinw@localhost test-201908]$ pwd
/var/lib/jenkins/workspace/test-201908
[coinw@localhost test-201908]$ tree -L 2
.
├── pom.xml # 默認git拉取的時候,會有這個文件.因該文件里的Mysql配置錯誤,所以Jenkins里在構建前,有通過shell方式拷貝一個過來.
├── README.md
├── sql
│ └── update.sql
├── src
│ ├── main
│ └── test
└── target
├── classes
├── coinw-web-1.0.0
├── coinw-web-1.0.0.war # 構建完成后,得到的war包.用於后面的發布.
├── generated-sources
├── maven-archiver
├── maven-status
└── test-classes
發布war包方式一(不推薦)
這一步最好使用自建腳本方式,若使用Jenkins的"發布到容器"插件,需要tomcat的admin管理頁面權限.
回到Job的配置,在構建后操作那一欄點擊 “增加構建后操作步驟” 選擇 “Deploy war/ear to a container”(tomcat).
WAR/EAR files 輸入 **/*.war ,匹配所有war包->"Add Container"里,Containers選擇Tomcat 8.x->Credentials這里點擊"Add",輸入tomcat的用戶名和密碼.然后,Tomcat URL填寫要把war包發布到的那台機器的url,如 http://192.168.3.227:8080 . # 發布到多個容器的話,這里多次選擇就可以了.
這樣就可以將war包發布到tomcat容器里了.
發布war包方式二(推薦)
通過外掛腳本的方式來處理.具體略.
job的構建(2013采用過的方式)-不推薦
選擇通用型自由風格的軟件.
1.給出項目名稱,描述信息,選擇基本項等.
2.從SVN上揀出文件,jenkins會自動將揀出的文件放入/var/lib/jenkins/jobs/test02/workspace/(配置路徑).
給出svn地址的后,會報需要用戶密碼認證,給出正確的用戶名和密碼完成SVN的認證.
3.構建過程中使用的shell腳本.rsync從jenkins主機的對應目錄下(根據自己的腳本定義)取文件上傳到生產服問題.
rsync的秘鑰配置(秘鑰直接放置到jenkins賬號的.ssh/下:/var/lib/jenkins/.ssh/).jenkins在root權限下,啟動后,java進程屬組就是jenkins的(ps axfu).
使用rsync將已經從svn上down下來的文件放入生產服的時候,務必做好ssh的認證.
/usr/bin/rsync -avz -e "ssh -p 4399" --del --exclude-from=/var/lib/jenkins/exclude.list "${WORKSPACE}/" xbadmin@103.17.41.68:/home/xbadmin/update/test02;
方法一:
jenkins賬號下的/var/lib/jenkins/.ssh/known_hosts文件內容,可以通過其他賬號認證后,將其他賬號的條目手動拷貝到該文件下予以解決.否則在"構建"過程中,會報Host key verification failed錯誤,無法成功.
方法二:
默認jenkins賬號的shell配置如下:
jenkins❌498:498:Jenkins Continuous Build server:/var/lib/jenkins:/bin/false
在做主機認證時,可以手動指定bash,然后接收訪問對端的主機key,完成認證,如下:
su -s /bin/bash jenkins
ssp -p 103.17.41.68 手動輸入yes.
rsync可以排除的同步文件語法:
$ cat /var/lib/jenkins/exclude.list
admin_20120610_shijingshanruijiangkeji.*
.svn
test.*
4.構建完成后,發送郵件問題.
方法一:可以直接在本機安裝postfix(默認一般都裝了的),service postfix start即可.郵件配置(本機啟動postfix,啟動25端口,默認就會從本機發出去.同時本地安裝個mail,以便用命令發送郵件.mail -s "subject" chenxin@xindong100.com < ./test_mail.txt)
方法二:通過jenkins的全局配置里,配置smtp的認證,通過外網發送相關郵件.
5.正確構建部署后的控制台輸出
Success控制台輸出
Started by user chenxin
Building in workspace /var/lib/jenkins/jobs/test02/workspace
Updating http://192.168.2.60:8080/svn/yunweibu/06網絡相關/機房選擇/原始數據 at revision '2014-11-20T15:39:26.195 +0800'
At revision 1288
no change for http://192.168.2.60:8080/svn/yunweibu/06網絡相關/機房選擇/原始數據 since the previous build
[workspace] $ /bin/sh -xe /tmp/hudson3246779838898506564.sh
- /usr/bin/rsync -avz -e 'ssh -p 4399' --del --exclude-from=/var/lib/jenkins/exclude.list /var/lib/jenkins/jobs/test02/workspace/ xbadmin@103.17.41.68:/home/xbadmin/update/test02 //原腳本被轉換為全路徑
sending incremental file list //rsync的輸出內容.
sent 360 bytes received 12 bytes 744.00 bytes/sec
total size is 7906066 speedup is 21252.87
Finished: SUCCESS
Jenkins常用其他知識說明
Jenkins參數化構建( 構建時選擇一些參數 或 手動輸入參數 ) (常用)
參考 https://blog.csdn.net/e295166319/article/details/54017231 # 2017版
可以將參數傳遞給腳本.參數可以下拉單選,打鈎多選等方式.
觸發器 (不常用)
1.選擇日程表的方式構建,構建方式如下(每5分鍾構建一次):
*/5 * * * * 或 H/5 * * * * (盡可能使用"H",會根據系統負載情況,有jenkins自己去確定具體執行時間.H表示一個范圍內的隨機值)
2.修改為其他日程表時間(注意每次修改后,退出在進去,就可以看到下次預計執行的時間提示了)
3.jenkins對日程表的解釋說明
-
-
-
-
- 分 時 日 月 周
M-N 指定一個值的范圍
M/X或*/X 由x的間隔通過指定的范圍或整體的有效范圍
A,B,……,Z列舉了多個值
盡可能使用"H",會根據系統負載情況,有jenkins自己去確定具體執行時間.H表示一個范圍內的隨機值.
- 分 時 日 月 周
-
-
-
可以標示注釋內容
H * * * * #表示小時內的任意時間執行,具體由jenkins隨機選擇.H讀作:一次
舉例:
H/15 * * * * #(perhaps at :07, :22, :37, :52)每十五分鍾知悉一次.
H(0-29)/10 * * * * #(three times, perhaps at :04, :14, :24).在每小時的前30分鍾內,每10分鍾執行一次.
H 9-16/2 * * 1-5 #(perhaps at 10:38 AM, 12:38 PM, 2:38 PM, 4:38 PM)工作時間內,每2小時執行一次.
H H 1,15 1-11 * #1-11月內,每月的1-15號,每天執行一次.
視圖 (必用)
當任務非常多,在"所有"里看着繁雜,可以點擊"+",建立新的視圖(列表視圖).
然后將對應的任務選進來.比如"啟動游戲"視圖,就把啟動相關的任務勾選進來.
jenkins 多個項目之間串並聯執行(將多個任務合並為1個) (常用)
MultiJob https://blog.csdn.net/sunsgne_AC/article/details/80098231
到系統管理里安裝 Multijob plugin 插件.
創建任務,選擇創建Multijob project->構建->增加構建步驟->MultiJob phase.
然后將對應的之前創建的Job一個一個填進去(並行還是串行自己選擇).
解決控制台提示信息(常用)
JNLP ->取消掉啟用項目
但要注意的是Jenkins日常的一些關於安全的提示信息,有些插件的升級是為了解決安全問題.
jenkins自身變量說明
The following variables are available to shell scripts
BUILD_NUMBER
The current build number, such as "153"
BUILD_ID
The current build id, such as "2005-08-22_23-59-59" (YYYY-MM-DD_hh-mm-ss)
BUILD_DISPLAY_NAME
The display name of the current build, which is something like "#153" by default.
JOB_NAME
Name of the project of this build, such as "foo" or "foo/bar". (To strip off folder paths from a Bourne shell script, try: ${JOB_NAME##*/})
BUILD_TAG
String of "jenkins-${JOB_NAME}-${BUILD_NUMBER}". Convenient to put into a resource file, a jar file, etc for easier identification.
EXECUTOR_NUMBER
The unique number that identifies the current executor (among executors of the same machine) that’s carrying out this build. This is the number you see in the "build executor status", except that the number starts from 0, not 1.
NODE_NAME
Name of the slave if the build is on a slave, or "master" if run on master
NODE_LABELS
Whitespace-separated list of labels that the node is assigned.
WORKSPACE
The absolute path of the directory assigned to the build as a workspace.
JENKINS_HOME
The absolute path of the directory assigned on the master node for Jenkins to store data.
JENKINS_URL
Full URL of Jenkins, like http://server:port/jenkins/ (note: only available if Jenkins URL set in system configuration)
BUILD_URL
Full URL of this build, like http://server:port/jenkins/job/foo/15/ (Jenkins URL must be set)
JOB_URL
Full URL of this job, like http://server:port/jenkins/job/foo/ (Jenkins URL must be set)
SVN_REVISION
Subversion revision number that's currently checked out to the workspace, such as "12345"
SVN_URL
Subversion URL that's currently checked out to the workspace.
Jenkins對操作系統的環境變量管理( PATH 變量 )
2019/09/17 Chenxin
Jenkins默認讀取到的系統的PATH變量,一般為:
/usr/local/jvm/bin:/usr/local/jvm/bin:/sbin:/usr/sbin:/bin:/usr/bin
如果想要修改,則在Jenkins里配置:
Manage Jenkins – >Configure System – >全局屬性 –>Environment variables->新增,如下:
鍵 PATH 值 /usr/local/jvm/bin:/usr/local/sonar-scanner/bin:.../usr/bin:/root/bin:$PATH
鍵 NODE_PATH 值 /usr/local/nodejs/lib/node_modules
這樣,可以通過job里shell輸出 echo $PATH 檢查正確性(已驗證).
修改Jenkins圖標文件(生產環境不建議,公司的Logo標志太明顯)
路徑
/var/cache/jenkins/war/images/
Jenkins控制台管理-關閉,重啟,重載配置
關閉Jenkins
http://192.168.3.227:13972/exit
之后,控制台會有個post請求的提示按鈕,確定后,就關閉了.
重啟Jenkies
http://192.168.3.227:13972/restart
重新加載配置信息
http://192.168.3.227:13972/reload
Job重命名
將job 名為 test-201908 重命名為 maven-git-test-201908 后.
workspace里會重新生成新的文件夾.本質上相當於創建了一個新的job.原先的test-201908文件夾沒有改變(只是控制台上看不到了).
jobs文件夾里則相當於 mv test-201908 maven-git-test-201908 了.
Jenkins控制台輸出插件(字體顏色)
控制台輸出顯示顏色.
jenkins輸出變色插件:AnsiColor(在系統管理--->插件管理---->可選插件 搜索AnsiColor下載安裝即可)
Job里,構建環境->Color ANSI Console Output->ANSI color map 選擇 xterm.
執行的shell里需要給出以下,之后控制台輸出才會有對應效果.
echo -e "\033[41;30m紅底黑字\033[0m" #常用
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 紅色字 \033[0m"
echo -e "\033[32m 綠色字 \033[0m" #常用
echo -e "\033[33m 黃色字 \033[0m"
echo -e "\033[46;30m 藍底黑字 \033[0m"
echo -e "\033[4;31m 下划線紅字 \033[0m"
echo -e "\033[5;34m 紅字在閃爍 \033[0m" # 天藍
Jenkins與git 標簽(版本回滾)
回滾思路: 根據tag拉取代碼(之后再進行編譯打包發布).
插件方式
Jenkins在發布版本的時候,可以自動打一個tag,並push到遠端.
若發布需要回滾,那么就可以從這個tag處,直接checkout代碼,重新編譯打包.實現版本回滾功能.
具體操作方式和版本,請查網絡資料.
腳本方式
非插件方式,可以參考coinw的回滾腳本調用(備份文檔).
