go體驗devops

lightTrace發表於2018-04-11

傳說中亞馬遜雲可以11.2s就進行一次專案的迭代,和之前的瀑布式開發以及敏捷式開發,在devops面前可以說都是小兒科!devops的工具鏈多的可怕,有機會再深入學習,今天簡單的用github的webhooks來嘗試下程式碼的實時提交部署執行自動化!

在github隨便見一個倉庫,取名newweb,然後clone下來,在克隆下來的newweb資料夾下新建webserver,在webserver下新建main.go檔案,如下程式碼:

package main

import (
    "io"
    "net/http"
)

func firstPage(w http.ResponseWriter, r *http.Request) {

    io.WriteString(w, "<h1>Hello,this is my deploy page2</h1>")

}

func main() {
    http.HandleFunc("/", firstPage)
    http.ListenAndServe(":8000", nil)
}

然後我們想把這個程式碼部署到正式的伺服器上,是不是要在本地編譯提交,然後在正式服上再clone一次,然後執行程式碼,才完成部署,這三步操作基本上都是人工進行的,如果迭代的速度很快,必然要重複這個動作!

有沒有一種可能,我們在本地提交成功,正式服就自動完成部署並啟動呢?

首先我們在正式服克隆下這個程式碼,在和newweb同級新建一個deployserver,在deployserver資料夾下新建main.go,這個main.go的作用主要就是來部署webserver,程式碼如下:

package main

import (
    "io"
    "log"
    "net/http"
    "os/exec"
)

func reLaunch(){
  cmd := exec.Command("sh","./deploy.sh")
  err := cmd.Start()
  if err !=nil {
     log.Fatal(err)
  }
  err = cmd.Wait()
}

func firstPage(w http.ResponseWriter, r *http.Request) {

    io.WriteString(w, "<h1>Hello,this is my deploy page</h1>")
    reLaunch()
}

func main() {
    http.HandleFunc("/", firstPage)
    http.ListenAndServe(":5000", nil)
}

我們看到reLaunch函式執行了一個deploy.sh的指令碼,它是這樣的:

kill -9 $(pgrep webserver)
cd ~/newweb/
git pull git@github.com:lightTrace/newweb.git
cd webserver/
go build
./webserver &

首先殺掉webserver的程式,然後進入newweb目錄,pull拉取程式碼後進入webserver目錄編譯最新的程式碼,然後執行。

有人說這不就是幾個組合的指令碼嗎?很簡單呀,是的,就是這麼簡單,當我們在deployserver編譯後檔案和deploy.sh一起剪下到和newweb平級的目錄下,並啟動./deployserver &

那麼我們直接在瀏覽器訪問ip:5000就完成了webserver的自動部署及啟動,如果我們在github的webhooks設定push event後就呼叫deployserver(ip:5000)的url,我們在本地推送程式碼到倉庫就可以直接完成伺服器的部署了

這裡寫圖片描述

雖然這個程式碼和流程很簡單,但我們明顯體驗到了一點點devops的感覺,起碼減少了重複的人工勞動,而且容錯機制幾乎為0,當然devops要學習的東西很多,我們暫時以點觀面,後面再深入學習。

ps:注意本地系統和線上系統不一樣的時候需要進行交叉編譯哦!(例如本地windows或者mac,伺服器環境卻是linux)

相關文章