博客 / 詳情

返回

# Shell+web+hook的系統構建發佈運維繫統:Lollipop(棒棒糖)

zzxia-op-super-invincible-lollipop (for short: Lollipop)

中文名:豬豬俠之運維超級無敵棒棒糖(簡稱:棒棒糖)

這是一套集環境搭建,項目構建、部署、發佈及周邊的運維工具箱,已在生產環境使用多年。適用docker集羣(k8s、swarm、docker-compose)及Web站點等項目發佈,支持灰度、擴縮容與回滾。這些工具也可以獨立使用,比如項目構建、部署發佈、Webhook server、dns修改、服務器登錄異常警報、數據庫備份歸檔與還原、表格繪製、申請與續簽(泛)域名證書等等,具體參考幫助。如果你在使用中遇到任何問題請在Issues中提出,或留下聯繫方式線下溝通,或直接加wx:zzxia_ggbond ,加好友時請註明你來自哪個平台!。

項目地址:https://gitee.com/zhf_sy/zzxia-op-super-invincible-lollipop

[toc]

1 介紹

這是一套集環境搭建,項目構建、部署、發佈及周邊的運維工具箱。適用docker集羣(k8s、swarm、docker-compose)及Web站點等項目發佈,支持灰度、擴縮容與回滾。這些工具也可以獨立使用,比如項目構建、部署發佈、Webhook server、dns修改、服務器登錄異常警報、數據庫備份歸檔與還原、表格繪製、申請與續簽(泛)域名證書等等,具體參考幫助。如果你在使用中遇到任何問題請在Issues中提出,或留下聯繫方式線下溝通,或直接加wx:zzxia_ggbond ,加好友時請註明你來自哪個平台!。

1.1 特點

  • 項目構建:可以指定構建方法、輸出方法、一鍵發佈方式等(也可以使用自帶的python鈎子程序或Jenkins等外部鈎子程序調用腳本實現自動化構建發佈)。
  • 發佈環境:支持多種docker容器編排:k8s、swarm、docker-compose(市面主流工具只支持k8s);支持多種集羣與多集羣並存;支持目錄式發佈,例如nginx等。
  • 項目發佈:可以指定發佈相關的所有參數與變量,這個參數變量可以是全局的,也可以是某一項目專有的,這裏包括但不限於服務運行參數、變量、端口、副本數、Java運行參數變量,容器變量、容器啓動命令參數,命名空間 、主機名等。只需要修改項目發佈清單就可以搞定所有項目,方便快捷(不同於一般系統那種每個項目都是一個獨立配置文件,難以批量修改,與主流helm工具大相徑庭,俗話説:不是同一個科技樹)。
  • 多環境統一配置,極大降低環境差異造成的參數差異隱患。
  • 所有微服務在同一個表格中完成配置,非常方便對比差異與增加,和主流helm使用了完全相反的實現理念。
  • 結果輸出界面美觀清晰,有表格及顏色區分,也包含耗時、進度條與郵箱手機消息通知。
  • 標準化錯誤輸出,通過錯誤消息及代碼,可以輕鬆知道問題所在。
  • shell語言,模塊化編碼,使得每個人可以輕鬆的增加自己的專屬功能。shell語言還帶來的好處是極少存在版本升級帶來的運行異常問題,也不挑Linux版本(極少功能使用Python實現)。

1.2 適用條件

  • 適用於基於微服務docker集羣架構與或nginx前端。主要提供java、node語言類別項目(其他語言項目也可以,只需添加相關語言模塊即可,這很簡單,只是構建命令不一樣而已,其他大同小異)。
  • 特別適用於的中小團隊,腳本命令使用超簡單,可以實現你想要的任意構建與發佈要求,幫助齊全,也可以把這些代碼集成到你的CI/CD中(比如Jenkins),實現標準化管理,對於大團隊也可以輕鬆嵌入到現有CI/CD系統中。
  • 從開發層面:使用不固定分支發佈代碼,使用高度可選擇的發佈項目、發佈時間、發佈參數,比如:隨意發佈某項目、某分支、跳過測試、無更新強制發佈、構建日誌與結果通知方式、開發自助等。也可以一個簡且短的命令對所有項目進行檢查更新與構建發佈。日常常規使用只需根據自己設置的默認參數構建發佈,構建發佈命令非常簡短,無需輸入命令參數。
  • 從CI/CD層面:可能很多團隊在使用Jenkins或gitlab等實現全自動構建發佈或手動選擇項目及參數進行構建與發佈,如果你在使用全自動化方式(大團隊標配),則建議你保持,無需考慮使用本項目(當然:也可以把此項目嵌入到你的流水線系統,這樣不需要自己寫發佈代碼);如果你沒有實現全自動化,而是讓開發人員在網頁上用鼠標點選項目與參數實現構建發佈,則強烈建議使用本項目。我們知道,在微服務架構下,隨便都是幾十上百,甚至幾百上千的項目,如果沒有全自動化,在網頁上點擊要發佈的項目真是折磨,這比使用本項目腳本發佈會慢很多很多,時間就是頭髮。另外:即便你在開發測試環境使用全自動化構建發佈,但在生產環境也較少使用全自動化發佈,仍然需要手動發佈或觸發發佈,那麼你嵌入此項目將是一個不錯的選擇。使用此項目,初期開發人員可能會根據過往經驗牴觸這種發佈方式,當他們用久了就會喜歡上這種發佈方式,因為這種掌控感會讓他們欲罷不能。
  • 從運維層面:通過腳本初始化環境,無需手動進行,添加新項目時,只需維護envs中的清單及相關定製化變量即可,無需大動干戈。可能有些人喜歡一個項目維護一個或幾個靜態配置文件,如果有多個項目需要修改時,就需要修改一大批文件,這會很低效,而在這裏,把所有項目參數都集中項目清單中(表格),只需要修改兩三個個配置文清單文件即可,開發人員可以自行完成構建發佈(開發測試環境),無需運維在場,構建發佈一條命令搞定,消息自動提醒,發佈態勢運維可隨時掌控,省心省力。另外shell腳本不像其他,運維人都會shell語言編程,可以根據自己的需要定製,而且這些腳本都是模塊化的,而且關鍵點都有註釋,自己修改也很容易。一切盡在掌握,這是運維人的終極追求,不是嗎?

1.3 功能

  • 環境搭建:這個對於每個公司可能會有所不同,但大同小異,自己調整或用其他方式搭建。
  • 參數初始化:初始化環境,為構建發佈做準備。
  • nginx項目配置初始化:根據參數文件初始化項目目錄、配置文件(http|https、端口、運行方式、後端端口、附加配置等),自動添加修改域名A記錄,自動申請https證書(我放在集羣外,也可以放在集羣內)
  • 項目構建:對Java、Node、Dockerfile等項目進行構建打包,提供了豐富的構建參數供選擇,比如:並行、分支、靜默、強制、測試、(代碼審查)、郵件、釘釘、微信
  • 項目發佈docker-service:提供列表、創建、刪除、回滾、更新、縮擴容、鏡像版本、狀態、明細等功能
  • 項目發佈nginx:提供項目列表、發佈上線、項目回滾
  • 項目構建發佈:一鍵構建發佈功能,提供有豐富參數選擇,但默認也是最好的選擇

1.4 喜歡她,就滿足她:

  1. 【Star】她,讓她看到你是愛她的;
  2. 【Watching】她,時刻感知她的動態;
  3. 【Fork】她,為她增加新功能,修Bug,讓她更加卡哇伊;
  4. 【Issue】她,告訴她有哪些小脾氣,她會改的,手動小綿羊;
  5. 【打賞】她,為她買jk; 打賞

2 軟件架構

2.1 代碼語言

  • Linux shell
  • Python

2.2 關係圖

2.3 功能與依賴

2.3.1 構建工具(build.sh;build-parallel.sh;gogogo.sh)

序號 類別 構建方法 輸出方法 必要軟件環境
1 product NONE NONE
2 docker_image_push docker;docker倉庫
3 Dockerfile docker_build NONE docker
4 docker_image_push docker;docker倉庫
5 Java mvn_package或gradle NONE java_jdk;maven或gradle
6 deploy_war java_jdk;maven或gradle
7 deploy_jar_to_repo java_jdk;maven或gradle;maven倉庫
8 docker_image_push java_jdk;maven或gradle;docker;docker倉庫
9 Node npm_install NONE node;npm
10 docker_image_push node;npm;docker;docker倉庫
11 npm_build direct_deploy node;npm
12 docker_image_push node;npm;docker;docker倉庫
13 自定義 自定義 自定義 自定義
gogogo.sh是自動化構建+發佈工具

2.3.2 發佈工具(docker-cluster-service-deploy.sh;web-release.sh;gogogo.sh)

序號 類別 部署類型 必要軟件環境
1 docker-cluster-service-deploy.sh swarm docker;swarm
2 k8s docker;k8s
3 docker-compose docker;docker-compose
4 web-release.sh nginx或其他web服務器 nginx或其他web服務器
5 gogogo.sh 上面所有類型(構建+發佈) build.sh;docker-cluster-service-deploy.sh;web-release.sh

2.3.3 其他工具

序號 腳本 用途 必要軟件環境
1 deploy/docker-image-search.sh 從私有docker倉庫搜索docker鏡像 docker;docker倉庫
2 deploy/docker-tag-push.sh 推送docker鏡像到私有docker倉庫 docker;docker倉庫
3 op/aliyun-dns.sh 用阿里雲dns做解析的域名修改工具 阿里雲CLI;阿里雲dns
4 tools/godaddy-dns.sh 用Godaddy dns做解析的域名修改工具 curl;godaddy
5 tools/cert-letsencrypt-wildcart.sh 在Let'sencrypt上申請泛域名證書 certbot
6 tools/send_mail.sh 發送郵件 mailx;郵件服務器賬號
7 tools/dingding_conver_to_markdown_list.sh 發送釘釘消息 python;釘釘機器人
8 tools/format_table.sh 格式化表格 awk
9 tools/draw_table.sh 嚴格格式化表格 awk
10 init/1-sshkey-copy.sh 免密登錄 sshpass
11 init/send_login_alert_msg.sh 發送用户登錄警報消息 python;釘釘機器人
12 init/send_mail_attach_my_log.sh 發送自定義日誌到郵箱 mailx;郵件服務器賬號
13 init/nginx-config/nginx-cert-letsencrypt-a.sh 在Let'sencrypt上申請A域名證書 certbot;nginx
14 init/nginx-config/nginx-root.sh 創建nginx web站點目錄
15 init/nginx-config/nginx-conf.sh 創建nginx配置文件 nginx
16 init/nginx-config/nginx-dns.sh 創建nginx站點域名A記錄 op/aliyun-dns.sh; op/godaddy-dns.sh
17 init/nginx-config/web-release-on-nginx.sh 上線或回滾nginx站點 nginx
18 init/pg/backup/pg_backup_or_restore.sh 備份pg數據庫 pg
19 init/pg/backup/pg_list_backup_or_restore.sh 備份pg數據庫指定清單 pg
20 init/webhook/ webhook前後端 python3
21 其他

3 安裝

項目運行在Linux系統之上,基本環境安裝部分是基於CentOS,如果你用的是Ubuntu,可是自行修改,或手動安裝。基本運行環境一般自行安裝,每個公司都有自己的特有要求。

3.1 服務器準備

一般配置:

服務器類別 數量 説明 例如
deploy 1 用於構建與發佈、webhook
docker集羣 1~n 根據自己需要 k8s;swarm;docker-compose
nginx 0~n 根據自己需要 放到集羣也行
db 0~n 根據自己需要 postgresql;mysql
docker倉庫 0~1 根據自己需要 docker registry
maven倉庫 0~1 根據自己需要 nexus
代碼倉庫 0~1 根據自己需要 gitalb

3.2 Deploy主機初始化

創世之初

3.2.1 安裝基礎軟件

yum install -y tmux ansible sshpass git python3-pip

3.2.2 克隆項目

克隆項目到deploy主機上,假設【home項目路徑 = ~/zzxia-om-super-invincible-lollipop】

3.3 環境配置文件

環境配置文件是後面項目初始化與運行的基礎

如果沒有特別説明,以下則皆在目錄【home項目路徑/init】下完成

3.3.1 創建專屬配置文件

基於【home項目路徑/init/envs.sample】示例創建自己的環境變量文件

cp -r  home項目路徑/init/envs.sample  home項目路徑/init/envs-MyName

請參考【README.md】修改home項目路徑/init/envs-MyName中的配置文件。如果增減了配置文件,也需要同時修改【0-init-envs.sh】腳本文件。

3.3.2 初始化配置配置文件

$ ./00-cp-【0-init-envs.sh】-to-here.sh  --help
    用法:
    sh ./00-cp-【0-init-envs.sh】-to-here.sh  [-h|--help]
    sh ./00-cp-【0-init-envs.sh】-to-here.sh  {Path-To-envs文件目錄}    #--- 拷貝envs目錄中的【0-init-envs.sh】到當前目錄
$ ./00-cp-【0-init-envs.sh】-to-here.sh  ./envs-MyName

