【问题标题】:Deployment strategies for Go services?Go 服务的部署策略?
【发布时间】:2013-08-05 00:40:47
【问题描述】:

我正在用 Go 编写一些新的 Web 服务。

无论目标平台如何,我都可以使用哪些部署策略?例如,我在 Mac 上进行开发,但登台/生产服务器将运行 Linux。

我可以使用一些现有的部署工具来支持 Go 吗?如果没有,我可以做些什么来简化流程?

我使用 LiteIDE 进行开发。有什么方法可以将 LiteIDE 挂接到部署过程中?

【问题讨论】:

    标签: deployment build ssh go remote-server


    【解决方案1】:

    不幸的是,Go 是一门如此年轻的语言,目前还不多,或者至少很难找到它们。我也有兴趣为 Go 开发此类工具。

    我发现有些人一直在自己做,或者他们已经adapted other tools, such as Capistrano为他们做。

    这很可能是您必须自己做的事情。而且您不必将自己限制在 shell 脚本中 - 在 Go 中执行!事实上,许多 Go 工具都是用 Go 编写的。您应该避免在目标系统上编译,因为在生产系统上使用构建工具通常是一种不好的做法。 Go 让交叉编译二进制文件变得非常容易。例如,这是为 ARM 和 Linux 编译的方式:

    GOARCH=arm GOOS=linux go build myapp
    

    您可以做的一件事是加入#go-nuts freenode IRC channel 或加入Go mailing list 并询问其他Gopher 他们在做什么。

    【讨论】:

      【解决方案2】:

      Capistrano 听起来像是单独部署的好主意。您也可以按照 Luke 的建议进行交叉编译。两者都可以正常工作。

      更一般地说...我在 OS X(开发)和 Linux(部署)之间也有些纠结,实际上我只是通过 VirtualBox 和 Vagrant 在虚拟机中进行开发。我正在使用 TextMate 2 进行文本编辑,但在 Mac 上安装许多开发工具只是一个主要的 PITA,而且我更喜欢在后台运行 Debian 等。好处是 - 这个虚拟环境可以镜像部署环境,所以我可以在部署代码时避免意外,无论是什么语言。

      【讨论】:

        【解决方案3】:

        我自己没有尝试过,但似乎你可以 cross compilegolang(使用 goxc 或 Dave Cheney 的 golang-crosscompile),尽管有一些注意事项。

        但是,如果您需要将环境与生产相匹配(可能大部分时间都应该这样做),那么按照 Marcin 的建议进行操作是最安全的。

        您可以在http://virtualboxes.org/images/ 上找到一些预构建的 VirtualBox 映像,尽管自己创建一个非常容易。

        【讨论】:

          【解决方案4】:

          我可以做些什么来简化流程?

          Go 1.5(2015 年第三季度)的交叉编译理念应该更具吸引力,正如“Cross compilation just got a whole lot better in Go 1.5”中的Dave Cheney 详细信息:

          之前:

          为了成功的交叉编译,您需要

          • 目标平台的编译器,如果它们与您的主机平台不同,即您使用的是 darwin/amd64 (6g) 并且您想要为 linux/arm (5g) 编译。
          • 目标平台的标准库,其中包括在构建 Go 发行版时生成的一些文件。

          之后(Go 1.5+):

          随着翻译Go compiler into Go 的计划在 1.5 版本中实现,第一个问题现已解决。

          package main
          
          import "fmt"
          import "runtime"
          
          func main() {
                  fmt.Printf("Hello %s/%s\n", runtime.GOOS, runtime.GOARCH)
          }
          

          为 darwin/386 构建

          % env GOOS=darwin GOARCH=386 go build hello.go
          # scp to darwin host
          $ ./hello
          Hello darwin/386
          

          或者为 linux/arm 构建

          % env GOOS=linux GOARCH=arm GOARM=7 go build hello.go
          # scp to linux host
          $ ./hello
          Hello linux/arm
          

          我在 Mac 上开发,但登台/生产服务器将运行 Linux。

          考虑到 Go 的编译器在 Go 中,从 Mac 生成 Linux 可执行文件的过程应该很简单。

          【讨论】:

            【解决方案5】:

            我现在可能有点晚了,但我最近写了一篇博客文章,介绍了我如何使用 Capistrano 部署 Go,并在我的本地计算机上进行交叉编译。

            如果您仍然感兴趣,请尝试http://thread0.me/2016/03/deploy-go-with-capistrano/

            【讨论】:

            • 链接已损坏。 502 错误网关