1. 前言
因為研發部門不想把他們的源代碼 git 到服務器再編譯,git + maven + jenkins 的方式行不通,於是采用 svn + jenkins的方式,流程如下:
只需要 程序員 手動提交到svn ,后面的事件都是由 jenkins 自動完成的。
2. 實現過程
環境介紹
2.1 svn 服務器搭建
時間同步、selinux 、iptables 這些初始化工作就不在說了。
安裝svn程序包
[root@192.168.118.14 ~]#yum install subversion -y 創建common項目 svn目錄 [root@192.168.118.14 ~]#mkdir -pv /svn/dev_test 創建svn倉庫 [root@192.168.118.14 ~]#svnadmin create /svn/dev_test/ [root@192.168.118.14 ~]#ls /svn/dev_test/ conf db format hooks locks README.txt
修改svn配置文件,設置用戶及權限:
三個文件說明:
Passwd - 用戶名和密碼 [root@192.168.118.14 /svn/dev_test/conf]#egrep -v "^#|^$" passwd [users] dev_test:dev_test123 我這里新增了用戶 dev_test 密碼: dev_test123 Authz - 設置權限 [root@192.168.118.14 /svn/dev_test/conf]#egrep -v "^#|^$" authz [aliases] [groups] admin = dev_test [/] @admin = rw 定義 dev_test 為 管理員組,且管理員組對這個svn倉庫有讀寫權限。 svnserve.conf - 倉庫主配置文件 [root@192.168.118.14 /svn/dev_test/conf]#egrep -v "^#|^$" svnserve.conf [general] anon-access = none auth-access = write password-db = passwd authz-db = authz [sasl]
配置完這些,就可以啟動 svn 服務了。
[root@192.168.118.14 /svn/dev_test/conf]#svnserve -d -r /svn/
ok,到這里 svn 啟動成功,可以通過本地主機進行測試,可以在 window端安裝 svn 客戶端進行測試:
點擊OK,輸入用戶名和密碼
Svn 測試成功。
2.2 jenkins 服務器搭建
參考之前的博客:https://www.cnblogs.com/hukey/p/11207345.html
2.3 ansible 安裝
[root@192.168.118.14 ~]#yum install ansible -y
在配置ansible 之前需要做無密碼認證登錄
兩台服務節點,如果節點多的話,可以使用 execpt 來寫腳本,具體參考之前的博客:https://www.cnblogs.com/hukey/p/10949963.html
[root@192.168.118.14 ~]#ssh-keygen -t rsa -P '' [root@192.168.118.14 ~]#ssh-copy-id 192.168.118.15 [root@192.168.118.14 ~]#ssh-copy-id 192.168.118.16
做好無密碼驗證之后在配置 ansible
[root@192.168.118.14 ~]#vim /etc/ansible/hosts [dev_test_node1] 192.168.118.15 ansible_user=root app_dir=/app/node1/ [dev_test_node2] 192.168.118.15 ansible_user=root app_dir=/app/node1/ 測試 ansible [root@192.168.118.14 ~]#ansible all -m ping 192.168.118.15 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.118.16 | SUCCESS => { "changed": false, "ping": "pong" }
2.4 服務節點啟動腳本編寫
這里只記錄 app-node1 192.168.118.15 編寫的過程, 192.168.118.16 一樣的操作
[root@192.168.118.15 ~]#mkdir -pv /app/node1 [root@192.168.118.15 ~]#cd /app/node1/ [root@192.168.118.15 /app/node1]#cat service.sh #!/bin/bash # Author:hukey APP_HOME=/app/node1 cd $APP_HOME APP=$(ls *.jar) start(){ nohup java -jar $APP & } stop(){ PID=$(cat winstar-common-api.pid) kill -9 $PID } update(){ stop DATE=$(date +"%Y%m%d%H%M%S") if [ ! -f backup/app/$DATE ];then mkdir -p backup/app/$DATE fi mv $APP backup/app/$DATE && rm -rf nohup.out } case $1 in start) start ;; stop) stop ;; update) update ;; *) echo "用法:$0 [start | stop | restart | update]" esac
編寫了一個很簡陋的腳本文件,因為測試,只要實現功能即可,生產使用建議進行優化。
注意腳本的 start 和 update 部分,因為待會 ansible 會使用到兩處。
2.5 配置 jenkins 任務並實現提交svn觸發jenkins
寫完,點擊保存。
任務創建完成,這里可以進行一下測試。
在剛才window主機的svn下新建一個文件夾作為 dev_test 的倉庫,然后編寫 Jenkinsfile 文件及腳本文件,具體如下:
Jinkinsfile 文件內容:
pipeline{ agent any stages { stage('Deliver') { steps { withEnv(['JENKINS_NODE_COOKIE=dontkillme']) { sh 'sh ./dev_test/jenkins/scripts/deliver.sh' } } } } }
這里使用的是 Jinkinsfile 語法,其實也就是去觸發了一個 shell腳本,根據路徑創建腳本:
腳本對應上面的目錄應該是:./dev_test/jenkins/scripts/deliver.sh
#!/bin/bash # Author:hukey function start(){ ansible $1 -a "/app/node1/service.sh start" } function update(){ if [ ! -f /var/lib/jenkins/workspace/dev_test/dev_test/*.jar ];then echo '[Error]:java.jar not exist, update failed.' exit 1 fi JAR=$(ls /var/lib/jenkins/workspace/dev_test/dev_test/*.jar) ansible $1 -a "{{app_dir1}}/service.sh update" ansible $1 -m copy -a "src=$JAR dest={{$2}}" } function netPort(){ ansible $1 -a "netstat -ntplu" } update dev_test_node1 app_dir1 sleep 3 start dev_test_node1 while sleep 5; do START_CODE=$(netPort dev_test_node1 | egrep java | wc -l) if [ $START_CODE -ge 1 ]; then update dev_test_node2 app_dir1 sleep 3 start dev_test_node2 break fi done
這個腳本主要是配合 服務節點上的 service.sh 腳本,上面這個腳本必須能夠正確的調用到 service.sh才行。
Jinkinsfile 文件目錄:
deliver.sh 腳本目錄:
接下來將程序拷貝進來提交到 svn 服務器,然后通過手動構建 jenkins 做測試。
ok,程序已經提交到 svn 了, 接下來切換到 jenkins 進行手動構建測試。
第一次通過 jenkins 構建 一般都會出現這樣的報錯,原因是 jenkins 默認是通過 jenkins 用戶來運行的,當jenkins 用戶使用ansible 推送的時候,jenkins用戶並沒有做無密碼登錄。
因此使用 root 用戶來啟動 jenkins 服務。
[root@192.168.118.14 ~]#vim /etc/sysconfig/jenkins 修改 JENKINS_USER="jenkins" 為 JENKINS_USER="root" 重啟服務,再次構建: [root@192.168.118.14 ~]#systemctl restart jenkins
這里使用 jenkins 構建的前提是,兩個服務節點的服務都在正常工作的前提下。
如果腳本都沒問題的前提下,手動構建是會直接成功的。接下來進行 svn 提交自動觸發jenkins 任務配置。
Jenkins -> 系統管理 -> Jenkins 命令行接口 下載 jenkins-cli.jar
切換到 192.168.118.14
[root@192.168.118.14 ~]#cd /svn/dev_test/hooks/ 將 jenkins-cli.jar 拷貝到該目錄,並創建一個腳本文件 post-commit #!/bin/bash java -jar /svn/dev_test/hooks/jenkins-cli.jar -s http://192.168.118.14:8080/ -auth dev_test:dev_test build dev_test
上面的腳本使用 dev_test用戶 dev_test密碼登錄到 jenkins 構建 dev_test 項目。
注意權限:
[root@192.168.118.14 /svn/dev_test/hooks]#chmod +x post-commit jenkins-cli.jar
因此需要在jenkins 創建一個 dev_test 用戶且密碼為 dev_test
Jenkins -> 系統管理 -> 管理用戶 -> 新建用戶
再次提交測試:
構建成功。 記錄的不是特別詳細,但是整體的思路已經很清晰了。如果有同學需要這樣的實現,遇到不懂的地方,下面留言直接問。