$ ./0-init-envs.sh --help
    用法:
    sh ./0-init-envs.sh  [-h|--help]
    sh ./0-init-envs.sh  [-r|--rm]            #--- 刪除項目環境文件
    sh ./0-init-envs.sh  [-c|--copy {環境名稱}]  <-f|--from {Path-To-envs文件目錄}>    #--- 拷貝envs目錄中以【---環境名稱】結尾的文件到指定路徑,比如:【prod|stag|dev|其他任意名稱】
$ ./0-init-envs.sh  -c dev  -f ./envs-MyName

3.4 SSH登錄配置

如果沒有特別説明,以下則皆在目錄【home項目路徑/init】下完成

3.4.1 登錄跳過RSA key"yes/no"驗證,會話保持

修改配置文件/etc/ssh/ssh_config

    StrictHostKeyChecking no
    ServerAliveInterval 60

3.4.2 生成sshkey用於免密登錄

ssh-keygen -C '便於識別的名字'

3.4.3 免密登錄

$ ./1-sshkey-copy.sh --help
用法:./1-sshkey-copy.sh  [用户]  [密碼]  [主機列表文件]

$ ./1-sshkey-copy.sh  [用户]  [密碼]  host-ip.list

3.5 為了減少異常發生,你可能需要關掉一些麻煩

關閉防火牆,略 關閉selinux,略

3.6 安裝base軟件環境

如果沒有特別説明,以下則皆在目錄【home項目路徑/init】下完成

# java、mvn、node(根據需要安裝)
./install-build-envs.sh
# hosts(一般不需要)
ansible-playbook  install-hosts.yml
# 一般必須
ansible-playbook  install-base.yml
ansible-playbook  install-config-base.yml
# reboot 重新裝載變量RUN_ENV
ansible all --become -m shell -a "reboot"

3.7 密碼配置文件

密碼配置文件是後面項目運行的基礎,這些一般不要保存在倉庫中,請放在隱秘的角落,就像小電影一樣。

這些文件都會在構建或發佈的時候被env.sh引入。

如果沒有特別説明,以下則皆在目錄【home項目路徑/init】下完成

3.7.1創建專屬密碼配置文件

基於【home項目路徑/init/my_sec_envs.sample】示例創建自己的密碼配置文件

cp -r  home項目路徑/init/my_sec_envs.sample  home項目路徑/init/my_sec_envs-MyName

請參考【README.md】修改home項目路徑/init/my_sec-MyName中的配置文件。如果增減了配置文件,也需要同時修改【install-config-my_sec_envs.yml】ansible-playbook文件。

3.7.2 部署密碼配置文件

ansible-playbook  install-config-my_sec_envs.yml

3.8 其他周邊軟件

這些軟件不是必須的,請根據自己的需要選擇安裝,也可以自己用其他方式安裝

# docker相關
ansible-playbook  install-docker.yml
ansible-playbook  install-config-docker.yml

# docker倉庫,你可能用的是harbor
ansible-playbook  install-docker_registry.yml
ansible-playbook  install-config-docker_registry.yml

# maven倉庫、npm倉庫
ansible-playbook  install-nexus.yml

# postgresql
ansible-playbook  install-pg.yml
ansible-playbook  install-config-pg.yml

# nginx相關
ansible-playbook  install-nginx.yml
ansible-playbook  install-config-nginx.yml

# 證書相關
ansible-playbook install-certbot.yml
ansible-playbook install-config-certbot.yml

# 其他略
# 根據自己需要安裝

3.9 安裝集羣

請自行安裝(k8s或swarm或docker-compose)

支持多種集羣並行運行,也支持多命名空間或網絡空間

4 配置

【安裝】環節對【環境配置文件】只是簡單帶過,其實這是非常關鍵的一環,所以在這裏對主要配置進行詳細説明

所有的説明都寫在註釋裏或者表頭裏,請一定仔細研讀

文件位置:【home項目路徑/init/envs.sample】

4.1 【env.sh---dev】

【home項目路徑/init/envs.sample/env.sh---dev】

#!/bin/bash

# 0  基本

LOLLIPOP_PLATFORM_NAME="超甜B&D系統"    #--- 給本構建發佈系統取個名字
BUILD_LOG_WEBSITE_DOMAIN_A="build-log"    #--- 這個需要與【nginx.list】中【項目名】為【build-log】的【域名A記錄】保持一致,一般無需更改此項
ERROR_EXIT='NO'                    #--- 出錯立即退出,YES|NO

# DEBUG 模式
DEBUG='YES'                         #--- YES|NO,如果設置DEBUG='YES',則將容器所有內部端口publish出來,一般用於【dev】環境
# Debug模式容器隨機端口範圍
DEBUG_RANDOM_PORT_MIN=45000        #--- 最小
DEBUG_RANDOM_PORT_MAX=49999        #--- 最大

# 根據需要選擇【npm|cnpm】
NPM_BIN='npm'

# 1  Build

## 倉庫及分支
export GIT_REPO_URL_BASE="git@g.zjlh.lan:gc"
#export GIT_REPO_URL_BASE="https://g.zjlh.lan/gc"
export GIT_BRANCH='develop'

## 跳過測試
export BUILD_SKIP_TEST='NO'    #--- YES|NO

# 2  Docker集羣相關

##  運行方式
# fuck    : 直接執行命令;.
# notfuck : 打印命令到屏幕,自行拷貝執行
export FUCK='notfuck'

##  集羣類型

## ----------------------------------------
## A  swarm.

### 遠程管理
#export SWARM_DOCKER_HOST="ssh://root@192.168.11.141:2222"
export SWARM_DOCKER_HOST="tcp://192.168.11.71:2375"

### 基本運行參數
#### 網絡
export SWARM_DEFAULT_NETWORK='onet_1'         #--- 默認值,可以在服務清單中指定其他

### docker log driver
export DOCKER_LOG_DRIVER='json-file'
#export DOCKER_LOG_DRIVER='fluentd'

#### Json file
export JSON_LOG_MAX_FILE_SIZES="100m"
export JSON_LOG_MAX_FILES=5

#### Fluentd
#export FLUENTD_SERVER_ADDR="192.168.11.83"
#export FLUENTD_SERVER_PORT="24224"

## ----------------------------------------
## B  k8s

export K8S_NAMESAPCE='default'                       #--- 默認值,可以在服務清單中指定其他
export DOCKER_REPO_SECRET_NAME='my-docker-repo-pw'   #--- 請自行創建相關secret

## ----------------------------------------
## C  docker-compose

### 網絡
export NETWORK_COMPOSE='net_gc'

## ----------------------------------------

# 3 Build 與 Docker

## 密碼相關 ( *** 存放在【~/.my_sec/*.sec/*.sec】下的文件皆包含密碼,不推薦保存到代碼倉庫 *** )
for FILE in $(find  "${HOME}/.my_sec"  -type f  -name '*.sec')
do
    . ${FILE}
done

## Container env(自定義希望注入到docker容器的環境變量)
export CONTAINER_ENVS_PUB_FILE="${HOME}/.my_sec/container-envs-pub.sec"

##############################################################
#
# 以下部分不需要修改
#
# 0 組裝日誌
# https://docs.docker.com/config/containers/logging/configure/
export DOCKER_LOG_PUB="--log-driver=json-file  --log-opt max-size=${JSON_LOG_MAX_FILE_SIZES:-100m}  --log-opt max-file=${JSON_LOG_MAX_FILES:-5}  --log-opt labels=\${SERVICE_NAME}"
#
case "${DOCKER_LOG_DRIVER}" in
    gelf)
        export DOCKER_LOG_PUB="--log-driver=gelf  --log-opt gelf-address=udp://${GELF_SERVER_ADDR}:${GELF_SERVER_PORT:-12201}  --log-opt tag=\${SERVICE_NAME}"
        ;;
    fluentd)
        export DOCKER_LOG_PUB="--log-driver=fluentd  --log-opt fluentd-address=udp://${FLUENTD_SERVER_ADDR}:${FLUENTD_SERVER_PORT:-24224}  --log-opt tag=\${SERVICE_NAME}"
        ;;
    json-file)
        export DOCKER_LOG_PUB="--log-driver=json-file  --log-opt max-size=${JSON_LOG_MAX_FILE_SIZES:-100m}  --log-opt max-file=${JSON_LOG_MAX_FILES:-5}  --log-opt labels=\${SERVICE_NAME}"
        ;;
    *)
        export DOCKER_LOG_PUB="--log-driver=json-file  --log-opt max-size=${JSON_LOG_MAX_FILE_SIZES:-100m}  --log-opt max-file=${JSON_LOG_MAX_FILES:-5}  --log-opt labels=\${SERVICE_NAME}"
        ;;
esac

4.2 【project.list】

這個是build.sh及gogogo.sh的關鍵配置文件

【home項目路徑/init/envs.sample/project.list】

## 項目清單
###
### 2【類別:LANGUAGE_CATEGORY】= [ product|dockerfile|java|node|自定義 ]
###   1 product   :成品
###   2 dockerfile:Dockerfile
###   3 java      :Java
###   4 node      :Node
###
### 3【項目名:PJ】= [自定義名稱]
###
### 4【構建方法:BUILD_METHOD】= [ NONE | docker_build | java:[mvn_package|gradle|自定義] | node:[original|build|自定義] ]
###   0 類別='*'          : NONE             : 跳過構建,用【gogogo.sh】時,也會跳過發佈
###   1 類別='product'    : NONE             : 跳過構建,成品無需構建
###   2 類別='dockerfile' : docker_build     : 即docker build
###   3 類別='java'       : mvn_package      : 即mvn package
###                       : mvn_deploy       : 即mvn deploy
###                       : gradle           : 即gradle ......(沒搞)
###   4 類別='node'       : npm_install      : npm install
###                       : npm_build        : npm install && npm build
###
### 5【輸出方法:OUTPUT_METHOD】= [ dockerfile:[docker_image_push|NONE] | java:[deploy_war|deploy_jar_to_repo|docker_image_push|NONE] | node:[direct_deploy|docker_image_push|NONE] ]
###   1 類別='product'    : docker_image_push    : 僅用於推送docker鏡像到docker倉庫
###   2 類別='dockerfile' : docker_image_push    : 推送docker鏡像到倉庫
###                       : NONE                 : 無需輸出
###   3 類別='java'       : deploy_war           : 輸出war包(沒搞)
###                       : deploy_jar_to_repo   : 推送jar包到maven倉庫
###                       : docker_image_push    : 推送docker鏡像到倉庫
###                       : NONE                 : 無需輸出,比如已經deploy到倉庫等
###   4 類別='node'       : direct_deploy        : 拷貝輸出文件到nginx_real服務器
###                       : docker_image_push    : 推送docker_image_push鏡像到倉庫
###                       : NONE                 : 無需輸出,一般用於前端公共組件項目,供其他項目鏈接用
###
### 6【鏡像名:DOCKER_IMAGE_NAME】= [自定義名稱]
###   當輸出方法='docker_image_push'時,鏡像名不能為空
###
### 7【鏈接node_project:LINK_NODE_PROJECT】= [node_module來源項目名稱]
###   將此node項目中的node_module軟鏈接到當前項目,用以避免重複編碼與重複下載node_module
###
### 8【GOGOGO發佈方式:GOGOGO_RELEASE_METHOD】= [ NONE | docker_cluster | web_release | 自定義 ]
###   注:用【gogogo.sh】腳本自動構建與發佈時使用的參數
###   1 NONE            : 無需發佈
###   2 docker_cluster  : 用【docker-cluster-service-deploy.sh】發佈
###   3 web_release     : 用【web-release.sh】發佈
###
### 9【優先級:PRIORITY】= [ 數字 ]
###   數字越小越優先
###
###   ***** 以上種種,都可以自己定義,然後調整相關腳本即可 *****
###
#| LANGUAGE_CATEGORY | PJ                    | BUILD_METHOD | OUTPUT_METHOD     | DOCKER_IMAGE_NAME              | LINK_NODE_PROJECT    |GOGOGO_RELEASE_METHOD | PRIORITY |
#| **類別** | **項目名**                     | **構建方法** | **輸出方法**      | **鏡像名**                     | **鏈接node_project** | **GOGOGO發佈方式** | **優先級** |
#| -------- | ------------------------------ | ------------ | ----------------- | ------------------------------ | -------------------- | ------------------ | ---------- |
| product   | neo4j                          | NONE         | docker_image_push | neo4j                          |                      | docker_cluster     | 0          |
| product   | fluentd                        | NONE         | docker_image_push | fluentd-gcl                    |                      | docker_cluster     | 0          |
| dockerfile| my-oracle-java-8               | docker_build | docker_image_push | my-oracle-java-8               |                      | NONE               | 1          |
| java      | gc-common                      | mvn_deploy   | NONE              |                                |                      | NONE               | 5          |
| java      | gc-gray                        | mvn_deploy   | NONE              |                                |                      | NONE               | 5          |
| java      | gc-auth-service                | mvn_package  | docker_image_push | gc-auth-service                |                      | docker_cluster     | 10         |
| java      | gc-monitor                     | mvn_package  | docker_image_push | gc-monitor                     |                      | docker_cluster     | 20         |
| node      | gc-common-front                | npm_install  | NONE              |                                |                      | NONE               | 100        |
| node      | gc-platform-node               | npm_install  | docker_image_push | gc-platform-node               |                      | docker_cluster     | 110        |
| node      | gc-agent-front                 | npm_build    | direct_deploy     |                                | gc-common-front      | web_release        | 110        |
| node      | gc-fastprotect-front           | npm_build    | direct_deploy     |                                |                      | web_release        | 110        |
| product   | nacos-server                   | NONE         | docker_image_push | nacos-server                   |                      | docker_cluster     | 0          |

