自動化部署-Jenkins備份回滾

一、備份

  備份可使用批處理命令解決,實際就是複製當前發佈文件python

::備份文件夾名,使用當前時間
set foldername=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
::發佈目錄
set publishfolder=D:\LastOne\PcApi
::文件夾不存在 建立
if not exist "%publishfolder%\Backup\" (
md "%publishfolder%\Backup" )
::建立備份文件夾
md "%publishfolder%\Backup\%foldername%"
::複製當前發佈文件到備份文件夾中,排除掉備份文件及日誌文件
"C:\Windows\System32\robocopy.exe" %publishfolder%\. %publishfolder%\Backup\%foldername%\ /IS /e /XD Backup wwwroot

  這一段加到發佈命令前,在發佈以前,對當前的發佈文件備份app

 二、回滾

  首先咱們須要添加一些構建參數svn

  是否回滾this

   再添加一個選擇備份的下拉框,因爲須要動態獲取備份文件夾的名字,須要藉助一些插件來實現spa

   添加Active Choices Plug-in插件,而後添加Active Choices參數插件

 

 

//備份目錄
def folder = "D:\\LastOne\\PcApi\\Backup";
def baseDir = new File(folder);
def result = [];
files = baseDir.listFiles();
files.each{ x -> 
                result.add(x.getName())
            }
return result;

  效果以下圖3d

  接下來就是回滾了,其實跟備份相似,將以前備份的文件複製到發佈目錄便可日誌

  對於dotnetcore來講,用發佈文件更容易,因此備份文件替換爲源碼code

  另外,備份文件只想保留最近的10次,因此在每次備份完成後判斷備份數量,刪除最先的備份,這裏再繼續用批處理文件寫比較麻煩,能夠改用本身熟悉的語言,這裏我選擇了Python,寫起來容易些orm

  目錄結構以下

 

 

   main.py 入口

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import publish_backup
import backup_rollback
import argparse

#定義參數
parser = argparse.ArgumentParser(description='manual to this script')
#發佈文件夾路徑
parser.add_argument('-p', '--publish_folder', type=str, default=None)
#備份文件數量
parser.add_argument('-c', '--folder_count', type=int, default=10)
#回滾版本
parser.add_argument('-v', '--version_no', type=str, default=None)
#是否回滾 1回滾
parser.add_argument('-i', '--is_rollback', type=int, default=0)
#jenkins 獲取代碼目錄 工做目錄
parser.add_argument('-w', '--workspace', type=str, default=None)
#發佈命令
parser.add_argument('-command', '--publish_command', type=str, default=None)
args = parser.parse_args()
if args.is_rollback == 1:
    print("正在回滾")
    backup_rollback.rollback(
        args.publish_folder, args.version_no, args.publish_command)
else:
    print("正在發佈")
    publish_backup.backup(args.publish_folder,
                          args.folder_count, args.workspace, args.publish_command)
print("結束")

  publish_backup.py 備份發佈

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
import shutil
import argparse
import datetime

#備份發佈
def backup(publish_folder, folder_count, workspace, publish_command):
    backup_path = os.path.join(publish_folder, 'Backup')
    print(backup_path)
    folder_name = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    # 不存在備份目錄建立
    if not os.path.exists(backup_path):
        os.makedirs(backup_path)
    shutil.copytree(workspace, os.path.join(backup_path, folder_name),
                    ignore=shutil.ignore_patterns(publish_folder, ".svn", "bin", "obj"))
    # 獲取文件夾個數
    count = 0
    file_name_list = []
    for file_name in os.listdir(backup_path):
        count = count+1
        file_name_list.append(
            datetime.datetime.strptime(file_name, '%Y%m%d%H%M%S'))
    # 超過folder_count個,則刪除最先的備份
    if count > folder_count:
        shutil.rmtree(os.path.join(backup_path, min(
            file_name_list).strftime('%Y%m%d%H%M%S')), ignore_errors=True)
    print('備份完成')
    # 發佈
    os.system('D:')
    os.system('cd "' + workspace + '"')
    if os.system(publish_command) == 0:
        print('發佈完成')

  backup_rollback.py 回滾

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os


def rollback(publish_folder, version_no, publish_command):
    os.system('D:')
    os.system('cd "{}"'.format(os.path.join(
        publish_folder, 'Backup', version_no)))
    if os.system(publish_command) == 0:
        print('回滾完成')

 最後在批處理命令中運行python便可

D:\Python\python.exe D:\Python\Project\publish_netcore\main.py -p D:\LastOne\PcApi -v %BackupVersion% -i %IsRollBack% -w "%WORKSPACE%" -command "dotnet publish LastOne.sln -c Debug /p:PublishProfile=PcApiTest.pubxml /p:Password=111111 /p:AllowUntrustedCertificate=True"
相關文章
相關標籤/搜索