jenkins發佈Spring Cloud(單機版)

一、概述

有一臺測試服務器,需要部署Spring Cloud。通過Jenkins來發布!

 

環境說明

 

gitlab版本:GitLab 社區版 10.5.1 

jenkins版本:2.219

測試服務器:操作系統爲centos7.6

 

項目說明

微服務統一在一個git項目裏面,項目的大致結構如下:

./
├── auth-server
│   ├── pom.xml
│   └── src
├── common
│   ├── pom.xml
│   └── src
├── config-server
│   ├── pom.xml
│   └── src
├── eureka-server
│   ├── pom.xml
│   └── src
├── gateway
│   ├── pom.xml
│   └── src
├── pom.xml
└── service-user
    ├── pom.xml
    └── src

主要有5個微服務器,分別是eureka,config,auth,user,gateway

 

二、ansible配置

增加分組

修改文件/etc/ansible/hosts,增加一個分組

[test_java]
192.168.28.229 ansible_ssh_port=22

 

ansible playbook

登錄到jenkins服務器,創建目錄

mkdir -p /opt/ansible/test

 

發佈模板

vi /opt/ansible/test/deploy_standard_template.yml

內容如下:

---
 - hosts: "{{ HOSTS }}"
   remote_user: root
   become: yes
   become_method: sudo
   # 需要傳入變量HOSTS,ENV,PROJECT_NAME,PREFIX,PORT
   # 分別表示主機,環境,項目名,路徑前綴(拼接jenkins jar包路徑),端口。
   # 聲明變量
   vars:
     # 遠程項目基礎目錄
     BASE_DIR: "/data/code"
     # 遠程項目目錄名
     PROJECT_DIR: "{{ ENV }}_{{ PROJECT_NAME }}_{{ PORT }}"
     # 備份目錄
     BAK_DIR: "/data/website_backup"
     # 完整的jenkins jar包路徑
     JENKINS_JAR: "/data/jenkins_data/workspace/{{ JOB_NAME }}/{{ PREFIX }}/target/{{ PROJECT_NAME }}.jar"
   tasks:
    #刪除原來的包
     - name: move old package
       file: path={{ BASE_DIR }}/{{ PROJECT_DIR }}/{{ PROJECT_NAME }}.jar state=absent
    #同步jar包到目標服務器
     - name: synchronize package to {{ PROJECT_NAME }}
       synchronize:
         src: "{{ JENKINS_JAR }}"
         dest: "{{ BASE_DIR }}/{{ PROJECT_DIR }}/"
    #修改包的屬性
     - name:  modify package
       file:  path="{{ BASE_DIR }}/{{ PROJECT_DIR }}/{{ PROJECT_NAME }}.jar" owner=root group=root
    # 備份當前的包
     - name: backup jar
       shell: "mkdir -p {{ BAK_DIR }}/{{ PROJECT_DIR }}_rollback/{{ BUILD_NUMBER }}/;cp -a {{ BASE_DIR }}/{{ PROJECT_DIR }}/{{ PROJECT_NAME }}.jar {{ BAK_DIR }}/{{ PROJECT_DIR }}_rollback/{{ BUILD_NUMBER }}/;chown -R root:root {{ BAK_DIR }}/{{ PROJECT_DIR }}_rollback"
    #啓動server
     - name: start
       shell: "/opt/script/{{ PROJECT_DIR }} restart"
     - name: view port,Wait for 90 seconds
       shell: "sleep 90;lsof -t -i:{{ PORT }}"
View Code

 

回滾模板

vi /opt/ansible/test/rollback_standard_template.yml

內容如下:

---
 - hosts: "{{ HOSTS }}"
   remote_user: root
   become: yes
   become_method: sudo
   # 需要傳入變量HOSTS,ENV,PROJECT_NAME,PORT,BUILD_ID
   # 分別表示主機,環境,項目名,端口,回滾的構建ID
   # 聲明變量
   vars:
     # 遠程項目基礎目錄
     BASE_DIR: "/data/code"
     # 遠程項目目錄名
     PROJECT_DIR: "{{ ENV }}_{{ PROJECT_NAME }}_{{ PORT }}"
     # 備份目錄
     BAK_DIR: "/data/website_backup"
   tasks:
    # 還原指定的包
     - name: reduction package
       shell: "\\cp -a {{ BAK_DIR }}/{{ PROJECT_DIR }}_rollback/{{ BUILD_ID }}/{{ PROJECT_NAME }}.jar {{ BASE_DIR }}/{{ PROJECT_DIR }}/{{ PROJECT_NAME }}.jar"
    #啓動server
     - name: start
       shell: "/opt/script/{{ PROJECT_DIR }} restart"
     - name: view port,Wait for 80 seconds
       shell: "sleep 80;lsof -t -i:{{ PORT }}"