4.3 【docker-cluster-service.list---dev、docker-cluster-service.list。append.1---dev、docker-cluster-service.list.append.2---dev】

這個是發佈docker服務時的關鍵文件,這裏可以實現較為複雜的部署要求,也可以根據需要增加列以實現更為複雜的需求

  • 【home項目路徑/init/envs.sample/docker-cluster-service.list---dev】
###  4【POD副本數:POD_REPLICAS】= [ 數字|${變量名} ]
###    1 數字          : 例如:2
###    2 ${變量名}     : 例如:【${SERVICE_NAME}】
###
###  5【容器PORTS:CONTAINER_PORTS】= [ 外部端口號1:內部端口號2, 外部端口號3:內部端口號4, ...... , ${變量名} ]
###    若有多個,則用【,】分隔
###    示例:【17474:7474】
###          【${xName}:7474】
###          【27474:7474,7687:7687】
###
###  6【優先級:PRIORITY】= [ 數字 ]
###    數字越小越優先
###
###  7【備註:NOTE】= [ 自定義 ]
###    説明信息
###
###
### A.1 更多擴展項,請在文件【docker-cluster-service.list.append.1】中添加
###    3 集羣
###    4 主機名
###    5 部署位置
###
###
### A.2 更多擴展項,請在文件【docker-cluster-service.list.append.2】中添加
###    3 JAVA選項
###    4 容器ENVS
###    5 容器CMDS
###
###
###   ***** 以上種種,都可以自己定義,然後調整相關腳本即可 *****
###
###   ***** 上文提到的變量名可以是下文表頭的名字、也可以是sh中可以獲得的變量名 *****
###
#| SERVICE_NAME           | DOCKER_IMAGE_NAME       | POD_REPLICAS  | CONTAINER_PORTS    | PRIORITY   | NOTE                         |
#| **服務名**             | **DOCKER鏡像名**        | **POD副本數** | **容器PORTS**      | **優先級** | **備註**                     |
#| ---------------------- | ----------------------- | ------------: | ------------------ | ---------- | ---------------------------- |
|neo4j-srv                |neo4j                    | 1             | 7474:7474,7687:7687| 0          |                              |
|redis-srv                |redis                    | 1             | 6379:6379          | 0          |                              |
|nacos-server-1           |nacos-server             | 1             | 8848:8848,9848:9848,9555:9555| 0|                              |
|nacos-server-2           |nacos-server             | 1             | :8848,:9848,:9555  | 20         |                              |
|nacos-server-3           |nacos-server             | 1             | :8848,:9848,:9555  | 20         |                              |
|gc-gateway               |gc-gateway               | 1             | 13000:13000        | 15         |                              |
|gc-monitor               |gc-monitor               | 1             | :13030             | 20         |                              |
|gc-client-service        |gc-client-service        | 1             | :23000             | 20         |                              |
|gc-client-app-service    |gc-client-app-service    | 1             | :23100             | 20         |                              |
|gc-travel-service        |gc-travel-service        | 1             | :20201             | 20         |                              |
  • 【home項目路徑/init/envs.sample/docker-cluster-service.list.append.1---dev】
###  ---------------------------------------------------------------------------------------
###.
###  2【服務名:SERVICE_NAME】= [ 自定義名稱 ].
###
###  3【集羣:CLUSTER】= [ swarm|k8s|compose|自定義 ]
###    1 swarm       : swarm
###    2 k8s         : k8s
###    3 compose     : docker-compose
###
###  4【主機名:HOST_NAME】= [ 自定義 ]
###    須符合主機名稱規範
###
###  5【部署位置:DEPLOY_PLACEMENT】= [ NET:網絡 , L:label鍵值對 | NS:命名空間, L:label鍵值對 | SSH:<用户@>主機名或IP <-p ssh端口> ]
###    1 集羣='swarm'      : NET:網絡, L:label鍵值對             : NET 即network,默認在env.sh---*中定義,這裏可以省略
###                                                              : L 即Label,指定標籤,可以有多個,代表服務部署到這個標籤主機節點,可以不指定
###    2 集羣='k8s'        : NS:命名空間, L:label鍵值對          : NS 即k8s命名空間,默認在env.sh---*中定義,這裏可以省略
###                                                              : L 同上,即Label,指定標籤,可以有多個,代表服務部署到這個標籤主機節點,可以不指定
###    3 集羣='compose'    : SSH:<用户@>主機名或IP <-p ssh端口>  : 需要ssh到目標節點實現免密碼登錄,【用户名】及【ssh端口】可以省略
###    若有多個參數,則用【,】分隔
###    示例:【L:node=worker_node_2】
###          【NET:net1, L:node=worker, L:aa=bbb】
###          【NET:net1】
###          【NS:demo_space, L:node=worker, L:aa=bbb】
###          【NS:demo_space】
###          【SSH:root@192.168.11.77 -p 22】
###          【SSH:192.168.11.77】
###
###
###   ***** 以上種種,都可以自己定義,然後調整相關腳本即可 *****
###
###   ***** 上文提到的變量名可以是下文表頭的名字、也可以是sh中可以獲得的變量名 *****
###
#| SERVICE_NAME           | CLUSTER  | HOST_NAME     | DEPLOY_PLACEMENT                                           |
#| **服務名**             | **集羣** | **主機名**    | **部署位置**                                               |
#| ---------------------- | -------- | ------------- | ---------------------------------------------------------- |
|neo4j-srv                | swarm    |               |                                                            |
|redis-srv                | swarm    |               |                                                            |
|nacos-server-1           | swarm    |nacos-server-a |                                                            |
|nacos-server-2           | swarm    |nacos-server-b |                                                            |
|nacos-server-3           | swarm    |nacos-server-c |                                                            |
|gc-gateway               | swarm    |               |                                                            |
|gc-monitor               | swarm    |               |                                                            |
|gc-client-service        | k8s      |               |                                                            |
|gc-client-app-service    | compose  |               | SSH:192.168.11.77                                          |
|gc-travel-service        | k8s      |               |                                                            |
  • 【home項目路徑/init/envs.sample/docker-cluster-service.list.append.2---dev】
## docker cluster 服務部署清單擴展
###
### 此文件【docker-cluster-service.list.append.2】是【docker-cluster-service.list】的擴展,請確保兩個文件的【服務名】相匹配,否則無效,如果某服務不需要擴展項,則可以刪除該行
###
###.
###  ---------------------------------------------------------------------------------------
###.
###  2【服務名:SERVICE_NAME】= [ 自定義名稱 ].
###    確保與【docker-cluster-service.list】中的【服務名】相匹配,否則無效
###.
###  3【JAVA選項:JAVA_OPTIONS】= [ Java參數1 , Java參數2, Java參數n, JAVA_OPT_FROM_FILE="/path/to/filename" ]
###    如果有多個,則用【,】號分隔,例如:【-Dencoding=UTF-8,-Dfile=${FILE},JAVA_OPT_FROM_FILE="/path/to/filename"】
###    -  指定為具體參數,例如:【-Dencoding=UTF-8】
###    -  指定變量參數,例如:【-Dfile=${FILE}】
###    -  指定從文件獲取,參數名需指定為【JAVA_OPT_FROM_FILE】,例如:【JAVA_OPT_FROM_FILE="/path/to/filename"】,建議放在【init/my_spec_envs/】目錄下,用git管理
###.
###  4【容器ENVS:CONTAINER_ENVS】= [ 變量1=值1, 變量2=值2, 變量n=值n, ENVS_FROM_FILE="/path/to/filename"]
###    如果有多個,則用【,】號分隔,例如:【aa=1,bb=2,NEO4J_AUTH=${NEO4J_USER}/${NEO4J_PASSWORD},ENVS_FROM_FILE="/path/to/filename"】
###    - 指定為具體參數,例如:【aa=1,bb=2】
###    - 指定變量參數,例如:【NEO4J_AUTH=${NEO4J_USER}/${NEO4J_PASSWORD}】
###    - 指定從文件獲取,參數名需指定為【ENVS_FROM_FILE】,例如【ENVS_FROM_FILE="/path/to/filename"】,建議放在【init/my_spec_envs/】目錄下,用git管理
###.
###  5【容器CMDS:CONTAINER_CMDS】= [ 命令參數2, 命令參數n, CMDS_FROM_FILE="/path/to/filename" ]
###    如果有多個,則用【,】號分隔,例如:【--quiet,--requirepass "${REDIS_PASSWORD}",CMDS_FROM_FILE="/path/to/filename"】
###    - 指定為具體參數,例如:【--quiet】
###    - 指定變量參數,例如:【--requirepass "${REDIS_PASSWORD}"】
###    - 指定從文件獲取,參數名需指定為【CMDS_FROM_FILE】,例如【CMDS_FROM_FILE="/path/to/filename"】,建議放在【init/my_spec_envs/】目錄下,用git管理
###.
###
###   ***** 以上種種,都可以自己定義,然後調整相關腳本即可 *****
###
###   ***** 上文提到的變量名可以是下文表頭的名字、也可以是sh中可以獲得的變量名 *****
###
#| SERVICE_NAME           | JAVA_OPTIONS                      | CONTAINER_ENVS                                             | CONTAINER_CMDS                    |
#| **服務名**             | **JAVA選項**                      | **容器ENVS**                                               | **容器CMDS**                      |
#| ---------------------- | --------------------------------- | ---------------------------------------------------------- | --------------------------------- |
|neo4j-srv                |                                   | NEO4J_AUTH="${NEO4J_USER}/${NEO4J_PASSWORD}"               |                                   |
|redis-srv                |                                   |                                                            |--requirepass "${REDIS_PASSWORD}"  |
|nacos-server-1           |                                   | ENVS_FROM_FILE=../init/my_spec_envs/nacos.env                   |                                   |
|nacos-server-2           |                                   | ENVS_FROM_FILE=../init/my_spec_envs/nacos.env                   |                                   |
|nacos-server-3           |                                   | ENVS_FROM_FILE=../init/my_spec_envs/nacos.env                   |                                   |
|gc-gateway               | -Xms512m -Xmx512m                 |                                                            |                                   |
|gc-monitor               | -Xms512m -Xmx512m                 |                                                            |                                   |
|gc-client-service        | -Xms512m -Xmx512m                 |                                                            |                                   |
|gc-client-app-service    | -Xms512m -Xmx512m                 |                                                            |                                   |
|gc-travel-service        | -Xms512m -Xmx512m                 |                                                            |                                   |

4.4 【nginx.list---dev】

這個是發佈web服務時的關鍵文件,也是生成nginx配置文件、自動生成域A記錄的關鍵配置文件

【home項目路徑/init/envs.sample/nginx.list---dev】

## nginx網站配置清單
###
###  2【項目名:PJ】= [ 自定義名稱 ]
###
###  3【域名A記錄:DOMAIN_A】= [ 自定義名稱 ]
###    不要加域名後綴,部署時根據運行環境自動添加
###
###  4【http端口:FRONT_HTTP_PORT】= [ 端口號 ]
###    運行在http下時的端口號
###
###  5【https端口:FRONT_HTTPS_PORT】= [ 端口號 ]
###    運行在https下時的端口號
###
###  6【方式:MODE】= [ realserver|realserver ]
###    1 realserver      : 作為real server
###    2 proxyserver     : 作為代理服務器,必須要有【後端協議端口】參數
###
###  7【後端協議端口:BACKEND_PROTOCOL_PORT】= [ 協議:端口號 ]
###    協議 = [ http | https ]
###
###  8【附加項:ITEMS】= [auth_basic,autoindex,upload_size=100m,try_files]中的一個或多個,用【,】分隔
###    1 auth_basic           : 添加驗證;
###    2 autoindex            : 目錄瀏覽;
###    3 upload_size=100m     : 文件上傳大小;
###    4 try_files            : try_files $uri $uri/ /index.html;
###
###  9【域名A記錄IP:DOMAIN_IPS】= [ IP地址1,IP地址2,IP地址n ]
###    域名A記錄指向的IP地址,如果有多個,則用【,】分隔
###
### 10【優先級:PRIORITY】= [ 數字 ]
###   數字越小越優先
###
###   ***** 以上種種,都可以自己定義,然後調整相關腳本即可 *****
###
#| PJ                           | DOMAIN_A            |FRONT_HTTP_PORT|FRONT_HTTPS_PORT| MODE      |BACKEND_PROTOCOL_PORT| ITEMS             |  DOMAIN_IPS     | PRIORITY   |
#| **項目名**                   | **域名A記錄**       | **http端口** | **https端口** | **方式**    | **後端協議端口** | **附加項**           | **域名A記錄IP** | **優先級** |
#| ---------------------------- | ------------------- | ------------ | ------------- | ----------- | ---------------- | -------------------- | --------------- | ---------- |
| build-log                     | build-log           | 80           | 443           | realserver  |                  | auth_basic,autoindex | 192.168.11.77   | 5          |
| log                           | log                 | 80           | 443           | proxyserver | http:5601        | auth_basic           | 192.168.11.77   | 5          |
| gc-platform-node              | bmp-platform-node   | 80           | 443           | proxyserver | http:41300       |                      | 192.168.11.77   | 5          |
| gc-client-mobile-h5-front     | app-client-h5       | 80           | 443           | realserver  |                  | try_files            | 192.168.11.77   | 5          |
| gc-client-app-service         | app-client-public   | 80           | 443           | proxyserver | http:23100       | upload_size=50m      | 192.168.11.77   | 5          |

