1. 程式人生 > >我的版本釋出控制指令碼

我的版本釋出控制指令碼

#author: hjjdebug
#date: 2018年 11月 29日
#我的版本釋出控制指令碼, 用到了bash 及 awk
#功能:
#第1,獲取釋出版本主版本號,次版本號,對應的svn版本號及打包的檔名稱
#     可以檢查實際的svn號與釋出的期望svn號是否一致
#     若版本不一致,給出提示資訊,退出, 可防止人為錯誤
#第2, 利用here文件,生成zero.txt, ma.conf 檔案
#第3, 自動更新version.txt
#第4, 打包檔案
#第5,拷貝目標檔案到U盤, 若未插U盤,給出紅色警告提示.
#第6,copy 成功後,umount U盤,並給出成功提示資訊,錯誤用紅色字提示原因
#使用:
#請先編輯releaseV.txt, 只使用它的最後一行
#知識:
#    用awk 分解列,提供給shell變數使用.
#    用read 從程序中讀,可一次獲取多個變數
#    src 是重新格式化後的打包源字串

#!/bin/bash

# here doc
function CreateZeroTxt()
{
    cat <<-EOF > zero.txt
    0,0,0,769,
EOF
}

function CreateMaConf()
{
    cat <<-EOF > ma.conf
    #automatically created, DO NOT EDIT!
    #language english chinese
    language: chinese

    #lcd resolution 1024_768, 800_480
    resolution: 800_480

    #通訊口,該行要求不能有空格
    devCom:/dev/ttymxc2

    #printer port
    devPrinter: /dev/ttymxc1

    #the drive process name
    driveProcess: ./modbusmaster

    # whether use startup login window ? 0->no,  1->yes ,2->other
    startupLogin: 1

    serverAddr:192.168.1.136

    # watchdog timeout (s) my(7), sys(30)
    watchdogTime: 30

    # 網路客戶端更新時間3s
    netTime: 3

    # admin timeout (s), my (2分鐘->120s), sys(30min -> 1800s)
    adminTime: 1800

    #檢查電源的次數 my(1), sys(30)
    #由於機制不同, 800_480 1為1秒, 1024_768 1相當於2-3秒
    powerCheckTimes: 30
    EOF
}
function getRealSvn()
{
    cd  "../src/"
    svn info |grep -i "revision" |cut -d ' ' -f2
}

#svn 號, 主版本號, 次版本號.build號    壓縮的檔案,用空格分開
#815     6            1.11                monitorAll modbusmaster image/* zhpy_table.db zero.txt ma.conf version.txt src.qm mount.sh
# 用awk 格式化輸出
function getLastLine()
{
    tail -n 1 releaseV.txt |awk '{printf("%s %s %s ",$1,$2,$3);\
        for(i=4;i<=NF;i++)\
            {\
                printf("%s ",$i);\
            }\
            printf("\n");\
        }'
}
# 執行一個命令或者函式,將輸出結果付給變數,帶()是把列表付給陣列變數
realSvn=`getRealSvn`
echo realSvn=$realSvn

# src 將把多餘的列輸出都收集起來
# 第一個<號是重定向,第二個<號是從程序輸出讀取
read svn major minor_build src < <(getLastLine)
echo svn=$svn
echo major=$major
if [ $svn -ne $realSvn ]
then
    echo "expected svn:"$svn, "real svn:"$realSvn
    exit 1
fi
# 第一個<號是重定向,第二個<號是從程序輸出讀取
read minor build < <(echo $minor_build |awk -F"." '{print $1,$2}');
minor=`printf "%03d" $minor`
echo minor=$minor

if [ -z $build ]
then
    DST=TW_AllInOne_monitor_all.zip_V${major}.${minor}
else
    DST=TW_AllInOne_monitor_all.zip_V${major}.${minor}.${build}
    echo build=$build
fi

# 更新version.txt, $DST 存入version.txt
echo "DST="${DST}
echo ${DST} > version.txt

# 使用原始的zero.txt, ma.conf打包
# 原始zero.txt 配置為0個模組
# 原始ma.conf 配置為使用登入視窗
cp -v zero.txt zero.txt.bak
cp -v ma.conf ma.conf.bak
# 建立zero.txt, ma.conf 檔案
CreateZeroTxt
CreateMaConf
# 剔除符號表並壓縮檔案
arm-linux-gnueabihf-strip monitorAll
arm-linux-gnueabihf-strip modbusmaster
echo "zip -r $DST $src"
zip -r $DST $src

# 恢復zero.txt, ma.conf
cp -v zero.txt.bak zero.txt
cp -v ma.conf.bak ma.conf

# 向U盤copy
result=`cp $DST /media/hjj/UDISK 2>&1`
if [ $? -eq 0 ]
then
umount /media/hjj/UDISK
echo "copy & umount ok!"
else
    echo -e "\033[31m $result \033[0m"
fi