以前在公司機房部署了一套jenkins環境,現須要遷移至IDC機房服務器上,遷移過程當中記錄了一些細節:
1)jenkins默認的主目錄放在當前用戶家目錄路徑下的.jenkins目錄中。如jenkins使用root用戶啓動,則主目錄爲/root/.jenkinshtml
[root@code-server ~]# ll -d /root/.jenkins/ drwxr-x--- 14 root root 4096 Dec 18 15:22 /root/.jenkins/
2)能夠在系統環境變量裏手動設置jenkins的主目錄,這樣啓動jenkins後,jenkins數據就會寫入到手動設置的主目錄裏。java
root用戶能夠在/etc/profile文件裏設置 [root@jenkins01 ~]# vim /etc/profile ...... JENKINS_HOME="/data/jenkins" export JENKINS_HOME [root@jenkins01 ~]# source /etc/profile =========================================================== 若是是非root用戶,就在用戶家目錄的.bashrc文件裏設置 [app@jenkins01 ~]$ vim .bashrc ...... JENKINS_HOME="/data/jenkins" export JENKINS_HOME [app@jenkins01 ~]$ source .bashrc [app@jenkins01 ~]$ echo $JENKINS_HOME /data/tomcat8.5/webapps/jenkins [app@jenkins01 ~]$ env ....... JENKINS_HOME=/data/jenkins ========================================================== 舒適提示: 最好別將jenkins主目錄指定到tomcat/webapps/jenkins,由於若是有其餘同名的tomcat項目啓動,容易形成數據覆蓋! 因此最好將jenkins主目錄指定到其餘地方,好比指定到/data/jenkins。
=================================================================
jenkins主備雙機模式:前面一個nginx代理層,提供一個域名代理到後面的jenkins上linux
好比:192.168.10.60和192.168.10.61是兩臺jenkins機器,分別爲jenkins0一、jenkins02 [root@inner-lb02 ~]# cat /data/nginx/conf/vhosts/jenkins.kevin.com.conf upstream 8080-inc { server 192.168.10.60:8080 max_fails=3 fail_timeout=10s; #server 192.168.10.61:8080 max_fails=3 fail_timeout=10s; } server { listen 80; server_name jenkins.kevin.com; access_log /data/nginx/logs/jenkins.kevin.com-access.log main; error_log /data/nginx/logs/jenkins.kevin.com-error.log; location ^~ /jenkins/ { proxy_pass http://8080-inc; proxy_redirect off ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 600; proxy_buffer_size 256k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; proxy_temp_file_write_size 256k; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404; proxy_max_temp_file_size 128m; #proxy_cache mycache; #proxy_cache_valid 200 302 1h; #proxy_cache_valid 301 1d; #proxy_cache_valid any 1m; } } jenkins01和jenkins02兩臺機器: 1)jenkins服務部署目錄是/data/tomcat8.5,jenkins的程序包存放目錄是/data/tomcat8.5/webapps/jenkins 2)jenkins的家目錄是/data/jenkins。 因爲訪問http://jenkins.kevin.com/jenkins是代理負載到192.168.10.60機器上(便是jenkins01機器)的,因此須要同步jenkins01的相關數據 到jenkins02上,以防當jenkins01機器掛掉的時候,將負載域名調整到jenkins02上。 同步腳本以下: [app@jenkins01 ~]$ cat /data/rsync_jenkins.sh #!/bin/bash #首次同步前,能夠先備份下jenkins02機器的/data/jenkins目錄 rsync -e "ssh -p6666" -avpgolr /data/jenkins/ app@192.168.10.61:/data/jenkins/ #當真正切換到jenkins02時,才執行下面的重啓jenkins服務的動做,只要重啓後,同步到的數據才能在jenkins界面展現處理。 #ssh -p6666 app@192.168.10.61 "ps -ef|grep tomcat|grep -v grep|awk '{print $2}'|xargs kill -9" #ssh -p6666 app@192.168.10.61 "/data/tomcat8.5/bin/startup.sh" 授執行權限,每十分鐘執行一次 [app@jenkins01 ~]$ ll /data/rsync_jenkins.sh -rwxr-xr-x. 1 app app 470 Sep 19 11:42 /data/rsync_jenkins.sh [app@jenkins01 ~]$ crontab -l */10 * * * * /bin/bash -x /data/rsync_jenkins.sh > /dev/null 2>&1
jenkins主目錄設置以後,能夠登陸jenkins界面查看它的主目錄路徑,依次點擊"Jenkins"->"系統管理"->"系統設置"nginx
==============jenkins重啓後數據丟失案例分析=================git
jenkins安裝路徑:/data/tomcat8 jenkins的默認的主目錄放在當前用戶家目錄路徑下的.jenkins目錄中,好比: root用戶啓動的jenkins主目錄就是/root/.jenkins,jenkins的全部數據就是放在這個主目錄下。 app用戶啓動的jenkins主目錄就是/home/app/.jenkins,jenkins的全部數據就是放在這個主目錄下。 因爲jenkins服務是在app帳號下啓動的,而且修改了主目錄路徑: [app@uatjenkins01 ~]$ pwd /home/app [app@uatjenkins01 ~]$ cat .bashrc ...... JENKINS_HOME="/data/jenkins" export JENKINS_HOME [app@uatjenkins01 ~]$ source .bashrc 因此jenkins的用戶數據和jobs數據都放在了/data/jenkins主目錄下了。 [app@uatjenkins01 ~]$ ll -d /data/jenkins/ drwxr-x--- 16 app app 4096 Aug 10 20:09 /data/jenkins/ 因爲服務器宕機,在機器啓動後,jenkins的tomcat程序也重啓了,最後發現使用原來的帳號登陸不了jenkins,或者登陸jenkins後發現原來的project工程都沒有了。 數據丟失了?這是爲何???? 最後發現jenkins的tomcat程序是用root帳號啓動的,那麼jenkins加載的數據天然就是默認的/root/.jenkins主目錄裏面的數據了,而不是以前定義的/data/jenkins 目錄裏面的數據了(這是在app帳號下定義的jenkins主目錄) 解決辦法: 關閉root帳號下的jenkins,在app帳號下重啓jenkins服務便可! [root@uatjenkins01 ~]# ps -ef|grep tomcat root 4059 1 0 18:28 ? 00:02:12 /usr/java/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/data/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms8192m -Xmx8192m -XX:PermSize=2048M -XX:MaxNewSize=4096m -XX:MaxPermSize=4096m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /data/tomcat8/bin/bootstrap.jar:/data/tomcat8/bin/tomcat-juli.jar -Dcatalina.base=/data/tomcat8 -Dcatalina.home=/data/tomcat8 -Djava.io.tmpdir=/data/tomcat8/temp org.apache.catalina.startup.Bootstrap start root 9042 8871 0 22:46 pts/2 00:00:00 grep tomcat [root@uatjenkins01 ~]# kill -9 4059 [root@uatjenkins01 ~]# su - app [app@uatjenkins01 ~]$ /data/tomcat8/bin/startup.sh [app@uatjenkins01 ~]$ ps -ef|grep tomcat app 5089 1 0 18:28 ? 00:02:13 /usr/java/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/data/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms8192m -Xmx8192m -XX:PermSize=2048M -XX:MaxNewSize=4096m -XX:MaxPermSize=4096m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /data/tomcat8/bin/bootstrap.jar:/data/tomcat8/bin/tomcat-juli.jar -Dcatalina.base=/data/tomcat8 -Dcatalina.home=/data/tomcat8 -Djava.io.tmpdir=/data/tomcat8/temp org.apache.catalina.startup.Bootstrap start app 9071 9044 0 22:46 pts/2 00:00:00 grep tomcat 這樣訪問jenkins,使用原來的帳號登陸,就能看到以前的project工程了。
3)jenkins遷移web
遷移步驟爲: 1)先關閉新老服務器的tomcat程序,確保遷移時新老機器的jenkins都處於關閉狀態。jenkins程序關閉最好是直接kill掉jenkins的tomcat程序pid。 2)將老服務器jenkins主目錄下的config.xml文件以及jobs、users、workspace、plugins四個目錄拷貝到新機器的jenkins主目錄下。 3)重啓新服務器jenkins的tomcat程序。 遷移的時候能夠直接將jenkins主目錄數據整個拷貝過去,也能夠單獨拷貝jenkins主目錄下的config.xml文件以及jobs、users、workspace、plugins四個目錄(這是主要的遷移數據)。通常來講,手動設置好jenkins主目錄路徑,啓動jenkins後就會自動生成(但要確保jenkins用戶有權限建立這個主目錄,最好是提早手動建立並賦予jenkins啓動用戶的權限) 關閉老機器的jenkins程序 [root@code-server ~]# lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bundle 13481 git 15u IPv4 2839661 0t0 TCP localhost:webcache (LISTEN) [root@code-server ~]# kill -9 13481 新機器的jenkins程序也要一樣關閉 拷貝老服務器的jenkins主目錄或者上面說的那幾個重要數據到新機器的jenkins主目錄下 [root@code-server ~]# rsync -e "ssh -p22" -avpgolr --delete /data/jenkins/ root@10.0.8.60:/data/jenkins/ 或者 [root@code-server ~]# rsync -e "ssh -p22" -avpgolr /data/jenkins/config.xml root@10.0.8.60:/data/jenkins/ [root@code-server ~]# rsync -e "ssh -p22" -avpgolr --delete /data/jenkins/users/ root@10.0.8.60:/data/jenkins/users/ [root@code-server ~]# rsync -e "ssh -p22" -avpgolr --delete /data/jenkins/plugins/ root@10.0.8.60:/data/jenkins/plugins/ [root@code-server ~]# rsync -e "ssh -p22" -avpgolr --delete /data/jenkins/jobs/ root@10.0.8.60:/data/jenkins/jobs/ [root@code-server ~]# rsync -e "ssh -p22" -avpgolr --delete /data/jenkins/workspace/ root@10.0.8.60:/data/jenkins/workspace/ 尤爲是plugins目錄,最好保證新機器下的這個目錄和老機器下的這個目錄數據保持一致。不然容易形成新機器的jenkins訪問報錯 最後啓動新機器的jenkins服務 [root@jenkins01 ~]$ /data/tomcat8.5/bin/startup.sh [app@jenkins01 ~]$ lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 101037 app 46u IPv6 498942 0t0 TCP *:webcache (LISTEN)
4)經過ssh方式下載gitlab代碼到jenkins本機shell
通常來講,會在jenkins界面裏建立工程,在工程裏配置gitlab的地址,將gitlab代碼下載到jenkins本機,而後經過腳本自動發版。 安全考慮,經過ssh方式下載gitlab代碼。這就須要將jenkins本機的id_rsa.pub公鑰上傳到gitlab裏。 1)若是jenkins程序經過root用戶啓動,則須要將root用戶下的id_rsa.pub公鑰上傳到gitlab的SSH Keys裏。 2)若是jenkins程序經過非root用戶啓動,則須要將非root用戶的id_rsa.pub公鑰上傳到gitlab的SSH Keys裏。 好比jenkins程序是經過app用戶啓動的 [app@jenkins01 ~]$ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAw/I9657ZRmducrkbagPfptLwRaCmJIIQIcQ3VljBLBlwyNFBYg6KfiktMB4KHlvu4WCrGpDjVtWf7gQy Ey+iJNsL7TyiIZdg0RRGpssu93w6IhgoHtRZni/775MrdjLQpi7hhB6wiX+eCfU7duqXT+arnEUonAF+27HegVbXuqz+oeDS/1QBzKsOoMg0K4nA7Btl GNIn1ljvvQzyHxIJevWM0UUhFl8lv9+RCcT0cyHmjSrw/9+gr4AYZmYaqlVmCWHmwuAixx7bt3Mh3ri+BK385qAUxaVVsw3kg/vHbJEg+JYn/Xm4pdnw j+CLn6OpQAMZm+bEx12Iwd3gazBy+Q== app@jenkins01.kevin.cn
5)非root用戶啓動jenkins的tomcat程序apache
須要記住的一個細節: 在linux系統下,只有root用戶纔可使用1024如下的端口號,非root用戶只能啓動1024以上的端口。 全部若是使用非root用戶啓動jenkins,則端口必須配置成大於1024的,好比採用默認的8080端口,若是配置成80端口,則啓動失敗!
6)當ssh是非標準的22端口時,進行git clone下載gitlab代碼bootstrap
如上,將jenkins本機的id_rsa.pub公鑰拷貝到gitlab的SSH Keys裏。 1)若是jenkins機器和gitlab機器ssh都採用默認的22端口,則就能夠直接git clone下載git代碼了。 [app@jenkins01 ~]$ mkdir /data/git_data/ [app@jenkins01 ~]$ cd /data/git_data/ [app@jenkins01 git_data]$ git init . Reinitialized existing Git repository in /data/git_data/.git/ [app@jenkins01 git_data]$ git clone git@172.16.50.25:fanglianchao/dbops.git Initialized empty Git repository in /data/git_data/dbops/.git/ Warning: Permanently added '172.16.50.25' (RSA) to the list of known hosts. remote: Counting objects: 1224, done. remote: Compressing objects: 100% (812/812), done. remote: Total 1224 (delta 379), reused 1220 (delta 377) Receiving objects: 100% (1224/1224), 9.50 MiB, done. Resolving deltas: 100% (379/379), done. [app@jenkins01 git_data]$ ls dbops ==================================================================== 2)若是jenkins機器和gitlab機器ssh採用的端口不一致,這就須要在jenkins本機的.ssh目錄下手動建立config文件,在config文件中指定 鏈接gitlab時的信息。 例如:jenkins本機的ssh端口是6666,jenkins本機(172.16.50.25)的ssh端口是22,則在jenkins本機的操做以下: [app@jenkins01 ~]$ mkdir /data/git_data/ [app@jenkins01 ~]$ cd /data/git_data/ [app@jenkins01 git_data]$ git init . Reinitialized existing Git repository in /data/git_data/.git/ [app@jenkins01 ~]$ cat ~/.ssh/config Host "172.16.50.25" Port 22 注意:config文件必須是600權限 [app@jenkins01 git_data]$ sudo chmod 600 ~/.ssh/config [app@jenkins01 git_data]$ ll ~/.ssh/config -rw-------. 1 app app 28 Dec 20 23:26 /home/app/.ssh/config 而後就能夠正常git clone下載代碼了 [app@jenkins01 git_data]$ git clone git@172.16.50.25:qwfss/qwfss.git Initialized empty Git repository in /data/git_data/qwfss/.git/ remote: Counting objects: 110, done. remote: Compressing objects: 100% (59/59), done. remote: Total 110 (delta 23), reused 0 (delta 0) Receiving objects: 100% (110/110), 19.99 KiB, done. Resolving deltas: 100% (23/23), done. [app@jenkins01 git_data]$ ls qwfss
7)下載gitlab上非master分支代碼vim
好比將gitlab上的git@172.16.50.25:qwfss/qwfss.git下develop分支代碼下載到jenkins本機,操做以下: [app@jenkins01 git_data]$ git clone git@172.16.50.25:qwfss/qwfss.git Initialized empty Git repository in /data/git_data/qwfss/.git/ remote: Counting objects: 110, done. remote: Compressing objects: 100% (59/59), done. remote: Total 110 (delta 23), reused 0 (delta 0) Receiving objects: 100% (110/110), 19.99 KiB, done. Resolving deltas: 100% (23/23), done. [app@jenkins01 git_data]$ ls qwfss [app@jenkins01 git_data]$ cd qwfss/ [app@jenkins01 qwfss]$ 查看分支詳細狀況 (推薦這種方式) [app@jenkins01 qwfss]$ git branch * develop [app@jenkins01 qwfss]$ git branch -av * develop 29e5e1f fix(fss): 測試環境配置文件同步 remotes/origin/HEAD -> origin/develop remotes/origin/develop 29e5e1f fix(fss): 測試環境配置文件同步 切換到develop分支下 [app@jenkins01 qwfss]$ git checkout -b develop origin/develop fatal: git checkout: branch develop already exists ==================================================================== 或者 [app@jenkins01 qwfss]$ git checkout -b testapp remotes/origin/develop ==================================================================== [app@jenkins01 qwfss]$ git branch * develop [app@jenkins01 qwfss]$ git branch -av * develop 29e5e1f fix(fss): 測試環境配置文件同步 remotes/origin/HEAD -> origin/develop remotes/origin/develop 29e5e1f fix(fss): 測試環境配置文件同步 ===================================================================== git分支的平常操做能夠參考:http://www.cnblogs.com/kevingrace/p/5690820.html
8)jenkins備機環境
部署jenkins備機時,只須要按期將master機器上jenkins主目錄數據拷貝到本機上便可。 好比: jenkins master:10.0.8.60 jenkins01 jenkins slave:10.0.8.61 jenkins02 兩臺機器的jenkins主目錄都是:/data/jenkins [app@jenkins01 ~]$ vim /etc/profile JENKINS_HOME="/data/jenkins" export JENKINS_HOME [app@jenkins01 ~]$ source /etc/profile 手動指定jenkins主目錄後,待jenkins啓動後,該主目錄會自動生成。 可是要注意的是:jenkins啓動用戶要有權限生成主目錄(能夠提早手動建立該目錄,並將權限設置成jenkins啓動用戶的權限) 那麼只須要按期將master機器10.0.8.60上的/data/jenkins目錄下的文件拷貝到10.0.8.61機器/data/jenkins下便可! 10.0.8.61上寫備份腳本(兩臺機器提早作app帳號下的ssh無密碼登錄的信任關係): [app@jenkins01 ~]$ cat /data/script/rsync_jenkins02.sh (以下腳本,若是不添加--delete參數,則只會同步增長的數據,刪除的數據不會同步) #!/bin/bash /usr/bin/rsync -e "ssh -p6666" -avpgolr --delete /data/jenkins/ app@10.0.8.61:/data/jenkins/ /usr/bin/ssh -p6666 app@10.0.8.61 "/bin/bash -x /home/app/kill_tomcat.sh" /usr/bin/ssh -p6666 app@10.0.8.61 "/data/tomcat8.5/bin/startup.sh" 10.0.8.61上的腳本: [app@jenkins02 ~]$ cat /home/app/kill_tomcat.sh #!/bin/bash ps -ef|grep java|grep -v grep|awk '{print $2}'|xargs kill -9 如上腳本準備好後,只須要天天定時去執行10.0.8.60機器上的同步腳本/data/script/rsync_jenkins02.sh,便可完成jenkins的備機操做了。
==============Jenkins基於java代碼發版: Jenkins+Gitlab+Maven+Nexus=============
Jenkins(提早安裝maven環境)針對Java代碼的發版基本能夠分爲下面幾個步驟:
1)安裝部署Jenkins、Gitlab、Nexus。安裝過程在以前的文章中已經提到過了,這裏就省略了。
2)將相關代碼上傳到Gitlab裏進行託管,上傳內容須要包括pom.xml文件、src目錄。其中pom.xml文件裏須要配置鏈接Nexus的相關信息;src目錄裏包括java編譯須要的代碼文件。以下截圖:
pom.xml文件裏配置的是nexus的鏈接信息
通常而言,pom.xml文件最好放到Gitlab相關project工程的根目錄下,這樣在jenkins裏配置時直接寫"pom.xml"便可,maven讀取該文件進行編譯;若是pom.xml文件不放到project工程的根目錄下,則在jenkins裏配置時就須要寫相對路徑下。好比pom.xml文件放到http://gitlab.kevin.com/test.git下面的a/b/pom.xml位置,則在jenkins裏配置的時候須要寫"a/b/pom.xml"的相對路徑。
3)Jenkins配置。構建project工程的時候,選擇「構建一個maven項目」。
上面填寫項目構建參數(與開發人員有關),基礎參數爲「clean package」。而後在Execute shell裏編寫腳本,將該工程執行並編譯後的jar或war包同步到須要發版的目標服務器上,並重啓java服務。
點擊"當即構建",就會依次執行:從gitlab拉取代碼,maven進行編譯,而後經過腳本將編譯後jar或war包同步到上線的服務器上,並重啓java程序。
以下,點擊"工做區"能夠看到編譯後的jar或war包。
登錄jenkins服務器,加入jenkins的根目錄是/data/jenkins。則能夠到jenkins服務器的/data/jenkins/jobs下找對應的project工程目錄,在這個工程目錄的workspace裏能夠看到從gitlab上拉取下面的代碼,發現jenkins執行構建成功後,這些代碼裏會多了一個target目錄,而target目錄下就會有編譯後的jar或war包,將這裏面的jar或war包經過jenkins發版的腳本同步到上線的目標服務器上便可。
[root@uatjenkins01 gw-anshuo]# pwd /data/jenkins/jobs/uat-gw-anshuo/workspace/qwgateway/gw-anshuo [root@uatjenkins01 gw-anshuo]# ls #發如今gitlab上只有pom.xml和src,經過jenkins構建工程,maven編譯後這裏多了一個target目錄。 pom.xml src target [root@uatjenkins01 gw-anshuo]# ls target/ #target目錄下有編譯後的jar包,將這個jar包經過jenkins腳本同步到上線服務器上。 classes generated-sources generated-test-sources gw-anshuo-1.0.0.release.jar maven-archiver maven-status test-classes