5 使用

5.1 使用説明

請使用-h|--help參數運行sh腳本即可看到使用説明。

所有幫助裏面都包含以下部分:

用途:......
依賴:......
注意:......
用法:......
參數説明:
    $0   : 代表腳本本身
    []   : 代表是必選項
    <>   : 代表是可選項
    |    : 代表左右選其一
    {}   : 代表參數值,請替換為具體參數值
    %    : 代表通配符,非精確值,可以被包含
    正則  :正則匹配
    完全正則:完全正則匹配
示例:......

相信你可以根據幫助迅速上手

5.2 項目構建

5.2.1 一般構建

幫助信息如下:

$ ./deploy/build.sh --help

    用途:用於項目構建,生成docker鏡像並push到倉庫
    依賴:
        /etc/profile.d/zzxia-op-super-invincible-lollipop.run-env.sh
        /root/deploy-bmp/deploy/env.sh
        /root/deploy-bmp/deploy/project.list
        /root/deploy-bmp/deploy/../tools/send_mail.sh
        /root/deploy-bmp/deploy/docker-tag-push.sh
        /root/deploy-bmp/deploy/../tools/format_table.sh
        /root/deploy-bmp/deploy/../tools/dingding_conver_to_markdown_list-deploy.sh
    注意:
        * 名稱正則表達式完全匹配,會自動在正則表達式的頭尾加上【^ $】,請規避
        * 輸入命令時,參數順序不分先後
    用法:
        ./build.sh  [-h|--help]
        ./build.sh  [-l|--list]
        ./build.sh  <-M|--mode [normal|function]>  <-c|--category [dockerfile|java|node|自定義]>  <-b|--branch {代碼分支}>  <-e|--email {郵件地址}>  <-s|--skiptest>  <-f|--force>  <-v|--verbose>  <{項目1}  {項目2} ... {項目n} ... {項目名稱正則表達式完全匹配}>
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help      此幫助
        -l|--list      列出可構建的項目清單
        -M|--mode      指定構建方式,二選一【normal|function】,默認為normal方式。此參數用於被外部調用
        -c|--category  指定構建項目語言類別:【dockerfile|java|node|自定義】,參考:/root/deploy-bmp/deploy/project.list
        -b|--branch    指定代碼分支,默認來自env.sh
        -e|--email     發送日誌到指定郵件地址,如果與【-U|--user-name】同時存在,則將會被替代
        -s|--skiptest  跳過測試,默認來自env.sh
        -f|--force     強制重新構建(無論是否有更新)
        -v|--verbose   顯示更多過程信息
    示例:
        #
        ./build.sh  -l         #--- 列出可構建的項目清單
        #
        ./build.sh                              #--- 構建所有項目,用默認分支
        ./build.sh  -b 分支a                    #--- 構建所有項目,用分支a
        ./build.sh  -b 分支a  項目1  項目2      #--- 構建項目:【項目1、項目2】,用【分支a】
        ./build.sh            項目1  項目2      #--- 構建項目:【項目1、項目2】,用默認分支
        # 按類別
        ./build.sh  -c java                           #--- 構建所有java項目,用默認分支
        ./build.sh  -c java  -b 分支a                 #--- 構建所有java項目,用【分支a】
        ./build.sh  -c java  -b 分支a  項目1  項目2   #--- 構建node項目:【項目1、項目2】,用【分支a】
        ./build.sh  -c java            項目1  項目2   #--- 構建node項目:【項目1、項目2】,用默認分支
        # 項目名稱用正則表達式完全匹配
        ./build.sh   .*xxx.*        #--- 構建項目名稱正則匹配【^.*xxx.*】的項目,用默認分支
        ./build.sh   [ab]*xxx       #--- 構建項目名稱正則匹配【^[ab]*xxx$】的項目,用默認分支
        ./build.sh   sss.*eee       #--- 構建項目名稱正則匹配【^sss.*eee$】的項目,用默認分支
        ./build.sh   sss.*          #--- 構建項目名稱正則匹配【^sss.*$】的項目,用默認分支
        # 發郵件
        ./build.sh  --email xm@xxx.com                #--- 構建所有項目,用默認分支,將錯誤日誌發送到郵箱【xm@xxx.com】
        ./build.sh  --email xm@xxx.com  項目1  項目2  #--- 構建項目:【項目1、項目2】,用默認分支,將錯誤日誌發送到郵箱【xm@xxx.com】
        # 測試
        ./build.sh  -b 分支a  -s  項目1  項目2        #--- 構建項目:【項目1、項目2】,用【分支a】,跳過測試
        # 強制重新構建
        ./build.sh  -f  項目1  項目2                  #--- 構建【項目1、項目2】,用默認分支,無論有沒有更新都進行強制構建
        # 顯示更多信息
        ./build.sh  -v  --email xm@xxx.com                #--- 構建所有項目,用默認分支,顯示更多過程信息並將錯誤日誌發送到郵箱【xm@xxx.com】
        ./build.sh  -v  --email xm@xxx.com  項目1  項目2  #--- 構建項目:【項目1、項目2】,用默認分支,顯示更多詳細信息並將錯誤日誌發送到郵箱【xm@xxx.com】
        # 外調用★
        ./build.sh  -M function  項目1                #--- 構建項目:【項目1】,用默認分支
        ./build.sh  -M function  -b 分支a  項目1      #--- 構建項目:【項目1】,用分支【分支a】

日常使用:

$ ./build.sh                  #--- 所有項目
$ ./build.sh  項目1  項目2     #--- 指定項目
$ ./build.sh  proj.*          #--- 指定正則匹配【proj.*】的項目
$ ./build.sh  -c java         #--- 指定項目類別

上面提供了豐富的參數,你可以靈活使用,且容易上手。

5.2.2 並行構建

這可以加快構建速度

幫助信息如下:

$ ./deploy/build-parallel.sh --help

    用途:以並行的方式運行構建腳本,以加快構建速度
    依賴:
        /etc/profile.d/zzxia-op-super-invincible-lollipop.run-env.sh
        /root/deploy-bmp/deploy/env.sh
        /root/deploy-bmp/deploy/project.list
        /root/deploy-bmp/deploy/build.sh
        /root/deploy-bmp/deploy/../tools/format_table.sh
        /root/deploy-bmp/deploy/../tools/dingding_conver_to_markdown_list-deploy.sh
    注意:
        * 名稱正則表達式完全匹配,會自動在正則表達式的頭尾加上【^ $】,請規避
        * 輸入命令時,參數順序不分先後
    用法:
        ./build-parallel.sh  [-h|--help]
        ./build-parallel.sh  [-l|--list]
        ./build-parallel.sh  <-n|--number>  <-c [dockerfile|java|node|自定義]>  <-b {代碼分支}>  <-e|--email {郵件地址}>  <-s|--skiptest>  <-f|--force>  <{項目1}  {項目2} ... {項目n}> ... {項目名稱正則表達式完全匹配}>
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help      此幫助
        -l|--list      列出可構建的項目清單
        -n|--number    並行構建項目的數量,默認為2個
        -c|--category  指定構建項目語言類別:【dockerfile|java|node|自定義】,參考:/root/deploy-bmp/deploy/project.list
        -b|--branch    指定代碼分支,默認來自env.sh
        -e|--email     發送日誌到指定郵件地址,如果與【-U|--user-name】同時存在,則將會被替代
        -s|--skiptest  跳過測試,默認來自env.sh
        -f|--force     強制重新構建(無論是否有更新)
    示例:
        #
        ./build-parallel.sh  -l     #--- 列出可構建的項目清單
        # 在build.sh的用法基礎上選擇是否加上【-n】參數即可
        ./build-parallel.sh                            #--- 構建所有項目,用默認分支,同時構建默認個
        ./build-parallel.sh  -n 4                      #--- 構建所有項目,用默認分支,同時構建4個
        ./build-parallel.sh  -n 4  -b 分支a            #--- 構建所有項目,用【分支a】,同時構建4個
        ./build-parallel.sh  -n 4  -c java             #--- 構建所有java項目,用默認分支,同時構建4個
        ./build-parallel.sh  項目1 項目2                        #--- 構建【項目1、項目2】,用默認分支,同時構建默認個
        ./build-parallel.sh  --email xm@xxx.com  項目1 項目2    #--- 構建【項目1、項目2】,用默認分支,同時構建默認個,將錯誤日誌發送到郵箱【xm@xxx.com】
        ./build-parallel.sh  -s -f  項目1 項目2                 #--- 構建【項目1、項目2】,用默認分支,同時構建默認個,跳過測試,強制重新構建(無論是否有更新)
        ./build-parallel.sh  sss                       #--- 構建項目名稱正則匹配【^sss$】的項目,用默認分支,同時構建默認個
        # 更多示例請參考【build.sh】

日常使用:

$ ./build-parallel.sh                  #--- 所有項目,默認並行2個
$ ./build-parallel.sh  -n 5            #--- 所有項目,一次並行構建5個
$ ./build-parallel.sh  -n 5  -c java   #--- 指定項目類別java,一次並行構建5個

5.3 項目發佈

5.3.1 docker項目發佈(k8s|swarm|docker-compose)

幫助信息如下:

$ ./deploy/docker-cluster-service-deploy.sh --help

    用途:用於創建、更新、查看、刪除......服務
    依賴:
        /root/deploy-bmp/deploy/docker-cluster-service.list
        /root/.my_sec/container-envs-pub.sec
        /root/deploy-bmp/deploy/docker-arg-pub.list
        /root/deploy-bmp/deploy/container-hosts-pub.list
        /root/deploy-bmp/deploy/java-options-pub.list
        /root/deploy-bmp/deploy/env.sh
        /root/deploy-bmp/deploy/docker-image-search.sh
        /root/deploy-bmp/deploy/../tools/format_table.sh
        /root/deploy-bmp/deploy/../tools/dingding_conver_to_markdown_list-deploy.sh
    注意:
        * 名稱正則表達式完全匹配,會自動在正則表達式的頭尾加上【^ $】,請規避
        * 一般服務名(非灰度服務名)為項目清單中的服務名,灰度服務名為為【項目清單服務名】+【--】+【灰度版本號】
        * 輸入命令時,參數順序不分先後
    用法:
        ./docker-cluster-service-deploy.sh [-h|--help]
        ./docker-cluster-service-deploy.sh [-l|--list]                    #--- 列出配置文件中的服務清單
        ./docker-cluster-service-deploy.sh [-L|--list-run swarm|k8s]      #--- 列出指定集羣中運行的所有服務,不支持持【docker-compose】
        # 創建、修改
        ./docker-cluster-service-deploy.sh <-M|--mode [normal|function]>  [-c|--create|-m|--modify]  <-D|--debug>  <<-t|--tag {模糊鏡像tag版本}> | <-T|--TAG {精確鏡像tag版本}>>  <-n|--number {副本數}>  <-V|--release-version {版本號}>  <-G|--gray>  <{服務名1} {服務名2} ... {服務名正則表達式完全匹配}>  <-F|--fuck>
        # 更新
        ./docker-cluster-service-deploy.sh <-M|--mode [normal|function]>  [-u|--update]  <<-t|--tag {模糊鏡像tag版本}> | <-T|--TAG {精確鏡像tag版本}>>  <-V|--release-version {版本號}>  <-G|--gray>  <{服務名1} {服務名2} ... {服務名正則表達式完全匹配}>  <-F|--fuck>
        # 回滾
        ./docker-cluster-service-deploy.sh <-M|--mode [normal|function]>  [--b|rollback]   <-V|--release-version {版本號}>  <-G|--gray>  <{服務名1} {服務名2} ... {服務名正則表達式完全匹配}>  <-F|--fuck>
        #
        # 擴縮容
        ./docker-cluster-service-deploy.sh <-M|--mode [normal|function]>  [-S|--scale]  [-n|--number {副本數}]  <-V|--release-version {版本號}>  <-G|--gray>  <{服務名或灰度服務名1} {服務名或灰度服務名2} ... {服務名正則表達式完全匹配}>  <-F|--fuck>
        # 刪除
        ./docker-cluster-service-deploy.sh <-M|--mode [normal|function]>  [-r|--rm]  <-V|--release-version {版本號}>  <-G|--gray>  <-a|--all-release>  <{服務名1} {服務名2} ... {服務名正則表達式完全匹配}>  <-F|--fuck>
        # 狀態
        ./docker-cluster-service-deploy.sh [-s|--status]  <-V|--release-version {版本號}>  <-G|--gray>  <-a|--all-release>  <{服務名1} {服務名2} ... {服務名正則表達式完全匹配}>  <-F|--fuck>
        # 詳情
        ./docker-cluster-service-deploy.sh [-d|--detail]  <-V|--release-version {版本號}>  <-G|--gray>  <-a|--all-release>  <{服務名1} {服務名2} ... {服務名正則表達式完全匹配}>  <-F|--fuck>
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help      :幫助
        -l|--list      :列出配置文件中的服務清單
        -L|--list-run  :列出指定集羣中運行的所有服務,不支持【docker-compose】集羣
        -F|--fuck      :直接運行命令,默認:僅顯示命令行
        -c|--create    :創建服務,基於服務清單參數
        -m|--modify    :修改服務,基於服務清單參數
        -u|--update    :更新鏡像版本
        -b|--rollback  :回滾服務(回滾到非今天構建的上一個版本)
        -S|--scale     :副本數設置
        -r|--rm        :刪除服務
        -s|--status    : 獲取服務運行狀態
        -d|--detail    : 獲取服務詳細信息
        -D|--debug     : 開啓開發者Debug模式,目前用於開放所有容器服務端口
        -t|--tag       :模糊鏡像tag版本
        -T|--TAG       :精確鏡像tag版本
        -n|--number    :Pod副本數
        -G|--gray      : 設置灰度標誌為:gray,默認:normal
        -V|--release-version : 發佈版本號
        -a|--all-release     : 所有已發佈的版本,包含帶版本號的、不帶版本號的、灰度的、非灰度的
        -M|--mode      :指定構建方式,二選一【normal|function】,默認為normal方式。此參數用於被外部調用
    示例:
        # 服務清單
        ./docker-cluster-service-deploy.sh -l                     #--- 列出配置文件中的服務清單
        ./docker-cluster-service-deploy.sh -L swarm               #--- 列出【swarm】集羣中運行的所有服務
        # 僅顯示最終命令行或直接執行(用於檢查命令是否有錯誤)
        ./docker-cluster-service-deploy.sh -c  服務1                             #--- 根據服務清單顯示創建【服務1】的命令行
        ./docker-cluster-service-deploy.sh -c  服務1  -F                         #--- 根據服務清單創建【服務1】
        # 服務名稱正則完全匹配
        ./docker-cluster-service-deploy.sh  -c  .*xxx.*  -F                      #--- 創建服務名稱正則完全匹配【^.*xxx.*$】的服務,使用最新鏡像
        ./docker-cluster-service-deploy.sh  -u  [.]*xxx  -F                      #--- 更新服務名稱正則完全匹配【^[.]*xxx$】的服務,使用最新鏡像
        # 創建
        ./docker-cluster-service-deploy.sh -c  -F                                    #--- 根據服務清單創建所有服務
        ./docker-cluster-service-deploy.sh -c  服務1 服務2  -F                       #--- 創建【服務1】、【服務2】服務
        ./docker-cluster-service-deploy.sh -c  -D  服務1 服務2  -F                   #--- 創建【服務1】、【服務2】服務,並開啓開發者Debug模式
        ./docker-cluster-service-deploy.sh -c  -T 2020.12.11  服務1 服務2  -F        #--- 創建【服務1】、【服務2】服務,且使用的鏡像版本為【2020.12.11】
        ./docker-cluster-service-deploy.sh -c  -t 2020.12     服務1 服務2  -F        #--- 創建【服務1】、【服務2】服務,且使用的鏡像版本包含【2020.12】的最新鏡像
        ./docker-cluster-service-deploy.sh -c  -n 2  服務1 服務2  -F                 #--- 創建【服務1】、【服務2】服務,且副本數為【2】
        ./docker-cluster-service-deploy.sh -c  -T 2020.12.11  -n 2  服務1 服務2  -F  #--- 創建【服務1】、【服務2】服務,且使用的鏡像版本為【2020.12.11】,副本數為【2】
        ./docker-cluster-service-deploy.sh -c  -V yyy       服務1 服務2  -F          #--- 創建【服務1】、【服務2】,版本號為【yyy】
        ./docker-cluster-service-deploy.sh -c  -G           服務1 服務2  -F          #--- 創建【服務1】、【服務2】的灰度服務
        ./docker-cluster-service-deploy.sh -c  -G  -V yyy   服務1 服務2  -F          #--- 創建【服務1】、【服務2】的灰度服務,版本號為【yyy】
        # 修改
        ./docker-cluster-service-deploy.sh -m  服務1 服務2  -F                       #--- 修改【服務1】、【服務2】服務
        ./docker-cluster-service-deploy.sh -m  服務1 服務2  -V yyy  -F               #--- 根據服務清單修改所有版本號為【yyy】的服務
        ./docker-cluster-service-deploy.sh -m  -T 2020.12.11  服務1 服務2  -F        #--- 修改【服務1】、【服務2】服務,且使用的鏡像版本為【2020.12.11】
        ./docker-cluster-service-deploy.sh -m  -t 2020.12     服務1 服務2  -F        #--- 修改【服務1】、【服務2】服務,且使用的鏡像版本包含【2020.12】的最新鏡像
        ./docker-cluster-service-deploy.sh -m  -n 2  服務1 服務2  -F                 #--- 修改【服務1】、【服務2】服務,且副本數為【2】
        ./docker-cluster-service-deploy.sh -m  -T 2020.12.11  -n 2  服務1 服務2  -F  #--- 修改【服務1】、【服務2】服務,且使用的鏡像版本為【2020.12.11】,副本數為【2】
        # 更新鏡像
        ./docker-cluster-service-deploy.sh -u  -F                                    #--- 根據服務清單更新設置所有服務的最新鏡像tag版本(如果今天構建過)
        ./docker-cluster-service-deploy.sh -u  服務1 服務2  -F                       #--- 設置【服務1】、【服務2】服務的最新鏡像tag版本(如果今天構建過)
        ./docker-cluster-service-deploy.sh -u  -t 2020.12  -F                        #--- 根據服務清單更新設置所有服務,且鏡像tag版本包含【2020.12】的最新鏡像
        ./docker-cluster-service-deploy.sh -u  -t 2020.12     服務1 服務2  -F        #--- 更新【服務1】、【服務2】有服務,且鏡像tag版本包含【2020.12】的最新鏡像
        ./docker-cluster-service-deploy.sh -u  -T 2020.12.11  -F                     #--- 根據服務清單更新設置所有服務,且鏡像tag版本為【2020.12.11】的鏡像
        ./docker-cluster-service-deploy.sh -u  -T 2020.12.11  服務1 服務2  -F        #--- 更新【服務1】、【服務2】有服務,且鏡像tag版本為【2020.12.11】的鏡像
        # 回滾
        ./docker-cluster-service-deploy.sh -b  -F                          #--- 根據服務清單回滾所有服務(如果今天構建過)
        ./docker-cluster-service-deploy.sh -b  服務1 服務2  -F             #--- 回滾【服務1】、【服務2】服務(如果今天構建過)
        ./docker-cluster-service-deploy.sh -b  服務1 服務2  -V yyy  -F     #--- 回滾【服務1】、【服務2】服務,且版本號為【yyy】(如果今天構建過)
        #
        # 擴縮容
        ./docker-cluster-service-deploy.sh -S  -n 2  -F                    #--- 根據服務清單設置所有服務的pod副本數為2
        ./docker-cluster-service-deploy.sh -S  -n 2  服務1 服務2  -F       #--- 設置【服務1】、【服務2】服務的pod副本數為2
        ./docker-cluster-service-deploy.sh -S  -n 2  -G  服務1 服務2  -F   #--- 設置【服務1】、【服務2】的灰度服務的pod副本數為2
        ./docker-cluster-service-deploy.sh -S  -n 2  -G  -V yyy  服務1 服務2  -F   #--- 設置【服務1】、【服務2】的灰度服務,且版本為【yyy】的pod副本數為2
        # 刪除
        ./docker-cluster-service-deploy.sh -r  -F                          #--- 根據服務清單刪除所有服務
        ./docker-cluster-service-deploy.sh -r  服務1 服務2  -F             #--- 刪除【服務1】、【服務2】服務
        ./docker-cluster-service-deploy.sh -r  -G  服務1 服務2  -F         #--- 刪除【服務1】、【服務2】的灰度服務
        ./docker-cluster-service-deploy.sh -r  -V yyy  服務1 服務2  -F     #--- 刪除【服務1】、【服務2】,且版本為【yyy】的服務
        ./docker-cluster-service-deploy.sh -r  -V yyy  -G  服務1 服務2  -F #--- 刪除【服務1】、【服務2】,且版本為【yyy】的灰度服務
        ./docker-cluster-service-deploy.sh -r  -a  服務1 服務2  -F         #--- 刪除模糊匹配【服務1】、【服務2】的服務,包含帶版本號的、不帶版本號的、灰度的、非灰度的
        # 運行狀態(更多請參考【刪除】)
        ./docker-cluster-service-deploy.sh -s  -F                          #--- 根據服務清單獲取服務運行狀態
        ./docker-cluster-service-deploy.sh -s  服務1 服務2  -F             #--- 獲取【服務1】、【服務2】服務運行狀態
        ./docker-cluster-service-deploy.sh -s  -G  服務1 服務2  -F         #--- 獲取【服務1】、【服務2】的灰度服務運行狀態
        # 運行詳細信息(更多請參考【刪除】)
        ./docker-cluster-service-deploy.sh -d  -F                          #--- 根據服務清單獲服務運行取詳細信息
        ./docker-cluster-service-deploy.sh -d  服務1 服務2  -F             #--- 獲取【服務1】、【服務2】服務運行詳細信息
        # 外調用★ 
        ./docker-cluster-service-deploy.sh -M function  -u                 服務1  -F    #--- 更新部署【服務1】,使用最新鏡像
        ./docker-cluster-service-deploy.sh -M function  -u  -T 2020.12.11  服務1  -F    #--- 更新部署【服務1】,使用版本為【2020.12.11】的鏡像

日常使用:

$ ./docker-cluster-service-deploy.sh  -c  -F                             #--- 正常發佈所有
$ ./docker-cluster-service-deploy.sh  -c  -F  -V 2.1  -G  服務1 服務2     #--- 灰度發佈服務1、服務2,版本號:2.1
$ ./docker-cluster-service-deploy.sh  -u  -F  服務1 服務2                 #--- 更新服務1、服務2
$ ./docker-cluster-service-deploy.sh  -u  -F  service.*                  #--- 更新匹配【service.*】的服務
項目會根據優先級進行構建與發佈

5.3.2 web項目發佈

幫助信息如下:

$ ./deploy/web-release.sh --help

    用途:Web站點發布上線
    依賴:
        /root/deploy-bmp/deploy/nginx.list
        /root/deploy-bmp/deploy/../tools/format_table.sh
        /root/deploy-bmp/deploy/../tools/dingding_conver_to_markdown_list-deploy.sh
        /root/deploy-bmp/deploy/env.sh
        nginx上:/root/nginx-config/web-release-on-nginx.sh
    注意:運行在nginx節點上
        * 【上線(ship)】流程包含以下四個子流程【構建】、【測試(test)】、【部署(deploy)】、【發佈(release)】。原地發佈(即部署 == 發佈)
        * 名稱正則表達式完全匹配,會自動在正則表達式的頭尾加上【^ $】,請規避
        * 輸入命令時,參數順序不分先後
    用法:
        ./web-release.sh  [-h|--help]
        ./web-release.sh  [-l|--list]                                         #--- 列出項目
        ./web-release.sh  <-M|--mode [normal|function]>  [-r|--release]   <{項目1}  {項目2} ... {項目n} ... {項目名稱正則表達式完全匹配}>     #--- 發佈上線今天的版本
        ./web-release.sh  <-M|--mode [normal|function]>  [-b|--rollback]  <{項目1}  {項目2} ... {項目n} ... {項目名稱正則表達式完全匹配}>     #--- 回滾到上一個版本
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help        此幫助
        -l|--list        項目列表
        -r|--release     發佈
        -b|--rollback    回滾
        -M|--mode      :指定構建方式,二選一【normal|function】,默認為normal方式。此參數用於被外部調用
    示例:
        ./web-release.sh  -l                 #--- 列出所有項目
        #
        ./web-release.sh  -r                 #--- 發佈所有項目
        ./web-release.sh  -r  項目a 項目b    #--- 發佈【項目a、項目b】
        #
        ./web-release.sh  -b                 #--- 回滾所有項目
        ./web-release.sh  -b  項目a 項目b    #--- 回滾【項目a、項目b】
        # 服務名稱用正則完全匹配
        ./web-release.sh  -r  .*xxx.*           #--- 發佈項目名稱正則完全匹配【^.*xxx.*$】的第一個項目
        ./web-release.sh  -b  [.]*xxx           #--- 回滾項目名稱正則完全匹配【^[.]*xxx$】的第一個項目
        # 外調用★
        ./web-release.sh  -M function  -r                 #--- 函數調用方式發佈所有項目
        ./web-release.sh  -M function  -r  項目a 項目b    #---  函數調用方式發佈【項目a、項目b】

日常使用:

$ ./web-release.sh  -r                      #--- 發佈所有
$ ./web-release.sh  -r  proj.*              #--- 發佈正則匹配項目【proj.*】
$ ./web-release.sh  -r  項目a 項目b          #--- 發佈項目a、項目b
$ ./web-release.sh  -b  項目a 項目b          #--- 回滾項目a、項目b

5.4 構建發佈一條龍