View Code

 

三、服務器配置

jdk配置

登錄測試服務器,創建代碼目錄

mkdir -p /data/code

安裝rsync,用於jenkins同步代碼

yum install -y rsync

安裝jdk,這裏就不做描述了。請參考鏈接:

https://www.cnblogs.com/xiao987334176/p/11678894.html

 

java啓動腳本

創建腳本目錄

mkdir /opt/script

eureka啓動腳本

vi /opt/script/test_eureka-server_8761

內容如下

#!/bin/bash
# auditd        Start jar package
# chkconfig: 2345 14 87
# description: This is admin project
#define var

export JAVA_BIN=/data/jdk1.8.0_211/
export JAR_NAME=eureka-server.jar
export PROJECT_SERVICE=eureka-server
export ENV=test
export XMS=512m
export XMX=512m
export PORT=8761
export PROJECT_HOME=/data/code/${ENV}_${PROJECT_SERVICE}_${PORT}

. /etc/init.d/functions 
export START="nohup ${JAVA_BIN}bin/java -Xms${XMS} -Xmx${XMX} -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=256m -jar ${PROJECT_HOME}/${JAR_NAME} &"

#服務腳本
start(){
    echo "${PROJECT_SERVICE} starting....."
    source /etc/profile && cd $PROJECT_HOME && eval $START 
    if [ $? -eq 0 ];then
            action "$PROJECT_SERVICE is starting" /bin/true
    else
            action "$PROJECT_SERVICE is starting" /bin/false
    fi
}
stop(){
    for i in $(ps -aux|grep ${JAR_NAME}|grep -v grep|awk '{print $2}');do
            kill -9 $i;
    done
    if [ $? -eq 0 ];then
        action "$PROJECT_SERVICE is stoping" /bin/true
    else
        action "$PROJECT_SERVICE is stoping" /bin/false
    fi 
}
status(){
    if [ `ss -tunlp|grep ${PORT}|awk '{print $5}'|cut -d: -f2` = ${PORT} ];then
            echo "${PROJECT_SERVICE} is running....."
    else
            echo "${PROJECT_SERVICE} is stopping....."
    fi
}
case $1 in
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    stop
    start
    ;;
status)
    status
    ;;
*)
   echo "$0 <start|stop|restart>"
esac
View Code

添加執行權限

chmod 755 /opt/script/test_eureka-server_8761

 

其它4個微服務腳本也是同樣的,注意修改項目名和端口號。

 

四、jenkins配置

確保jenkins已經安裝了插件:Git Parameter

新建job

名爲:test_eureka-server,選擇自由風格的。

 

 參數化構建

 

 指定分支

 

 build參數

構建後執行shell腳本

 

 

 完整內容如下:

case $Status  in
  Deploy)
    echo "Status:$Status"
    ansible-playbook -v /opt/ansible/test/deploy_standard_template.yml -e "HOSTS=test_java JOB_NAME=${JOB_NAME} BUILD_NUMBER=${BUILD_NUMBER} ENV=test PROJECT_NAME=eureka-server PREFIX=eureka-server PORT=8761"
    echo "Completing!"
    ;;
  Rollback)
    echo "Status:$Status"
    echo "BUILD_ID:$BUILD_ID"
    ansible-playbook -v /opt/ansible/test/rollback_standard_template.yml -e "HOSTS=test_java ENV=test PROJECT_NAME=eureka-server PORT=8761 BUILD_ID=${BUILD_ID}"
    echo "Completing!"
    ;;
  *)
  exit
    ;;
esac

 

構建後操作

 

 

五、發佈

點擊build

 

 

直接點開始構建,build_id不需要輸入

 

 

六、回滾

先查看左側的build_id

 

 

如果要回到上一個版本,選擇rollback,輸入數字1

 

 點擊開始構建,就可以了!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章