SVN + Jenkins 構建自動部署

1. 前言

由於研發部門不想把他們的源代碼 git 到服務器再編譯,git + maven + jenkins 的方式行不通,因而採用 svn + jenkins的方式,流程以下:html

 

 

 

只須要 程序員 手動提交到svn ,後面的事件都是由 jenkins 自動完成的。java

 

2. 實現過程

 

環境介紹node

 

 

 

2.1 svn 服務器搭建

時間同步、selinux 、iptables 這些初始化工做就不在說了。linux

安裝svn程序包git

[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配置文件,設置用戶及權限:程序員

三個文件說明:shell

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 服務了。vim

[root@192.168.118.14 /svn/dev_test/conf]#svnserve -d -r /svn/

ok,到這裏 svn 啓動成功,能夠經過本地主機進行測試,能夠在 window端安裝 svn 客戶端進行測試:api

 

 

 

 

 

點擊OK,輸入用戶名和密碼bash

 

 

 

Svn 測試成功。

 

2.2 jenkins 服務器搭建

參考以前的博客:http://www.javashuo.com/article/p-klqqwlkx-km.html

 

2.3 ansible 安裝

[root@192.168.118.14 ~]#yum install ansible -y

在配置ansible 以前須要作無密碼認證登陸

兩臺服務節點,若是節點多的話,可使用 execpt 來寫腳本,具體參考以前的博客:http://www.javashuo.com/article/p-cykiyyrd-kn.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 -> 系統管理 -> 管理用戶 -> 新建用戶

 

 

再次提交測試:

 

 

構建成功。 記錄的不是特別詳細,可是總體的思路已經很清晰了。若是有同窗須要這樣的實現,遇到不懂的地方,下面留言直接問。

相關文章
相關標籤/搜索