幫助信息如下:

$ ./deploy/gogogo.sh --help

    用途:用於項目構建併發布
    依賴腳本:
        /etc/profile.d/zzxia-op-super-invincible-lollipop.run-env.sh
        /root/deploy-bmp/deploy/env.sh
        /root/deploy-bmp/deploy/project.list
        /root/deploy-bmp/deploy/build.sh
        /root/deploy-bmp/deploy/docker-cluster-service.list
        /root/deploy-bmp/deploy/docker-cluster-service-deploy.sh
        /root/deploy-bmp/deploy/../tools/format_table.sh
        /root/deploy-bmp/deploy/../tools/dingding_conver_to_markdown_list-deploy.sh
    注意:
        - 構建完成後的發佈:如果目標服務不在運行中,則執行【create】;如果已經存在,則執行【update】。如果是以【create】方式執行,則【-G|--gray】參數有效
    用法:
        ./gogogo.sh  [-h|--help]
        ./gogogo.sh  [-l|--list]
        ./gogogo.sh  <-c [dockerfile|java|node|自定義]>  <-b {代碼分支}>  <-e|--email {郵件地址}>  <-s|--skiptest>  <-f|--force>  <-v|--verbose>  <-V|--release-version>  <-G|--gray>  <{項目1}  {項目2} ... {項目n}> ... {項目名稱正則匹配}>
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help      此幫助
        -l|--list      列出可構建的項目清單
        -c|--category  指定構建項目語言類別:【dockerfile|java|node|自定義】,參考:/root/deploy-bmp/deploy/project.list
        -b|--branch    指定代碼分支,默認來自env.sh
        -e|--email     發送日誌到指定郵件地址,如果與【-U|--user-name】同時存在,則將會被替代
        -s|--skiptest  跳過測試,默認來自env.sh
        -f|--force     強制重新構建(無論是否有更新)
        -v|--verbose   顯示更多過程信息
        -G|--gray            : 設置灰度標誌為:【gray】,默認:【normal】
        -V|--release-version : 發佈版本號
    示例:
        #
        ./gogogo.sh  -l             #--- 列出可構建發佈的項目清單
        # 類別
        ./gogogo.sh  -c java                           #--- 構建發佈所有java項目,用默認分支
        ./gogogo.sh  -c java  -b 分支a                 #--- 構建發佈所有java項目,用分支a
        ./gogogo.sh  -c java  -b 分支a  項目1  項目2   #--- 構建發佈node【項目1、項目2】,用分支a(一般可不用-c參數)
        ./gogogo.sh  -c java            項目1  項目2   #--- 構建發佈node【項目1、項目2】,用默認分支
        # 一般
        ./gogogo.sh                           #--- 構建發佈所有項目,用默認分支
        ./gogogo.sh  -b 分支a                 #--- 構建發佈所有項目,用【分支a】
        ./gogogo.sh  -b 分支a  項目1  項目2   #--- 構建發佈【項目1、項目2】,用【分支a】
        ./gogogo.sh            項目1  項目2   #--- 構建發佈【項目1、項目2】,用默認分支
        # 郵件
        ./gogogo.sh  --email xm@xxx.com  項目1 項目2     #--- 構建發佈【項目1、項目2】,將錯誤日誌發送到郵箱【xm@xxx.com】
        # 跳過測試
        ./gogogo.sh  -s  項目1 項目2                     #--- 構建發佈【項目1、項目2】,跳過測試
        # 強制重新構建
        ./gogogo.sh  -f  項目1  項目2                    #--- 強制重新構建發佈【項目1、項目2】,用默認分支,不管【項目1、項目2】有沒有更新
        # 顯示更多信息
        ./gogogo.sh  -v  項目1 項目2                     #--- 構建發佈【項目1、項目2】,顯示更多信息
        # 構建發佈帶版本號
        ./gogogo.sh  -V 2.2  項目1 項目2                 #--- 構建【項目1、項目2】,發佈版本號為【2.2】
        # 構建完成後以灰度方式發佈
        ./gogogo.sh  -G          項目1 項目2             #--- 構建【項目1、項目2】,並灰度發佈
        ./gogogo.sh  -G  -V 2.2  項目1 項目2             #--- 構建【項目1、項目2】,並灰度發佈,發佈版本號為【2.2】
        # 項目名稱用正則匹配
        ./gogogo.sh   .*xxx.*       #--- 構建發佈項目名稱正則匹配【.*xxx.*】的項目(包含xxx的),用默認分支
        ./gogogo.sh   [.]*xxx       #--- 構建發佈項目名稱正則匹配【[.]*xxx】的項目(包含xxx的),用默認分支
        ./gogogo.sh   xxx-          #--- 構建發佈項目名稱正則匹配【xxx-】的項目(包含xxx-的),用默認分支
        ./gogogo.sh   ^[xy]         #--- 構建發佈項目名稱正則匹配【^[xy]】的項目(以x或y開頭的),用默認分支
        ./gogogo.sh   ^sss          #--- 構建發佈項目名稱正則匹配【^sss】的目(以sss開頭的),用默認分支
        ./gogogo.sh   eee$          #--- 構建發佈項目名稱正則匹配【eee$】的目(以eee結尾的),用默認分支
        ./gogogo.sh   ^sss.*eee$    #--- 構建發佈項目名稱正則匹配【^sss.*eee$】的項目(以以sss開頭,並且以eee結尾的),用默認分支
        ./gogogo.sh  -c ja  ^sss.*eee$    #--- 構建發佈項目類別正則匹配【ja】,且項目名稱正則匹配【^sss.*eee$】的項目(以以sss開頭,並且以eee結尾的),用默認分支

日常使用:

$ ./gogogo.sh                              #--- 構建發佈所有
$ ./gogogo.sh  -G  -V 2.2  項目1 項目2      #--- 構建並灰度發佈項目1、項目2
$ ./gogogo.sh  proj.*                      #--- 構建發佈正則匹配【proj.*】的項目
項目會根據優先級進行構建與發佈

5.5 萬宗歸一工具

可以通過這一個工具幹完幾乎所有事情

$ ./gan.sh --help

    用途:用於遠程安裝部署。模塊説明如下:
    注意:在deploy節點上運行,需要一堆關聯腳本
    用法:
        ./gan.sh [-h|--help]    #--- 幫助
        ./gan.sh [-d|--do web|ngx-root|ngx-conf|cert|cert-w|pg-b-r|aliyun-dns|godaddy-dns]  <參數1> ... <參數n>     #--- 參數1...n 是 $1 模塊的參數
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help      此幫助
        -d|--do        某功能模塊
                       - build        【build.sh】:項目打包
                       - build-para   【build-parallel.sh】:並行項目打包
                       - gogogo       【gogogo.sh】:項目打包並部署上線
                       - docker       【docker-cluster-service-deploy.sh】:docker服務部署上線、回滾
                       - web          【web-release.sh】:網站代碼部署上線、回滾
                       - ngx-dns      【nginx-dns.sh】:網站域名A記錄添加或修改
                       - ngx-root     【nginx-root.sh】:網站root目錄初始化
                       - ngx-conf     【nginx-conf.sh】:網站nginx配置設置
                       - ngx-cert     【nginx-cert-letsencrypt-a.sh】:網站域名證書申請
                       - ngx-cert-w   【cert-letsencrypt-wildcart.sh】:泛域名證書申請與更新
                       - pg-b-r       【pg_list_backup_or_restore.sh】:備份或還原pg_m上的數據庫
                       - aliyun-dns   【aliyun-dns.sh】:修改aliyun dns
                       - godaddy-dns  【godaddy-dns.sh】:修改godaddy dns
    示例:
        #
        ./gan.sh  -h
        ./gan.sh  -d web  -h                 #--- 運行web-release.sh命令幫助
        ./gan.sh  -d web  -r                 #--- 運行web-release.sh命令,發佈所有前端項目
        ./gan.sh  -d web  -r  項目a 項目b    #--- 運行web-release.sh命令,發佈所有前端【項目a、項目b】

一般我會用它初始化nginx的root目錄及conf文件及dns A記錄,例如:

# nginx root目錄
$ ./gan.sh -d ngx-root --help

    用途:用以在nginx服務器上生成項目站點目錄結構
    依賴:
        /etc/profile.d/zzxia-op-super-invincible-lollipop.run-env.sh
        /root/deploy-bmp/init/nginx-config/nginx.list
    注意: 運行在deploy上
    用法:
        /root/deploy-bmp/init/nginx-config/nginx-root.sh  [-h|--help]
        /root/deploy-bmp/init/nginx-config/nginx-root.sh  [-l|--list]
        /root/deploy-bmp/init/nginx-config/nginx-root.sh  <{項目1} {項目2} ... {項目n}>
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help      此幫助
        -l|--list      列出可構建的項目清單
    示例:
        #
        /root/deploy-bmp/init/nginx-config/nginx-root.sh  -h     #--- 幫助
        /root/deploy-bmp/init/nginx-config/nginx-root.sh  -l     #--- 列出項目清單
        #
        /root/deploy-bmp/init/nginx-config/nginx-root.sh                 #--- 為所有項目建立項目目錄
        /root/deploy-bmp/init/nginx-config/nginx-root.sh  項目a 項目b    #--- 為【項目a、項目b】建立項目目錄
        
        
$ ./gan.sh -d ngx-root            #--- 為所有項目建立nginx root目錄
$ ./gan.sh -d ngx-root 項目1       #--- 為項目1建立nginx root目錄
# nginx conf
$ ./gan.sh -d ngx-conf --help

    用途:用以生成項目nginx配置文件,並放置到nginx服務器上
    依賴:
        /etc/profile.d/zzxia-op-super-invincible-lollipop.run-env.sh
        /root/deploy-bmp/init/nginx-config/nginx.list
    注意:運行在deploy節點上
    用法:
        /root/deploy-bmp/init/nginx-config/nginx-conf.sh  [-h|--help]
        /root/deploy-bmp/init/nginx-config/nginx-conf.sh  [-l|--list]
        /root/deploy-bmp/init/nginx-config/nginx-conf.sh  [ [-p|--protocol http] | [-p|--protocol https  -c|--cert wildcard|single] ]  <{項目1}  {項目2} ... {項目n}>
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help      此幫助
        -l|--list      列出可構建的項目清單
        -p|--protocol  協議,可選值【http|https】
        -c|--cert      證書類型,可選值【wildcard|single】,分別代表泛域名證書或單域名證書
    示例:
        #
        /root/deploy-bmp/init/nginx-config/nginx-conf.sh  -h     #--- 幫助
        /root/deploy-bmp/init/nginx-config/nginx-conf.sh  -l     #--- 列出項目清單
        #
        /root/deploy-bmp/init/nginx-config/nginx-conf.sh  -p http                              #--- http方式,為所有項目創建配置文件
        /root/deploy-bmp/init/nginx-config/nginx-conf.sh  -p http                項目a 項目b   #--- http方式,為【項目a、項目b】創建配置文件
        /root/deploy-bmp/init/nginx-config/nginx-conf.sh  -p https  -c single                  #--- https普通域名證書方式,為所有項目創建配置文件
        /root/deploy-bmp/init/nginx-config/nginx-conf.sh  -p https  -c wildcard                #--- https泛域名證書方式,為所有項目創建配置文件
        /root/deploy-bmp/init/nginx-config/nginx-conf.sh  -p https  -c wildcard  項目a 項目b   #--- https泛域名證書方式,為【項目a、項目b】創建配置文件
        
        
$ ./gan.sh -d ngx-conf  -p https  -c single            #--- 為所有項目生成配置文件並部署,使用https+單域名證書
$ ./gan.sh -d ngx-conf  -p https  -c single  項目1      #--- 為項目1生成配置文件並部署,使用https+單域名證書
# dns A記錄
$ ./gan.sh -d ngx-dns --help

    用途:根據/root/deploy-bmp/init/nginx-config/nginx.list,在deploy服務器上添加修改域名A記錄
    依賴:
        /etc/profile.d/zzxia-op-super-invincible-lollipop.run-env.sh
        /root/deploy-bmp/init/nginx-config/nginx.list
        /root/deploy-bmp/init/nginx-config/../../tools/aliyun-dns.sh
        /root/deploy-bmp/init/nginx-config/../../tools/godaddy-dns.sh
    注意: 運行在deploy上
    用法:
        /root/deploy-bmp/init/nginx-config/nginx-dns.sh  [-h|--help]
        /root/deploy-bmp/init/nginx-config/nginx-dns.sh  [-l|--list]
        /root/deploy-bmp/init/nginx-config/nginx-dns.sh  [ -p|--provider aliyun|godaddy|你自定義 ]  <{項目1} {項目2} ... {項目n}>
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help      此幫助
        -l|--list      列出可構建的項目清單
        -p|--provider  指定你的域名解析提供商,可選擇aliyun|godaddy,也可以自己添加,畢竟供應商那麼多,我也給不全
    示例:
        #
        /root/deploy-bmp/init/nginx-config/nginx-dns.sh  -h     #--- 幫助
        /root/deploy-bmp/init/nginx-config/nginx-dns.sh  -l     #--- 列出項目清單
        #
        /root/deploy-bmp/init/nginx-config/nginx-dns.sh  -p aliyun                #--- 為所有項目添加域名記錄,域名解析為阿里雲
        /root/deploy-bmp/init/nginx-config/nginx-dns.sh  -p aliyun  項目a 項目b    #--- 為【項目a、項目b】添加域名記錄,域名解析為阿里雲
        
     
