欢迎回到我们的文章系列有关 golang in Zerops !如果您错过了上一篇文章,请查看Building a Simple TODO App with Gin-gonic in Zerops: A step-by-step Guide以了解基础知识。
在这篇文章中,我们将重点介绍您在Zerops中自己的应用程序 。您需要做的就是将koude0配置文件添加到应用程序的根目录中。我们将通过文件详细介绍,以便它最适合您的应用程序。
1.在零件中设置您的项目
如果您已经熟悉Zerops,请随时跳过本节。
完成以下步骤,以准备您的应用程序:
请注意项目和服务的名称,您将需要它们以备将来参考。对于我们的示例应用程序,我们创建了一个名为 myproject 的项目和一个称为 helloworld 的Golang服务。
1.1。管道触发(GUI/ZCLI)
准备好zerops.yml
后,有两个选择触发构建和部署管道:
GIT集成 + Zerops Gui
推荐当您的应用程序源代码已经在A git 存储库中版本时。在Go服务的详细信息中,转到 build , exploy ,运行管道设置,与github或gitlab存储库连接,根据您的需要激活管道触发。
ZCLI
如果命令行是您最好的朋友,或者最好适合您的用例,则可以:
- 安装zCLI
- 使用GUI 生成的access token登录到ZCLI
- 运行
zcli push <project_name> <service_name>
command(在我们的情况下是zcli push myProject helloworld
)
尽管如此,一旦触发管道,您就可以在Zerops GUI中遵循其进度,并提供更多信息。
1.2。示例应用程序
选择最简单的示例是为了消除在尝试零之前在本地测试应用程序的需求。
您非常欢迎您在Zerops中构建,部署和运行在Zerops中进行仅作为指南。
。
我们的示例应用程序是对著名的hello hello,world!只有一个文件,main.go
。 main
函数首先将getHelloWorld
处理程序函数设置为/hello-world
Path,然后使用Gin-Gonic库启动HTTP服务器。 getHelloWorld
函数只会打印“你好,世界!”。该服务器正在侦听8080
端口,这是为Zerops中的GO Services创建的默认port。
package main
import (
"fmt"
"log"
"net/http" "github.com/gin-gonic/gin"
)
func main() {
fmt.Println("Running http server")
router := gin.Default()
router.GET("/hello-world", getHelloWorld)
log.Fatal(router.Run(":8080"))
}
func getHelloWorld(c *gin.Context) {
fmt.Println("received /hello-world request\n")
c.String(http.StatusOK,"Hello, World!")
}
我们还需要初始化a go模块,该模块创建go.mod
和go.sum
文件。您可以自己做,也可以从我们的存储库中复制内容。项目结构如下:
myProject
├── go.mod
├── go.sum
├── zerops.yml
└── main.go
2.解释了建造和部署管道
首先,我们将说明该过程,然后在编辑zerops.yml
文件时说明关键词。一切都从图像开始。它是通过将base
映像与prepare
命令组合在一起而创建的,或者如果没有更改(其中还包含您的cached
文件),则从以前的构建中加载了从缓存中加载。然后在“构建”容器中运行图像。之后,执行了所有build
命令,并创建了部署工件。它被“部署”到另一个“运行时”容器,在该容器中运行。
现在,让我们查看zerops.yml
文件的build
部分,您可以在其中自定义上面的GO服务过程。请注意,服务名称是zerops.yml
文件中的根键。
helloworld:
build:
base: # optional
prepare: # optional
build: # required
deploy: # required
cache: # optional
run:
...
要构建您的GO应用程序,您绝对需要运行go build ...
命令。这就是所需的构建部分的目的!以下命令将带有单个main.go
源文件的软件包编译成一个名为app
的可执行文件。
...
build:
- go build -o app main.go
...
那是吗?好吧,目前命令将失败,因为我们尚未安装go
并设置环境。为了节省您的麻烦查找正确的软件包并完成安装过程,Zerops创建了几个 base 图像,其中最常见的依赖项预先安装了,例如 go 和 git in go@1
基础图像:
...
base: [go@1]
build:
- go build -o app main.go
...
如果您需要使用旧版本或想要以任何方式自定义依赖项,请使用prepare部分。它是为您可能需要执行的任何命令而设计的,才能成功运行构建命令。例如,您是否考虑到git
或wget
?没问题,这是一个例子:
...
prepare:
-|
add-apt-repository ppa:longsleep/golang-backports
apt update
apt install -y golang-1.17 git wget
ln -s /usr/lib/go-1.17/bin/go /usr/bin/go
ln -s go-1.17 /usr/lib/go
build:
- go build -o app main.go
...
zerops.yml
文件的 build 部分中的另一个必需键是deploy。您需要让Zerops知道需要将哪些文件或文件夹部署到运行应用程序的容器。在我们的情况下,我们只需要可执行的app
。该值是一系列路径,允许您部署单个文件或整个文件夹,有关所有支持格式,请参见documentation。
...
build:
base: [ go@1 ]
build:
- go build -o app main.go
deploy: [ app ]
...
构建部分的最后一部分是可选的cache。每次构建后,基本图像的结果图像并准备命令将被缓存并下次使用,如果zerops.yml
的这些部分没有任何更改。但是,您项目根目录中的所有文件都会丢弃,除非您明确告诉Zerops也可以缓存。在GO服务中,与A node.js Service中的node_modules
文件夹相比,缓存不会大大加速构建过程。但是,让我们看看我们如何也可以缓存依赖项 - ,但仅以一个例子!
除了.git
文件夹外,还可以缓存项目根目录中的任何文件和文件夹。由于存储GO模块的默认文件夹是~/go/pkg/mod
,因此我们需要将其更改为例如。 $(pwd)/mod
(工作目录默认为项目的根),然后我们可以缓存此文件夹。预期格式与部署相同。
...
build:
base: [ go@1 ]
build:
- go env -w GOMODCACHE=$(pwd)/mod
- go build -o app main.go
deploy: [ app ]
cache: [ mod ]
...
要检查是否应用了缓存,您应该在日志中看到依赖项仅在第一个构建过程中下载。
现在我们完成了!最后一件事是run您已部署的代码。 GO Services的唯一需要的密钥是start
,其值有望是启动您应用程序的命令,例如./app
在我们的示例中运行app
。
构建,部署和运行我们的helloworld应用程序的完整工作zerops.yml
文件如下:
helloworld:
build:
base: [ go@1 ]
build:
- go build -o app main.go deploy: [ app ]
run:
start: ./app
要确保应用程序启动并运行,请在Golang服务细节中打开Runtime log部分。
如果您遵循了我们的示例,或者运行自己的HTTP服务器,则还可以通过enabling a subdomain(用于开发目的)或setting up your domain进行测试。无论哪种方式,当提出/hello-world
请求时,您应该看到“你好,世界!”印刷。
简单,对吗? :)我们很清楚现实生活中的应用程序将更加复杂。如果您有任何问题,请加入我们的Discord server,以提出任何问题和/或与他人分享您的解决方案。还要检查我们的documentation以了解有关Zerops的更多信息。
我们期待看到您自己的管道运行!
结论(TL; DR)
-
总是指定
build
命令 - 使用预定义的
base
图像或指定自定义prepare
命令来构建您的应用 - 或两者兼而有之! -
始终指定要
deploy
到运行时容器 的文件
- 您可以选择
cache
任何已部署的文件以加快未来构建