將“切換目錄、npm構建、tar打包、scp傳輸到伺服器、伺服器端解壓、伺服器端檔案解壓替換、伺服器端服務重啟”流程,整合成一個shell指令碼
#!/bin/bash ### # @Description: 前端自動釋出指令碼 # @FilePath: publish.sh ### # 獲取指令碼所在目錄 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" # 獲取指令碼所在目錄的上一級目錄 PARENT_DIR="$(dirname "$SCRIPT_DIR")" # 本地 tar 檔名稱 LOCAL_TAR_FILE="dist.tar" # 遠端伺服器資訊 REMOTE_USER="root" # 遠端伺服器使用者 REMOTE_HOST="" # 遠端伺服器 IP REMOTE_PORT="22" # 遠端伺服器 ssh 埠 REMOTE_PASSWORD="$1" # 遠端伺服器密碼 REMOTE_DIR="/usr/frontend/" # 遠端伺服器檔案傳輸目錄
# todo 新增執行引數檢查於確認
# 檢查打包命令是否成功的函式 check_success() { if [ $? -ne 0 ]; then echo "錯誤: $1" exit 1 fi } # 檢查 sshpass 是否存在 USE_SSHPASS=false if command -v sshpass > /dev/null 2>&1; then if [ -z "$REMOTE_PASSWORD" ]; then echo "警告: 檢測到 sshpass,但未提供密碼。將使用常規方式登入。" else USE_SSHPASS=true fi else echo "未檢測到 sshpass,使用常規的密碼提示方式。" fi # 開始打包 echo "開始打包..." npm run build > /dev/null 2>&1 check_success "前端打包失敗" # 刪除舊的 tar 檔案 rm -f $LOCAL_TAR_FILE > /dev/null 2>&1 # 生成新的 tar 檔案 tar -cvf $LOCAL_TAR_FILE dist > /dev/null 2>&1 check_success "打包 dist 目錄失敗" # 傳輸檔案到伺服器 echo "正在將檔案傳輸到伺服器..." if [ "$USE_SSHPASS" = true ]; then sshpass -p "$REMOTE_PASSWORD" scp -P $REMOTE_PORT $LOCAL_TAR_FILE $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR else scp -P $REMOTE_PORT $LOCAL_TAR_FILE $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR fi check_success "SCP 檔案傳輸失敗" # 定義在遠端伺服器上執行的指令碼內容 REMOTE_SCRIPT=$(cat << EOF #!/bin/bash cd $REMOTE_DIR if [ ! -e "$LOCAL_TAR_FILE" ]; then echo "$LOCAL_TAR_FILE 不存在" exit 1 fi tar -xvf $LOCAL_TAR_FILE > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "錯誤: $LOCAL_TAR_FILE 解壓失敗" exit 1 fi rm -rf html mv dist html # docker restart frontend_web EOF ) # 登入伺服器並執行指令碼 echo "檔案傳輸完成,正在登入伺服器並執行指令碼..." if [ "$USE_SSHPASS" = true ]; then sshpass -p "$REMOTE_PASSWORD" ssh -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_HOST" "bash -s" <<EOF $REMOTE_SCRIPT EOF else ssh -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_HOST" "bash -s" <<EOF $REMOTE_SCRIPT EOF fi check_success "遠端指令碼執行失敗" cd - > /dev/null 2>&1 || exit echo "指令碼執行完畢!"
命令列使用方式:
sh publish.sh ssh-password