$ ./gan.sh -d ngx-dns        #--- 為所有項目添加域名A記錄
$ ./gan.sh -d ngx-dns 項目1   #--- 為項目1添加域名A記錄

好了,其他就不一一展示了

5.6 其他工具使用

5.6.1 私有倉庫docker鏡像搜索工具

$ ./deploy/docker-image-search.sh --help

    用途:查詢docker鏡像
    依賴:
        /root/deploy-bmp/deploy/env.sh
        /root/deploy-bmp/deploy/docker-cluster-service.list
    注意:
        * 輸入命令時,參數順序不分先後
    用法:
        ./docker-image-search.sh [-h|--help]
        ./docker-image-search.sh [-l|--list]
        ./docker-image-search.sh  <-e|--exclude {%鏡像版本%}>  <-t|--tag {%鏡像版本%}>  <-n|--newest {第幾新版本}>  <-o|--output {路徑/文件}>  <{服務1} ... {服務2} ...>
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help       此幫助
        -l|--list       清單
        -e|--exclude    排除指定鏡像版本,支持模糊定義,一般用於排除今天打包的鏡像版本,用於部署回滾
        -t|--tag        鏡像版本(tag)。支持模糊查找
        -n|--newest     取第幾新的鏡像版本,例如: -n 1 :代表取最新的那個鏡像版本,-n 2:代表第二新的鏡像,有-n參數時輸出格式為:【服務名  tag版本 tag版本2 ...】;無-n參數時輸出為服務名 \ntag版本 \ntag版本2 \n...
        -o|--output     輸出搜索結果不為空的服務名稱 到 指定【路徑/文件】
    示例:
        ./docker-image-search.sh  -h
        ./docker-image-search.sh  -l
        #
        ./docker-image-search.sh                       #--- 返回所有服務所有鏡像版本
        ./docker-image-search.sh  服務1                #--- 返回服務名為【服務1】的所有鏡像版本
        #
        ./docker-image-search.sh  -e 2021  服務1       #--- 返回服務名為服務1,且tag版本不包含【2021】的所有版本
        ./docker-image-search.sh  -t 2021  服務1       #--- 返回服務名為服務1,且tag版本包含【2021】的所有版本
        ./docker-image-search.sh  -n 1     服務1       #--- 返回服務名為服務1,且最新的鏡像tag版本
        ./docker-image-search.sh  -n 2     服務1       #--- 返回服務名為服務1,且次新的鏡像tag版本(第二新)
        #
        ./docker-image-search.sh  -t 2021        -n 2            #--- 返回所有服務,且tag名包含【2021】,且次新的鏡像tag版本
        ./docker-image-search.sh  -t 2021        -n 2   服務1    #--- 返回服務名為【服務1】,且tag版本包含【2021】,且次新的鏡像tag版本
        ./docker-image-search.sh  -e 2021.01.22  -n 1   服務1    #--- 返回服務名為【服務1】,且除tag版本包含【2021.01.22】的鏡像外,最新的鏡像tag版本,一般用於排除今天【2021.01.22】的版本以回滾
        ./docker-image-search.sh  -e 2021.01.22  -t 20  服務1    #--- 返回服務名為【服務1】,且除tag版本包含【2021.01.22】的鏡像外,且tag版本包含【20】的鏡像tag版本,返回最新的是個
        #
        ./docker-image-search.sh  -e 2021.01.22  -t 2021.01.01.01  -n 1   #--- 返回所有服務,且tag版本不包含【2021.01.22】,且包含【2021.01.01.01】,最新的tag版本
        # 今日發佈與回滾:
        ./docker-image-search.sh  -t 2021.01.22  -n 1  -o /root/1.txt     #--- 返回所有服務,且tag名稱包含【2021.01.22】(今天),最新的鏡像tag版本,將服務清單輸出到文件/root/1.txt,一般用於發佈今天打包的服務清單
        ./docker-image-search.sh  -e 2021.01.22  -n 1  -o /root/1.txt     #--- 返回所有服務,且tag名稱不包含【2021.01.22】(今天),最新的鏡像tag版本,將服務清單輸出到文件/root/1.txt,一般用於今日發佈失敗後的回滾

5.6.2 阿里雲dns查詢與修改工具

$ ./tools/aliyun-dns.sh --help

    用途:用於查詢修改dns信息
    依賴:
        /etc/profile.d/zzxia-op-super-invincible-lollipop.run-env.sh
        阿里雲CLI:aliyun
    注意:
        * 輸入命令時,參數順序不分先後
    用法:
          ./aliyun-dns.sh [-h|--help]
          ./aliyun-dns.sh -A [replace|append|delete|query_domain|query_record]  <-d {域名}>  <-t [A|TXT|RNAME|...]>  <-n {dns記錄名}>  <-v {dns記錄值}>  <-w {關鍵字}>
    參數説明:
          -h|--help    此幫助
          -A|--Action  指定操作類型replace|append|delete|query_domain|query_record
          -d|--domain  指定域名,默認為/etc/profile.d/zzxia-op-super-invincible-lollipop.run-env.sh中定義的${DOMAIN}
          -t|--type    指定dns記錄類型A|TXT|CNAME|...
          -n|--name    指定dns記錄名稱
          -v|--value   指定dns記錄值
          -w|--keyword 指定搜索關鍵字,在name及value中匹配
    示例:
          # 增加與修改:
          ./aliyun-dns.sh -A [replace|append]  <-d 域名>  [-t [A|TXT|CNAME|...]]  [-n dns記錄名]  [-v dns記錄值]     #--- replace:刪除現有後新增; append:增加多一條
          # 查詢:
          ./aliyun-dns.sh -A query_domain  <-d 域名>                                          #--- 查詢域名信息
          ./aliyun-dns.sh -A query_record  <-d 域名>                                          #--- 查詢域名下所有記錄
          ./aliyun-dns.sh -A query_record  <-d 域名>  [-t [A|TXT|CNAME|...]]                  #--- 查詢域名下該類型所有的記錄
          ./aliyun-dns.sh -A query_record  <-d 域名>  [-t [A|TXT|CNAME|...]]  [-n dns記錄名]  #--- 查詢域名下該類型該 名稱 所有的記錄
          ./aliyun-dns.sh -A query_record  <-d 域名>  [-w 關鍵字]                             #--- 查詢域名下模糊匹配該 名稱或值 所有的記錄
          ./aliyun-dns.sh -A query_record  <-d 域名>  [-t [A|TXT|CNAME|...]]  [-w 關鍵字]     #--- 查詢域名下該類型模糊匹配該 名稱或值 所有的記錄(此功能aliyun有bug)

5.6.3 godaddy dns查詢與修改工具

$ ./tools/godaddy-dns.sh --help

    用途:用於查詢修改dns信息
    依賴:
    注意:
    用法:
          ./godaddy-dns.sh [-h|--help]
          ./godaddy-dns.sh -A [replace|append|delete|query_domain|query_record]  <-d {域名}>  <-t [A|TXT|RNAME|...]>  <-n {dns記錄名}>  <-v {dns記錄值}>
    參數説明:
          -h|--help    此幫助
          -A|--Action  指定操作類型replace|append|delete|query_domain|query_record
          -d|--domain  指定域名,默認為/etc/profile.d/run.env.sh中定義的${DOMAIN}
          -t|--type    指定dns記錄類型A|TXT|RNAME|...
          -n|--name    指定dns記錄名稱
          -v|--value   指定dns記錄值
    示例:
          # 增加與修改:
          ./godaddy-dns.sh -A [replace|append]  <-d 域名>  [-t [A|TXT|RNAME|...]]  [-n dns記錄名]  [-v dns記錄值]     #--- replace:刪除現有後新增; append:增加多一條
          # 查詢:
          ./godaddy-dns.sh -A query_domain  <-d 域名>                                          #--- 查詢域名信息
          ./godaddy-dns.sh -A query_record  <-d 域名>                                          #--- 查詢域名下所有記錄
          ./godaddy-dns.sh -A query_record  <-d 域名>  [-t [A|TXT|RNAME|...]]                  #--- 查詢域名下該類型所有的記錄
          ./godaddy-dns.sh -A query_record  <-d 域名>  [-t [A|TXT|RNAME|...]]  [-n dns記錄名]  #--- 查詢域名下該類型該名稱所有的記錄

5.6.4 泛域名證書申請與續期工具(支持阿里雲、騰訊雲、華為雲、godaddy,藉助了第三方項目)

$ ./tools/cert-letsencrypt-wildcart.sh --help

    用途:用於申請與更新泛域名證書
          更新Letsencrypt泛域名證書,拷貝到nginx服務器,然後reload
    依賴:
        /etc/profile.d/zzxia-op-super-invincible-lollipop.run-env.sh
        certbot
        /root/deploy-bmp/tools/certbot-letencrypt-wildcardcertificates-sh/au.sh
    注意:
        * 本腳本基於項目https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
        * 輸入命令時,參數順序不分先後
    用法:
        ./cert-letsencrypt-wildcart.sh  [-h|--help]
        ./cert-letsencrypt-wildcart.sh  [-y|--yun [aly|hwy|godaddy]]  [ [-r|--request=]<{主域名}> | [-u|--update=]<{主域名}> ]  <-t|--test>   #--- 申請或renew泛域名證書
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help         此幫助
        -y|--yun          指定dns解析商,aly:阿里雲;txy:騰訊雲;hwy:華為雲;godaddy,需要設置certbot-letencrypt-wildcardcertificates-sh/au.sh中相應的key、secret
        -r|--request      申請Letsencrypt泛域名證書,短-選項與參數之間不能有空格,默認主域名為zzxia-op-super-invincible-lollipop.run-env.sh中定義的${DOMAIN}
        -u|--update       renew泛域名證書,要求同上
        -t|--test         以--dry-run方式運行演練測試
    示例:
        ./cert-letsencrypt-wildcart.sh  -h
        ./cert-letsencrypt-wildcart.sh  -y aly  -r  -t              #--- 測試申請泛域名證書,dns域名解析商是阿里雲,域名是默認為zzxia-op-super-invincible-lollipop.run-env.sh定義的${DOMAIN}
        ./cert-letsencrypt-wildcart.sh  -y aly  -r                  #--- 申請泛域名證書,dns域名解析商是阿里雲,域名是默認為zzxia-op-super-invincible-lollipop.run-env.sh中定義的${DOMAIN}
        ./cert-letsencrypt-wildcart.sh  -y aly  -raaa.com           #--- 申請泛域名證書,dns域名解析商是阿里雲,域名是aaa.com
        ./cert-letsencrypt-wildcart.sh  -y aly  -u                  #--- 更新泛域名證書,dns域名解析商是阿里雲,域名是默認為zzxia-op-super-invincible-lollipop.run-env.sh中定義的${DOMAIN}

5.6.5 郵件發送工具

$ ./tools/send_mail.sh --help

    用途:使用mailx發送郵件
    依賴:
        mailx
        /usr/local/bin/dingding_send_markdown.sh
    注意:
        * 輸入命令時,參數順序不分先後
    用法:
        ./send_mail.sh [-h|--help]
        ./send_mail.sh [-s|--subject {主題}]  [-c|--content {郵件內容}]  <[-a|--attach {文件名1}] ... [-a|--attach {文件名n}]>  <-o|--origin-option [{mailx選項]}>  [{收件人1} ... <{收件人n}>]
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -h|--help       查看本幫助
        -s|--subject    郵件主題,注意事項:為避免空格問題,一定要用引號引起來,不管是字符串還是變量
        -c|--content    郵件內容,注意事項同上
        -a|--attach     郵件附件,可以有多個
        -o|--origin-option     mailx自帶的其他非必須參數選項,可以有多個,注意事項同上
    示例:
        # 一般用法:(-a 附件文件名不能有空格)
        ./send_mail.sh  [-s "郵件主題"]  [-c "郵件內容"]  <[-a 文件名1] ... <[-a 文件名n]>>   [收件人1] ... <收件人n>

        # -c 之 郵件內容高級用法(郵件主題同之):
        ./send_mail.sh  [-s 郵件主題]    [-c "[郵件內容]" | "`echo ${郵件內容變量}`" | "`cat 郵件內容文件名`" ]   [收件人1] ... <收件人n>

        # -o 之 mailx自帶的高級選項用法,例如:添加-c、-b,如下:(更多高級選項請參考man mailx)
        ./send_mail.sh  [-s 郵件主題]    [-c "[郵件內容]" ]  <[-o "-c 抄送地址"] ... <-o "-b 暗送地址">>   [收件人1] ... <收件人n>
        # 例如:(注意,分隔處不能有空格)
        ./send_mail.sh  -s "${SS}" -c "222 33" -o "-c admin@gc.com,zhu@gc.com" -o "-b 豬豬俠@163.com"  reg@gc.com
        ./send_mail.sh  -s "${SS}" -c "222 33" -o "-c admin@gc.com,zhu@gc.com      -b 豬豬俠@163.com"  reg@gce.com

5.6.6 將數據輸出為表格工具1

