以前在公司机房部署了一套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