關於 web service, unity, blogger 等軟體工程筆記

Heroku with Golang,如何部署第一個 WebApp

Edit icon 沒有留言
Heroku with Golang

Heroku 是一套支援多程式個語言的雲平台即服務 (platform as a service, PaaS),只要將程式碼上傳到該服務中,便可上頭自動編譯執行,建造自己的網路應用程式,且該服務提供免費試用方案 (有限制的),又有支援 SSL (https)。

先到 Heroku.com 官方網站註冊帳號,根據官方手冊安裝必須要的 Heroku Cli,並且版本控制軟體 Git,完成準備的前置作業。

理解 Heroku 更新運作概念後,覺得其機制相當直覺與方便,每個運作在 Heroku 的 WebApp 都有一份自己的 Git repo. (repository),在本機端初始 git repo. 後,利用 git commit 將程式碼加入本機 repo. 控管,然後進行 git push 將資料送到遠端的 Heroku git repo.,Heroku 再收到資料後,便開始展開編譯建置,然後部署在其伺服器上。

將 webapp 程式碼透過 git 上傳到 heroku 上

將 webapp 程式碼透過 git 上傳到 heroku 上

部署範例

以下全部都在 CommandLine 環境運行,確保擁有設定好的 Go 安裝環境:

  • 環境變數 $GOROOT 有設定
  • 環境變數 $GOPATH 有設置
  • 環境變數 $PATH 有加入 $GOROOT/bin 以及 $GOPATH/bin 的路徑

為了確保 Heroku 能夠判斷上傳的 Go 專案,需要使用指定的相依性工具來管理,目前支援 depgbgovendor、或是 godep,更多細節可參考 Heroku Go Support

以下筆記採用 dep 來管理 Go 專案,參考該工具的說明文件安裝最新版本:

go get -u github.com/golang/dep/cmd/dep

準備 Web App 專案,使用簡單的 main.go 範例:

package main
import (
   "fmt"
   "net/http"
   "os"
)
func main() {
   port := "80"
   if v := os.Getenv("PORT"); len(v) > 0 {
      port = v
   }
   h := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
      name := req.URL.Query().Get("name")
      if len(name) <= 0 {
         name = "stranger"
      }
      fmt.Fprintf(w, "Hello, %s.", name)
   })
   http.ListenAndServe(":"+port, h)
}

在 main.go 所在資料夾,執行 Go dependency 初始化:

$ dep init

並且修改 Gopkg.toml 設定,加入以下 root-package 設定,更多細節可參考 Go Dependencies via dep

[metadata.heroku]
  root-package = "main"

然後初始化 Git repository:

$ git init
Initialized empty Git repository in C:/go/src/example/.git/

將專案檔案提交到該 git repository:

$ git add main.go Gopkg.lock Gopkg.toml
$ git commit -m "your commit message"

接著登入 Heroku:

$ heroku login
Enter your Heroku credentials.
Email: example@twsiyuan.com
Password: **********
Logged in as example@twsiyuan.com

要求建立一個指定名字的 Heroku App,若名稱已被使用,將會回傳錯誤;若沒有指定名稱,會隨機產生一組名稱:

$ heroku create twsiyuan-example
Creating example... done
https://twsiyuan-example.herokuapp.com/ | https://git.heroku.com/twsiyuan-example.git

使用上述指令,heroku 會自動在目前 git repository 加入 remote heroku 的設定:

$ git remote -v
heroku  https://git.heroku.com/twsiyuan-example.git (fetch)
heroku  https://git.heroku.com/twsiyuan-example.git (push)

或是手動執行指令,讓 heroku 設定 git remote 位置:

$ heroku git:remote --app twsiyuan-example
set git remote heroku to https://git.heroku.com/twsiyuan-example.git

使用 git push,將資料推送到遠端的 Heroku:

$ git push heroku master
...
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Go app detected
...
To https://git.heroku.com/twsiyuan-example.git
* [new branch]      master -> master

最後,要求開啟 Web app,查看部署結果:

$ heroku open
佈署到 Heroku 的展示結果

佈署到 Heroku 的展示結果

Referecne

沒有留言: