您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何用faas實(shí)現(xiàn)issueops”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何用faas實(shí)現(xiàn)issueops”吧!
聽過chatops,gitops還沒聽過issueops,顧名思義issueops就是在討論issue的時(shí)候把ops的事給干了,討論問題就把問題給解決,美哉。
kubernetes項(xiàng)目issue或者PR中會經(jīng)??吹竭@樣的東西:
類似/kind feature
這樣的指令是給機(jī)器人看的,這里就要介紹一位非常勤奮的小伙伴了:
他叫k8s-ci-robot,我想沒有誰的貢獻(xiàn)有他多了吧,這可不是刷出來的,都是實(shí)打?qū)嵉墓ぷ髁浚?/p>
收到指令后robot就忙著打標(biāo)簽,驗(yàn)證提問題的有沒有cla認(rèn)證,分配review代碼的人等:
然后懶漢們r(jià)eview完代碼就又吩咐機(jī)器人測試:
小伙伴就一頓操作夢如虎的干了好多事情還不拿年終獎(jiǎng):
以上,企業(yè)是不是發(fā)現(xiàn)養(yǎng)一個(gè)robot勝似招10個(gè)員工,是不是比疫情期間面向周報(bào)編程程序員靠譜多了~
Prow 就是robot的實(shí)現(xiàn),原理非常簡單,就是通過github webhook去監(jiān)聽github產(chǎn)生的事件,分析里面的指令去執(zhí)行對應(yīng)的job,它能干的幾個(gè)重點(diǎn)的事:
執(zhí)行任務(wù),特別是測試任務(wù)
合并代碼,你可能覺得這不就是點(diǎn)個(gè)按鈕的事嗎?其實(shí)不是,比如一個(gè)bug的修復(fù)可能要合并到很多個(gè)版本中,做起來枯燥且惡心,而且很多時(shí)候還是希望合并代碼時(shí)能做些額外的事,如通知,打標(biāo)簽等等
解析并執(zhí)行類似/foo
的指令,這很重要基本想干啥都行
一個(gè)前端用于顯示merge狀態(tài),任務(wù)等
Prow部署步驟大概如下:
申請一個(gè)github賬戶,給機(jī)器人用,推薦用獨(dú)立的賬號
有個(gè)k8s集群
配置權(quán)限,以及創(chuàng)建secret用于存儲github賬戶的token,調(diào)用github SDK需要用
啟動prow,就會得到一個(gè)http的地址
在你的github倉庫里配置,webhook指向prow地址
別忘了我們很窮,在家隔離馬上都要失業(yè)了服務(wù)器都買不起哪來的k8s集群?所以討論這么多prow有啥用!
接下來白嫖模式開啟
我們需要解決兩個(gè)問題:
免費(fèi)的計(jì)算資源跑http服務(wù),給github webhook調(diào)用
一個(gè)免費(fèi)跑job的平臺
怎么去找一個(gè)免費(fèi)的http服務(wù)?我們自然把惡毒的目光投向函數(shù)計(jì)算:
阿里云騰訊云都有免費(fèi)額度,而且這個(gè)量對于我這種小任務(wù)完全夠用了,這個(gè)羊毛不薅一把我簡直良心不安。
很遺憾阿里云沒有默認(rèn)的golang的函數(shù)模板,但是支持自定義環(huán)境,只要監(jiān)聽9000端口就行。
對于鄙視UI的我來說在頁面上創(chuàng)建函數(shù)丟不起這人,命令行工具fun必須要用:
函數(shù)配置信息
template.yml:
ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources: CRService: Type: 'Aliyun::Serverless::Service' Properties: Description: 'custom runtime demo' LogConfig: # 日志配置,需要與日志服務(wù)打通,這塊對新手體驗(yàn)不是太好 Project: 'sealyun' Logstore: 'robot' Policies: - AliyunLogFullAccess robot: Type: 'Aliyun::Serverless::Function' Properties: Handler: index.handler CodeUri: ./code.zip Description: 'demo with custom runtime' Runtime: custom Events: http_t: Type: HTTP Properties: AuthType: ANONYMOUS Methods: ['GET', 'POST', 'PUT', 'DELETE', 'HEAD'
代碼框架,body里就是github傳過來的events信息了:
func handler(w http.ResponseWriter, req *http.Request) { b,err := ioutil.ReadAll(req.Body) event := &issue.IssueCommentEvent{} ... } func main() { fmt.Println("FunctionCompute go runtime inited.") http.HandleFunc("/", handler) port := os.Getenv("FC_SERVER_PORT") if port == "" { port = "9000" } http.ListenAndServe(":" + port, nil) }
寫個(gè)簡單腳本去部署函數(shù):
函數(shù)啟動時(shí)只認(rèn)bootstrap二進(jìn)制文件,用zip格式打包,fun deploy時(shí)會提示一些accesskey相關(guān)的配置
go build -o bootstrap faas.go zip code.zip bootstrap fun deploy
部署完你的觸發(fā)器里就有個(gè)地址了:
把這個(gè)地址配置到github webhook中
這基本問題就解決了,要注意函數(shù)計(jì)算日志配置有點(diǎn)小繞,這里不細(xì)提了
如果函數(shù)計(jì)算的自定義環(huán)境足夠強(qiáng)大,那我們可以直接在函數(shù)里去執(zhí)行一些任務(wù),如編譯,測試等,但是這不太友好也不太現(xiàn)實(shí),不友好的地方是自定義環(huán)境的方式過于簡陋,比如你需要函數(shù)中調(diào)用git命令,那你只能放zip里一起打包,沒有像Dockerfile那樣靈活,也沒發(fā)現(xiàn)哪家能兼容Dockerfile的標(biāo)準(zhǔn)。 還有就是打包的東西太多可能函數(shù)的冷啟動會很慢。
同樣我還希望實(shí)現(xiàn)一些功能時(shí)不需要對機(jī)器人的代碼進(jìn)行變更,只需要修改一些外部配置或者腳本就可以實(shí)現(xiàn)不同的任務(wù)的處理。如此,drone來也
先介紹一下drone promote事件,允許我們通過http觸發(fā)pipeline中的一個(gè)動作。這個(gè)使用場景非常廣泛,典型的一個(gè)場景:我們的項(xiàng)目編譯發(fā)布結(jié)束之后需要上線,有兩個(gè)環(huán)境,開發(fā)環(huán)境,測試環(huán)境
pipeline配置中:
- name: dev image: golang:1.12 commands: - echo "部署到開發(fā)環(huán)境" when: event: - promote target: - dev - name: test image: golang:1.12 commands: - echo "部署到測試環(huán)境" when: event: - promote target: - test
這樣我們想先只在開發(fā)環(huán)境中部署,那么就執(zhí)行下面命令:
# drone build promote 項(xiàng)目 build編號 目標(biāo) drone build promote fanux/sealos 42 dev
這樣dev這個(gè)步驟就會被執(zhí)行,而test不會.
如果你是開源項(xiàng)目,那可以免費(fèi)的使用drone提供的公有服務(wù),又薅得一手好羊毛 cloud.drone.io
既然是觸發(fā)promote事件那下載下drone命令行就是了,何必又監(jiān)聽事件,又調(diào)用SDK繞一圈? 這就回到最開始的議題:我希望在討論問題時(shí)把問題解決。
我也喜歡把所有東西放在云端,壓根不想本地安裝drone客戶端,而且很多時(shí)候我可以在手機(jī)上發(fā)號施令。而且還希望執(zhí)行完后能回覆issue執(zhí)行結(jié)果等等
這里使用drone官方sdk即可:
// 創(chuàng)建client config := new(oauth3.Config) auther := config.Client( context.Background(), &oauth3.Token{ AccessToken: d.DroneToken, }, ) client := drone.NewClient(d.DroneServer, auther) // 觸發(fā)promote事件 _,err := client.Promote(namespace,name,cmd.Build,cmd.Target,cmd.Params)
namespace就是github用戶名或者組名,name是倉庫名,如 drone/drone-go 項(xiàng)目 drone就是namespace drone-go就是name Params是一個(gè)key value的參數(shù),會注入到pipeline的環(huán)境變量中,也是非常有用的。
把以上東西寫到FaaS中雛形就有了。
最終效果: 回復(fù)一下issue
pipeline被執(zhí)行
當(dāng)然我希望robot的功能擴(kuò)展性盡可能好,而且不僅僅能對接drone還可以對接其它的系統(tǒng),以及擴(kuò)展別的指令。所以我已經(jīng)寫好了一個(gè)框架:robot
只需要寫一個(gè)特定命令的特定處理器,然后注冊到框架中即可:
type Robot interface { Process(event IssueEvent) error }
注意要想Processor生效必須要注冊處理器 issue.Regist(命令,處理器)
以drone promote處理器為例:
// 結(jié)構(gòu)體包含drone服務(wù)器地址和token type DronePromote struct { DroneServer string DroneToken string } // 實(shí)現(xiàn)一下處理器接口 func (d *DronePromote) Process(event issue.IssueEvent) error { ... }
這里event會把issue中的命令解析好丟給你的處理器處理:
type IssueEvent struct { *IssueCommentEvent Command *Command Client *github.Client }
你只需要關(guān)心你的處理器要處理啥指令就行,比如使用promote處理器時(shí):
// github 把事件數(shù)據(jù)以json格式發(fā)送過來,已經(jīng)被解析到event結(jié)構(gòu)體中 func promote(ctx context.Context, event issue.IssueCommentEvent) (string, error) { // or using env: GITHUB_USER GITHUB_PASSWD // github 賬戶名和密碼,因?yàn)闄C(jī)器人可能還要回復(fù)issue什么的操作,這里建議單獨(dú)給機(jī)器人申請個(gè)賬號 // 不傳參數(shù)就會從環(huán)境變量中讀取 config := issue.NewConfig("sealrobot", "xxx") // regist what robot your need, and the robot config // 注冊一下你希望哪個(gè)機(jī)器人處理,因?yàn)橐粭lissue中可能會有很做指令,我們只關(guān)心/promote即可 // Drone的處理器需要知道drone的地址和token是什么 issue.Regist("/promote", &drone_promote.DronePromote{"https://cloud.drone.io", "QS3SmhZVpJAmb7tWPuWIOh4BhuI"}) // 處理issue err := issue.Process(config, event) return fmt.Sprintf("goversionecho %s", err), nil }
使用Regist注冊你的處理器,這樣這個(gè)處理器只會處理issue中"/promote ..."的指令:
issue.Regist("/promote", &drone_promote.DronePromote{"https://cloud.drone.io", "QS3SmhZVpJAmb7tWPuWIOh4BhuI"})
感謝各位的閱讀,以上就是“如何用faas實(shí)現(xiàn)issueops”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何用faas實(shí)現(xiàn)issueops這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。