一、概述
有一台測試服務器,需要部署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 }}"
回滾模板
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 }}"
三、服務器配置
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
添加執行權限
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
點擊開始構建,就可以了!