CIZE:像 Gulp 一樣搭建一個 CI 服務
CIZE 是什麼?
CIZE 是一個「持續集成」工具,希望能讓開發人員更快捷的搭建一個完整、可靠、便捷的 CI 服務。
甚至可以像 Gulp 或 Grunt 一樣,僅僅通過一個 cizefile.js
即可完成幾乎所有的工作。
快速搭建
全局安裝
$ [sudo] npm install cize -g
編寫 Job
新建 cizefile.js
$ mkdir your_path
$ cd your_path
$ vim cizefile.js
輸入如下內容
//定義「項目」
const demo = cize.project('demo', {});
//定義一個 Job,這是一個最基礎的 Job
demo.job('hello', function (self) {
self.console.log('hello world');
self.done();
});
然後,在「工作目錄」中執行 cize
啟動服務
$ cize
Strarting...
The server on "localhost:9000" started
默認會啟動和 CPU 核數相同的「工作進程」。
接下來,可以在瀏覽器中訪問 https://localhost:9000
,
並可以在 UI 中手動觸發這個名為 hello
的 Job
定義 Project
const demo = cize.project('demo', {
...
//可以在此添加針對項目的配置
...
});
注意,即便一個項目不需要任何配置,也不能省略第二個參數,
沒有第二個參數時 cize.project(name)
為獲取指定的項目
定義 Job
假定現在已經有一個定義好的名為 demo
的 project
用 js 編寫的 Job
demo.job('test', function (self) {
self.console.log('test');
self.done();
});
這是最基礎的 Job 類型,是其它 Job 類型或「擴展」的基礎。
用 shell 編寫的 Job
demo.job('test', cize.shell(function () {
/*
echo "hello world"
*/
}));
定義一個用 SHELL 編寫的 Job,用到了 cize.shell,這是一個「內置擴展」
定時執行的 Job
demo.job('test', cize.cron('* */2 * * * *', cize.shell(function () {
/*
echo "hello world"
*/
})));
如上定義了一個每兩分種觸發一次的 Job 並且,嵌套使用了 shell.
監聽其它 Job 的 Job
demo.job('test2', cize.by('test1', function(self){
self.console.log('hello');
self.done();
});
如下,在 test1 執行成功後,將會觸發 test2
串行執行的 Job
demo.job('test', cize.series([
"test1",
function(self){
self.console.log('hello');
self.done();
},
"test3"
]));
series 是一個內置擴展,可以定義一個「串行執行」多個步驟的任務列表,每個步驟可以是一個任意類型的 job,
也可以是指定要調用的其它 Job 的名稱。
並行執行的 Job
demo.job('test', cize.parallel([
"test1",
function(self){
self.console.log('hello');
self.done();
},
"test3"
]));
series 是一個內置擴展,可以定義一個「並行執行」多個步驟的任務列表,每個步驟可以是一個任意類型的 job,
也可以是指定要調用的其它 Job 的名稱。
多步嵌套的 Job
CIZE 所有的 Job 可以自由嵌套,例如:
demo.job('test', cize.parallel([
"test1",
function(self){
self.console.log('hello');
self.done();
},
"test3",
cize.series([
"test4",
cize.shell(function(){
/*
echo hello
*/
})
])
]));
當你使用一個「外部擴展」時,也可以混合使用。
編寫一個擴展
如上用到的 cize.shell、cize.series、cize。parallel、cize.cron、cize.by 是 cize 默契認包含的「內置擴展」。
編寫一個「外部擴展」和「內置擴展」並無本質區別,如下:
module.exports = function(options...){
return function(self){
//處理邏輯
};
};
如查需要在 Job 定義時進行一些處理,可以使用 register
,如下
module.exports = function(options...){
return {
register: function(Job){
//Job 是你的「自定義 Job 類型」
//注冊時邏輯
},
runable: function(self){
//執行時邏輯
}
};
};
可以將擴展發布為一個「npm 包」,讓更多的人使用。
服務選項
可以通過一些選擇去控製 CI 服務的端口、密鑰等,有兩種方式,如下
在 cizefile.js 中配置
cize.config({
port: 9000,
secret: '12345'
});
通過命令行工具
cize ./ -p=port -s=secret
通過 cize -h 可以查看完整的說明
Usage:
cize [folder|file] [options]
Options:
-w set the number of workers
-p set the port
-s set the secret
-h display help information
Example:
cize ./ -p=9000 -s=12345 -w=4
更多內容
請訪問 wiki: https://github.com/Houfeng/cize/wiki
路線圖
- 所有 Job 都在單兒獨立在一個進程中執行(現在可能會有 n 個 job 共用一個主進程)
- 集成 Docker
最後更新:2017-05-22 10:02:58