传说中亚马逊云可以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)