$ ./tools/format_table.sh --help

    用途:將數據輸出為表格
    依賴:
    注意:
        * 輸入命令時,參數順序不分先後
    用法:
        ./format_table.sh [-h|--help]
        ./format_table.sh <-d|--delimeter {分隔符}>  <-t|--title {字段名1, 字段名2, ...}>  <-r|--row {值1, 值2, ...}>  <-f|--file {文件x}    #--- 默認分隔符為【,】
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -d|--delimeter  : 表格分隔符,默認分隔符為【,】
        -t|--title      :標題,例如: 'aa, bb,cc'
        -r|--row        : 行,例如:'aaaa, bbbbb,cccc'
        -f|--file       : 表格文件名
    示例:
        #
        ./format_table.sh          -f 文件1          #--- 默認分隔符,標題與內容皆取自【文件1】
        ./format_table.sh  -d '|'  -f 文件1          #--- 分隔符為【|】,標題與內容皆取自【文件1】
        #
        ./format_table.sh  -d '|'  -t 'A|B|C'  -r 'aa|bb|cc'  -r 'vv| |xx'    #--- 定義標題,內容取自【'aa|bb|cc' ; 'vv| |xx'】
        ./format_table.sh  -d '|'  -t 'A|B|C'  -f 文件1                       #--- 定義標題,內容取自【文件1】

5.6.7 將數據輸出為表格工具2(彩色)

$ ./tools/draw_table.sh --help

    用途:將文件以表格的形式輸出
    依賴:
    注意:
        * 默認使用【\t】作為表格分隔符,如果是其他,請自行指定,否則會出錯;
        * 表格連標題一起至少2行,至少有一行有2個及以上的字段,否則出錯。
        * 輸入命令時,參數順序不分先後
    用法:
        ./draw_table.sh [-h|--help]
        ./draw_table.sh <-d|--delimeter {表格分隔符}>  <-s|--style [預定義樣式 | {%自定義樣式}]>  <-c|--color [預定義顏色前景,背景,文字 | {%自定義顏色}]>  < {文件名}
        echo -e "AB\na\tb ......" | ./draw_table.sh <-d|--delimeter {表格分隔符}>  <-s|--style [預定義樣式 | {%自定義樣式}]>  <-c|--color [預定義顏色前景,背景,文字 | {%自定義顏色}]>
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        %    : 代表通配符,非精確值,可以被包含
        #
        -d|--delimeter :定義表格列之間的分隔符,默認為【\t】
        -s|--style     :定義表格樣式,默認為【+++++++++,---|||】
                         # 前9位表示表格邊框,第10位表示填充字符,第11-13 表示行的上、中、下分隔符,第14-16表示列的左、中、右分隔符
                         s0  :'                '        s8  : └─┘│┼│┌─┐ ─ ─│ │
                         s1  : └┴┘├┼┤┌┬┐ ───│││         s9  : ╚╩╝╠╬╣╔╦╗ ═ ═║ ║
                         s2  : └─┘│┼│┌─┐ ───│││         s10 : ╚═╝║╬║╔═╗ ═ ═║ ║
                         s3  : ╚╩╝╠╬╣╔╦╗ ═══║║║         s11 : ╙╨╜╟╫╢╓╥╖ ─ ─║ ║
                         s4  : ╚═╝║╬║╔═╗ ═══║║║         s12 : ╘╧╛╞╪╡╒╤╕ ═ ═│ │
                         s5  : ╙╨╜╟╫╢╓╥╖ ───║║║         s13 : ╘╧╛╞╪╡╒╤╕ ═ ═│ │
                         s6  : ╘╧╛╞╪╡╒╤╕ ═══│││         s14 : ╚╩╝╠╬╣╔╦╗ ───│││
                         s7  : └┴┘├┼┤┌┬┐ ─ ─│ │         s15 : +++++++++ ---|||
                         # 自定義
                         以【%】開頭,比如:【%123456789 abcABC】
                         #
        -c|--color     :定義表格顏色,默認為【@4,@8,@4】,含義為【拐角顏色,文字顏色,表格顏色】,或理解為【背景,前景,表格】顏色
                         # 顏色定義:
                         @1|@black         @5|@blue
                         @2|@red           @6|@purple
                         @3|@green         @7|@cyan
                         @4|@yellow        @8|@white
                         # 組合顏色
                         1  : @2,@8,@3
                         2  : @2,@8,@5
                         3  : @2,@5,@8
    示例:
        # 表格輸入
        ./draw_table.sh  < 文件1                      #--- 將【文件1】輸出為表格,所有皆為默認
        echo -e AB\na\tb | bash ./draw_table.sh       #--- 將echo內容輸出為表格,所有皆為默認
        # 分隔符
        ./draw_table.sh        < 文件1                #--- 使用默認分隔符
        ./draw_table.sh  -t :  < 文件1                #--- 使用默認分隔符【:】
        ./draw_table.sh  -t |  < 文件1                #--- 使用默認分隔符【|】
        # 樣式
        ./draw_table.sh  -s s15                  < 文件1       #--- 使用表格樣式【s15】
        ./draw_table.sh  -s '%123456789 abcABC'  < 文件1       #--- 使用自定義表格樣式【%123456789 abcABC】
        # 顏色
        ./draw_table.sh  -c @red,@blue,@white              < 文件1       #--- 使用背景前景表格顏色為【紅,藍,外】
        ./draw_table.sh  -c @2,@5,@8                       < 文件1       #--- 同上
        ./draw_table.sh  -c 3                              < 文件1       #--- 同上
        ./draw_table.sh  -c \033[31m,\033[34m,\033[29m     < 文件1       #--- 同上
        #
        ./draw_table.sh  -t :  -s s15                        < 文件1     #--- 使用【:】作為分隔符,【s15】為表格樣式
        ./draw_table.sh  -t :          -c @2,@5,@8           < 文件1     #--- 使用【:】作為分隔符,【紅,藍,外】為表格顏色
        ./draw_table.sh        -s s15  -c @red,@blue,@white  < 文件1     #--- 使用【s15】為表格樣式,【紅,藍,外】為表格顏色
        ./draw_table.sh  -t :  -s s15  -c @red,@blue,@white  < 文件1     #--- 使用【:】作為分隔符,【s15】為表格樣式,【紅,藍,外】為表格顏色

5.6.8 釘釘消息發送工具

$ ./init/envs.sample/dingding_send_markdown.sh
# 用法: ./dingding_send_markdown.sh  --title='sssss'  --message="`cat mmm.txt`"
#        ./dingding_send_markdown.sh  --title 'sssss'  --message "$( echo -e "### 用户:${USER} \n### 時間:${TIME} \n\n" )"
#        ./dingding_send_markdown.sh  --title 'sssss'  --message "$( echo -e "### 用户:${USER} \n### 時間:`date` \n\n" )"
# 請將變量【dingding_api_url】修改為你自己的
$ ./init/envs.sample/dingding_conver_to_markdown_list.sh
# 用法: ./dingding_conver_to_markdown_list.sh "[Title]"
#        ./dingding_conver_to_markdown_list.sh "[Title]" "aaa"
#        ./dingding_conver_to_markdown_list.sh "[Title]" "aaa" "bbb"
#        ./dingding_conver_to_markdown_list.sh "[Title]" "aaa" "bbb" ... "<list>"
# 請將變量【api_url】修改為你自己的

5.6.9 登錄警報

$ ./init/send_login_alert_msg.sh

# 用途:用户登錄時發送消息通知
# 注意:腳本拷貝到/etc/profile.d/下
       # 自動從/etc/profile.d/zzxia-op-super-invincible-lollipop.run-env.sh引入以下變量,以實現IP白名單及其他依賴變量:
       # RUN_ENV=${RUN_ENV:-'dev'}
       # EMAIL=${EMAIL:-"kevinzu@xxx.com"}
       # TRUST_IPS=${TRUST_IPS:-'辦公室:111.111.111., 家:222.222.22'}
# 依賴:/etc/profile.d/zzxia-op-super-invincible-lollipop.run-env.sh
#       /usr/local/bin/dingding_send_markdown.sh
# 用法:
#      用户登錄時自動執行/etc/profile.d/下的腳本,包含本程序

5.6.10 舊docker鏡像清理工具

$ ./init/delete-docker-registry-image/clean_old_versions.py
$ ./init/delete-docker-registry-image/delete_docker_registry_image.py
# 用法(詳細請看README.md):
export REGISTRY_DATA_DIR="/srv/docker/docker_registry/data/docker/registry/v2" \
; cd /root/delete-docker-registry-image \
; ./clean_old_versions.py -s ./delete_docker_registry_image.py  -i gcl  -u https://127.0.0.1:5000 -l 30  -U ufipf -P 123456  --no_check_certificate \
; docker exec -ti dockerregistry_docker_registry_1   registry garbage-collect /etc/docker/registry/config.yml

5.6.11 pg數據備份還原工具

$ ./pg_backup_or_restore.sh --help

    用途:用於pg數據庫備份or還原,一次僅處理一個數據庫。
    依賴:
        /root/postgresql_daemon.sh
        /backup/pg/pg_backup_or_restore_by_user_postgres.sh
    注意:需在root賬户下運行,會自動設置訪問限制、刪庫、創建、導入、取消限制。
    用法:
        ./pg_backup_or_restore.sh  [-h|--help]
        ./pg_backup_or_restore.sh  [-b|--backup]   {PATH/TO/FILENAME}  {數據庫名}     #--- 備份,文件格式為gzip,備份時會自動在指定的名字後面自動加上.gz
        ./pg_backup_or_restore.sh  [-r|--resotore] {PATH/TO/FILENAME}  {數據庫名}     #--- 恢復,文件須為gzip格式
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        #
        -b|--backup      備份
        -r|--resotore    還原
    示例:
 ./pg_list_backup_or_restore.sh --help

    用途:用於pg數據庫備份or還原,僅備份或恢復pg_db.list中的數據庫。
    依賴:
        /root/postgresql_daemon.sh
        /backup/pg/pg_list_backup_or_restore_by_user_postgres.sh
    注意:需在root賬户下運行,在還原時會自動設置訪問限制、刪庫、創建、導入、取消限制。
    用法:
        ./pg_list_backup_or_restore.sh [-h|--help]
        ./pg_list_backup_or_restore.sh [-b|--backup]   <-d|--path-dir {備份目錄路徑}>   <-c<{目標路徑}>|--copy-to-path=<{目標路徑}>>   #--- 特別注意-c參數用法
        ./pg_list_backup_or_restore.sh [-r|--resotore] [-d|--path-dir {備份目錄路徑}]
        ./pg_list_backup_or_restore.sh [-s|--search]   <-p|--search-path {搜索父目錄}>  <-n|--search-name {搜索子目錄名}>
    參數説明:
        $0   : 代表腳本本身
        []   : 代表是必選項
        <>   : 代表是可選項
        |    : 代表左右選其一
        {}   : 代表參數值,請替換為具體參數值
        #
        -b|--backup          備份
        -r|--resotore        還原
        -s|--search          搜索備份,用來幫助選擇用以還原的備份
        -d|--path-dir        目錄,可以是相對或絕對路徑。在備份時,目標目錄必須是不存在的或者是空的,且可寫,默認路徑為./bak;在還原時,必須是已存在的,可讀
        -c|--copy-to-path    拷貝副本到新路徑,默認為/oss/backup/pg-pufi/${YEAR}
        -p|--search-path     指定搜索路徑,可以是相對或絕對路徑,默認為/oss/backup/pg-pufi/${YEAR}
        -n|--search-name     指定搜索子目錄名,支持模糊搜索,默認為修改日期最新的那個
    示例:
        # 備份:
        ./pg_list_backup_or_restore.sh  -b                          #--- 備份到默認目錄
        ./pg_list_backup_or_restore.sh  -b  -c./aa/bbb              #--- 備份到默認目錄,並拷貝副本到./aa/bbb目錄下
        ./pg_list_backup_or_restore.sh  -b  -d ./xxx                #--- 備份到./xxx目錄下
        ./pg_list_backup_or_restore.sh  -b  -d ./xxx -c./aa/bbb     #--- 備份到./xxx目錄下,並拷貝副本到./aa/bbb目錄下
        # 還原:
        ./pg_list_backup_or_restore.sh  -r  -d ./xxx/nnn            #--- 從./xxx/nnn還原數據庫
        # 搜索:
        ./pg_list_backup_or_restore.sh  -s                          #--- 在默認位置搜索最新的備份
        ./pg_list_backup_or_restore.sh  -s  -n nnn                  #--- 在默認位置搜索名字為nnn的備份
        ./pg_list_backup_or_restore.sh  -s  -p ./aaa/bbb            #--- 在./aaa/bbb目錄下搜索最新備份
        ./pg_list_backup_or_restore.sh  -s  -p ./aaa/bbb  -n nnn    #--- 在./aaa/bbb目錄下搜索名字為*nnn*的備份

6 後話

寫文檔是停費神的,將就看吧。如果你在使用中遇到任何問題請在Issues中提出,或留下聯繫方式線下溝通也可以。

mmexport1654556730558-2

寫文檔是停費神的,將就看吧。如果你在使用中遇到任何問題請在Issues中提出,或留下聯繫方式線下溝通也可以。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.