auto deploy
一個兼容linux win32的軟體套件自動部署平臺
- server 套件服務器 提供了 套件管理 下載 等功能
- service 客戶端服務 和 server 通信 負責 客戶端的 套件 安裝/更新/運行/停止
快速導航
套件倉庫
-
套件倉庫 是一個 公共的 套件服務器 上面存儲了 各種的 套件 以及 套件的 不同版本
-
客戶可以 提供 使用 套件管理服務 從 套件倉庫中 安裝/下載/更新 套件
-
套件倉庫的 套件 可以設定權限 是否允許指定用戶 下載套件 (默認 允許 任何人下載)
-
auto-deploy-server 是套件倉庫的 主服務 以及 管理工具
創建一個 套件倉庫
auto-deploy-server daemon
指令 將運行一個 倉庫 -c 指定其配置 檔案
- linux 下默認的 配置檔案是 /etc/auto-deploy/server.jsonnet
- windows 下默認的 配置檔案是 auto-deploy-server所在檔案夾 + /etc/auto-deploy/server.jsonnet
$ ./auto-deploy-server daemon -h
run server as daemon
Usage:
server daemon [flags]
Flags:
-c, --configure string configure file (default "/etc/auto-deploy/server.jsonnet")
-h, --help help for daemon
下面是一個 linux下的 配置
{
// 服務器 配置
Server:{
// 服務器 工作地址
LAddr:"0.0.0.0:60000",
// 是否使用 ssl 加密
SSL:false,
// ssl證書 位置 (如果不使用 ssl 忽略此設置)
Crt:"/etc/auto-deploy/server.crt",
// ssl證書 key 位置 (如果不使用 ssl 忽略此設置)
Key:"/etc/auto-deploy/server.key",
// 服務器 管理密碼
Password:"12345678",
},
// 套件 倉庫 位置
Store:"/var/lib/auto-deploy",
// 數據庫設置
DB:{
// 連接字符串
Str:"AutoDeploy:12345678@/AutoDeploy?charset=utf8",
// 是否要顯示sql指令
Show:true,
//Show:false,
// ping 數據庫 間隔 單位 分鐘
Ping:60,
// 連接池 最大連接 < 1 無限制
MaxOpen:1000,
// 連接池 最大 空閒 連接 < 1 不允許空閒連接
MaxIdle:10,
// 如果為0 使用 默認值 如果小於0 將不啟用緩存
Cache:1000,
},
// Logger 日誌 配置
Logger:{
// 日誌 http 如果爲空 則不啓動 http
HTTP:"localhost:20000",
// 日誌 檔案名
Filename:"/var/log/auto-deploy/server.log",
// 單個日誌檔案 大小上限 MB
MaxSize: 100,
// 保存 多少個 日誌 檔案
MaxBackups: 3,
// 保存 多少天內的 日誌
MaxAge: 28,
// 要 保存的 日誌 等級 debug info warn error dpanic panic fatal
Level :"debug",
},
}
管理 套件
運行了 倉庫後 就可以在 倉庫中 創建/刪除 套件 爲套件設置下載權限
auto-deploy-server package
指令 會向 一個 倉庫 下達 套件 相關的 指令
$ ./auto-deploy-server package -h
package management
# create a new package named npkg
server package -i -n npkg -d "init example"
# update package description
server package -i -u npkg -d "update example"
# search package name like ?
server package -s -n %pkg%"
# remove package
server package -r -n npkg
# disable everyone download package npkg
server package -n npkg --delete *
server package -n npkg --add "-"
Usage:
server package [flags]
Flags:
--add string add a key allow download package key
-c, --configure string configure file (default "/etc/auto-deploy/server.jsonnet")
--delete string delete all match key
-d, --description string if (init) package description else if (add) key description
-g, --get get package info
-h, --help help for package
-i, --init init a new package
-n, --name string package name
-r, --remove remove a package
-s, --search search package name like ?
-u, --update update package description
管理 版本
套件 至少需要 存在一個 版本 套件管理服務 才可以將其 下載到 客戶端
auto-deploy-server version
指令 會向 一個 倉庫 下達 版本管理 相關的 指令
$ ./auto-deploy-server version -h
package version management
# create a new package version on current directory
version -i
# push new version to server
version -p
# update version info to server
version -u
# remove version
version -r vX.X.X --package pkg
# list package all version
version -l pkg
Usage:
server version [flags]
Flags:
-c, --configure string configure file (default "/etc/auto-deploy/server.jsonnet")
-h, --help help for version
-i, --init create a new package version on current directory
-l, --list string list package all version
--package string package name olny use on remove
-p, --push push new version to server
-r, --remove string remove a package version
-u, --update update version info to server
套件管理服務
- 套件管理服務 是運行在客戶端上的一個 服務程式 通過她 可以 完成 從 套件倉庫 下載安裝 套件的 功能
- 套件管理服務 提供了 套件的 自動 更新功能
- 套件管理服務 提供了 套件的 自動運行 和 包裝套件持續運行的 功能
運行套件管理服務
auto-deploy-service daemon
運行一個 管理服務 類似 server 其接收一個 -c 參數 指定 配置檔案
local Millisecond = 1000000;
local Second = 1000 * Millisecond;
local Minute = 60 * Second;
local Hour = 60 * Minute;
local Day = 24 * Hour;
{
// 服務配置
Service:{
// 服務器 工作地址
LAddr:"127.0.0.1:61000",
// 是否使用 ssl 加密
SSL:false,
// ssl證書 位置 (如果不使用 ssl 忽略此設置)
Crt:"/etc/auto-deploy/service.crt",
// ssl證書 key 位置 (如果不使用 ssl 忽略此設置)
Key:"/etc/auto-deploy/service.key",
// 服務 管理密碼
Password:"12345678",
},
// 套件 服務器 配置
Server:{
// 服務器 工作地址
Addr:"192.168.16.50:60000",
// 是否使用 ssl 加密
SSL:false,
},
// 套件 設置
Apps:{
// 倉庫 位置
Store:"/var/lib/auto-deploy/app",
// 停止進程 超時時間
Kill:Minute,
// 套件 自動更新 時間 如果爲空則 不自動更新
// #分鐘 小時 號數 月份 周星期
// #[0,59] [0,23] [1,31] [1~12] [0,7] 0==7==星期天
Update:[
"* 2 * * *", // 每天 晚上 2點 更新
"* 2 * * 0", // 每週 星期天 晚上 2點 更新
"* 2 1 * *", // 每月 1 號 晚上 2點 更新
// 無效的定義會被直接 忽略
"",
],
// 如果爲 true 則會 禁用 套件自動 更新 功能
//DisableUpdate:true,
},
// Logger 日誌 配置
Logger:{
// 日誌 http 如果爲空 則不啓動 http
HTTP:"localhost:20001",
// 日誌 檔案名
Filename:"/var/log/auto-deploy/service.log",
// 單個日誌檔案 大小上限 MB
MaxSize: 100,
// 保存 多少個 日誌 檔案
MaxBackups: 3,
// 保存 多少天內的 日誌
MaxAge: 28,
// 要 保存的 日誌 等級 debug info warn error dpanic panic fatal
Level :"debug",
},
}
管理套件
套件 管理 命令 模仿 了 ubuntu 的 apt 操作基本類似
./auto-deploy-service -h
auto-deploy service
Usage:
service [flags]
service [command]
Available Commands:
daemon run service as a daemon
download download packages
exit notification service exit
help Help about any command
install install packages
keys return keys
list list all installed package
merge test merge script
mode change application run mode or update mode
remove remove packages
search search package
show display detailed information about a package
start start package
stop stop package
update update package
Flags:
-h, --help help for service
-v, --version show version
Use "service [command] --help" for more information about a command.
# 查找/安裝/刪除/更新 套件
auto-deploy-service search gcc cmake
auto-deploy-service install gcc cmake
auto-deploy-service remove gcc cmake
auto-deploy-service update gcc cmake
# 停止/運行 套件
auto-deploy-service start gcc
auto-deploy-service stop gcc
# 現在 已安裝 套件
auto-deploy-service list
auto-deploy-service show gcc cmake
# 改變 套件 運行模式/更新模式
auto-deploy-service mode -r manual -p gcc
auto-deploy-service mode -u auto -p gcc
# 通知 管理服務 停止所有套件 並退出
auto-deploy-service exit
auto-deploy-service key
auto-deploy-service key
指令會 返回網卡指紋 可以在 倉庫中設置 key 來 只允許 指定客戶 下載套件
安裝
- 下載編譯好的/或參照說明自行編譯 auto-deploy-server 和 auto-deploy-service
- 對於 service 需要 安裝好 mariadb 或 mysql
- auto-deploy-service daemon 運行 倉庫
- auto-deploy-server daemon 在客戶端 運行 管理服務
build on linux
- 安裝好 grpc 環境
- 下載 源碼
go get https://gitlab.com/king011/auto-deploy.git
- 生成 grpc 代碼
./build-pb.sh
- 編譯 server
cd server && ../build-go.sh -o ../bin/auto-deploy-server
- 編譯 service
cd service && ../build-go.sh -o ../bin/auto-deploy-service
build on win32
- 安裝好 msys2 gcc 環境
- 安裝好 grpc 環境
- 下載 源碼
go get https://gitlab.com/king011/auto-deploy.git
- 生成 grpc 代碼
./build-pb.sh
- 編譯 server 在msys2中執行
cd server && ../build-go.sh -o ../bin/auto-deploy-server.exe
- 編譯 service 在msys2中執行
cd service && ../build-go.sh -o ../bin/auto-deploy-service.exe
爲什麼 msys2-pb.sh 不能和 build-pb.sh 一樣直接 生成 grpc 代碼
google提供的 grpc工具 在 msys2下 不知道爲何 生成的 grpc代碼 有問題 必須要在 win32 的提示符下才能生成 正確代碼
至於爲什麼 不手寫 msys2-pb.bat 查找 grpc 定義文件 理由很簡單 我不會 也不用 更不想學 win32的狗屎命令 如果不是要用到 公司的win32項目 這個程式 我都不會想支持 win32
auto-deploy.json
此檔案 定義了 套件的 版本和 描述信息
process.js
此 腳本 需要 導出一個 exports.Service 數組 數組的每個元素 定義了如何 啓動和結束一個進程 如下示例
// this scripts define package's process
// variable __dirname is package installed path
// named __dirname for cosplay nodejs, but environment not nodejs, it's duktape
// https://duktape.org/api.html
var dir = __dirname;
// exports cosplay nodejs
// export Service array, it's process group.
exports.Service = [
// every element is a process
{
// how to start process
Start: [dir + "/main.js"],
//Start: [dir + "/main.js" , "daemon"],
// how to stop process, if invalid will kill process
Stop: undefined,
//Stop: [dir + "/main.js" , "kill"],
// work directory, if invalid will use parent's work directory.
Dir: dir,
},
]
- __dirname 變量 是 套件的 安裝位置 你需要使用 這個變量 找到你自己的 可執行檔案
- Start 是必須的 它是一個 字符串 數組 第一個元素 是可執行檔 路徑 其它是 傳入的 參數
- Stop 是可選的 如果 它是 一個 字符串 數組 則執行此程序 結束進程 否則 強制關閉進程
- Dir 的 Start 進程的 工作目錄 通常你應該指定爲 __dirname
__dirname 和 exports.Service 名字是 爲了 符合 nodejs 的習慣 但js並不運行在 nodejs下 而是運行在 duktape 的golang 環境中
nodejs 對於此項目來說 太大 並且 不容易集成到 golang中 以及方便的 跨平臺
install.js merge.js
install.js
install.js 是可選的 安裝腳本 需要 導出一個 exports.Install 函數
- 當 安裝一個 套件時 會自動 調用 此函數
- 如果 此函數 throw 異常 則會導致 安裝失敗
- install.js 中 有一個 全局的 utils 對象 提供了一些 輔助 升級的 函數
merge.js
merge.js 是可選的 升級腳本 需要 導出一個 exports.Merge 函數
- 當 升級一個 套件時 會自動 調用 此函數
- 如果 此函數 throw 異常 則會導致 升級失敗
- merge.js 中 有一個 全局的 utils 對象 提供了一些 輔助 升級的 函數
utils/test/dst 中 包含數個 *.js 是一些 測試示例
utils
install.js 和 merge.js 有一個 utils 全局對象 實現了 一些 輔助 函數 方便 自定義 安裝/升級 套件
// windows linux darwin freebsd
prop OS:string
// 386 amd64 arm
prop ARCH:string
// 返回 檔案 是否 存在
function IsFileExist(filename:string):boolean
throw e
// 返回 filename 的最短 名稱
function Clean(filename:string):string
throw e
// 返回 是否是絕對路徑
function IsAbs(filename:string):boolean
throw e
// 返回 絕對路徑 Abs 會在結果前 調用 Clean
function Abs(filename:string):string
throw e
// 返回 路徑的 檔案夾名稱
function Dir(filename:string):string
throw e
// 返回 路徑的 最後一個元素
function Base(filename:string):string
throw e
// 加載 檔案 並轉化爲 字符串
function LoadFile(filename:string):string
throw e
// 保存 檔案
function SaveFile(filename:string,data:string,mode?:uint32)
throw e
// 將 jsonnet 字符串 編譯爲 json 字符串
function CompileJSONNET(filename:string):string
throw e
// 執行 指定進程並 等待其運行結束
function Exec(exec:string,args...:string)
throw e
// 將 xml 字符串 轉爲 js object
function ParseXML(src:string):object
throw e
// 將 ini 字符串 轉爲 js object
// Section = {
// Comment:XXX:stirng,
// Item:{
// Keyname...:{
// Val:XXX:stirng,
// Comment:XXX:stirng,
// },
// ...
// }
// }
// object = {
// main:Section,
// section:{
// sessionName...:Section,
// ...
// }
// }
function ParseConf(src:string):object
throw e