溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何用faas實(shí)現(xiàn)issueops

發(fā)布時(shí)間:2021-07-29 22:37:17 來源:億速云 閱讀:138 作者:chen 欄目:云計(jì)算

這篇文章主要講解了“如何用faas實(shí)現(xiàn)issueops”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何用faas實(shí)現(xiàn)issueops”吧!

issueops?

聽過chatops,gitops還沒聽過issueops,顧名思義issueops就是在討論issue的時(shí)候把ops的事給干了,討論問題就把問題給解決,美哉。

kubernetes項(xiàng)目issue或者PR中會經(jīng)??吹竭@樣的東西: 如何用faas實(shí)現(xiàn)issueops

類似/kind feature 這樣的指令是給機(jī)器人看的,這里就要介紹一位非常勤奮的小伙伴了:

如何用faas實(shí)現(xiàn)issueops

他叫k8s-ci-robot,我想沒有誰的貢獻(xiàn)有他多了吧,這可不是刷出來的,都是實(shí)打?qū)嵉墓ぷ髁浚?/p>

如何用faas實(shí)現(xiàn)issueops

收到指令后robot就忙著打標(biāo)簽,驗(yàn)證提問題的有沒有cla認(rèn)證,分配review代碼的人等:

如何用faas實(shí)現(xiàn)issueops

然后懶漢們r(jià)eview完代碼就又吩咐機(jī)器人測試:

如何用faas實(shí)現(xiàn)issueops

小伙伴就一頓操作夢如虎的干了好多事情還不拿年終獎(jiǎng):

如何用faas實(shí)現(xiàn)issueops

以上,企業(yè)是不是發(fā)現(xiàn)養(yǎng)一個(gè)robot勝似招10個(gè)員工,是不是比疫情期間面向周報(bào)編程程序員靠譜多了~

Prow

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部署步驟大概如下:

  1. 申請一個(gè)github賬戶,給機(jī)器人用,推薦用獨(dú)立的賬號

  2. 有個(gè)k8s集群

  3. 配置權(quán)限,以及創(chuàng)建secret用于存儲github賬戶的token,調(diào)用github SDK需要用

  4. 啟動prow,就會得到一個(gè)http的地址

  5. 在你的github倉庫里配置,webhook指向prow地址

別忘了我們很窮,在家隔離馬上都要失業(yè)了服務(wù)器都買不起哪來的k8s集群?所以討論這么多prow有啥用!

接下來白嫖模式開啟

我們需要解決兩個(gè)問題:

  1. 免費(fèi)的計(jì)算資源跑http服務(wù),給github webhook調(diào)用

  2. 一個(gè)免費(fèi)跑job的平臺

免費(fèi)的httpserver

怎么去找一個(gè)免費(fèi)的http服務(wù)?我們自然把惡毒的目光投向函數(shù)計(jì)算:

如何用faas實(shí)現(xiàn)issueops 阿里云騰訊云都有免費(fèi)額度,而且這個(gè)量對于我這種小任務(wù)完全夠用了,這個(gè)羊毛不薅一把我簡直良心不安。

FaaS

很遺憾阿里云沒有默認(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è)地址了:

如何用faas實(shí)現(xiàn)issueops

把這個(gè)地址配置到github webhook中 如何用faas實(shí)現(xiàn)issueops

這基本問題就解決了,要注意函數(shù)計(jì)算日志配置有點(diǎn)小繞,這里不細(xì)提了

執(zhí)行任務(wù)

如果函數(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事件

先介紹一下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

drone promote對接FaaS

既然是觸發(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

如何用faas實(shí)現(xiàn)issueops

pipeline被執(zhí)行 如何用faas實(shí)現(xiàn)issueops

robot框架

當(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)注!

向AI問一下細(xì)節(jié)

免責(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)容。

AI