将你的代码通过 GitLab CI / CD 提交到 Heroku
本篇以 Go 为例来教学如何利用 Heroku & GitLab 的 CI / CD 功能创建一个 Telegram Bot。
创建机器人
Telegram 的机器人需要在 @BotFather 处申请。申请的过程十分简单,只需要拿到一串 token 就好了,如图所示:
创建 Heroku App
在 Heroku 上创建 App 也是十分简单的,去控制台的右上角选择 New –> Create new app 即可。
输入名称,选择 App 的 location 之后点击 Create app 创建。创建之后,我们进入 Settings,找到 Config Vars,点击 Reveal Config Vars 进行环境变量的添加。我们需要添加以下三条:
- PORT,值为任意合法的端口(我填写
10808
)。 - PUBLIC_URL,值为你的 Heroku App 域名(我填写
mytelegram251bot.herokuapp.com
)。 - TGBot_TOKEN,值为你在 BotFather 处拿到的 token。
因为值为填写后自动保存,填写后点击 Hide Config Vars 即可。
创建项目
接下来,我们需要去 GitLab 实例里创建一个项目。你可以使用 GitLab 官方的实例,也可以使用第三方的实例。注意,如果使用第三方搭建的实例,确保该实例开启了 GitLab 的 CI/CD 功能,以及有设置好的 GitLab Runner。我在这里,就以由 cola 大老板赞助的 GitLab 实例进行演示。
如果希望项目对他人不可见的话,记得选择 Private。创建新项目之后,我们接下来就应该提交代码上去了。利用 Git 可以很方便的做到这一点:
git clone https://gitlab.com/<你的账号>/mytelegrambot.git
# 以我自己为例则为
git clone https://code.misakanet.cn/misaka00251/mytelegrambot.git
接下来,用你最喜欢的代码编辑软件打开这个目录,我们来编写一个很简单的 Telegram 机器人。在此之前,我们先要初始化 go module 以及获取需要用到的module:
go mod init mytelegrambot
go get -u -v gopkg.in/tucnak/telebot.v2
然后创建 main.go,我们在这里利用上面设置的环境变量设置一个 webhook:
package main
import (
"os"
tb "gopkg.in/tucnak/telebot.v2"
)
func main() {
var (
port = os.Getenv("PORT")
publicURL = os.Getenv("PUBLIC_URL")
token = os.Getenv("TOKEN")
)
webhook := &tb.Webhook{
Listen: ":" + port,
Endpoint: &tb.WebhookEndpoint{PublicURL: publicURL},
}
}
在设置好 webhook 之后,我们创建一个使用 webhook 查找消息更新的的 Poller:
package main
import (
"log"
"os"
tb "gopkg.in/tucnak/telebot.v2"
)
func main() {
var (
port = os.Getenv("PORT")
publicURL = os.Getenv("PUBLIC_URL")
token = os.Getenv("TOKEN")
)
webhook := &tb.Webhook{
Listen: ":" + port,
Endpoint: &tb.WebhookEndpoint{PublicURL: publicURL},
}
pref := tb.Settings{
Token: token,
Poller: webhook,
}
b, err := tb.NewBot(pref)
if err != nil {
log.Fatal(err)
}
}
然后,Bot 的初始化就完成了。我们来创建第一个命令吧~
b.Handle("/hello", func(m *tb.Message) {
b.Send(m.Sender, "Hi!")
})
如果用户发送了 /hello
命令,那么 Bot 就会发送 “Hi!” 给用户。是不是很简单呢?
为了获得用户的输入,我们需要用 m.Text
获取,而如果只想获取命令后面的输入,则需要用 m.Payload
获取:
b.Handle("/hello2", func(m *tb.Message) {
b.Reply(m, "You entered "+m.Payload)
})
不要忘记,在编写完你需要的命令之后,最后加上下面这一行让 Bot 开始接受传入请求哦~
b.Start()
编写 CI / CD 自动化操作
CI(Continuous Integration) 为持续集成,CD(Continuous Deployment) 为持续交付。
持续集成即在代码的构建过程中进行代码的构建以及自动化测试,而持续交付即在代码构建完毕之后部署新版本。
不过在编写自动化操作之前,我们需要去 GitLab 项目的 CI / CD 里设置一下环境变量。找到 Settings –> CI/CD,首先看到 Runners 一栏,如果有可用的 Available shared Runners,那么就可以继续进行下去,否则的话先联系你的 GitLab 实例管理员吧。
接下来,找到 Variables 设置栏:
我们需要添加以下两条:
- HEROKUAPIKEY,你在 Heroku 账号设置里的 API Key。
- HEROKUAPPPRODUCTION,你给 Heroku App 起的名字(我填写
mytelegram251bot
)。
接下来我们来编辑 .gitlab-ci.yml
:
在此仅写 CD 部分
stages:
- deploy
Production:
stage: deploy
image:
- ruby:2
script:
- gem install dpl
- dpl --provider=heroku --app=$HEROKU_APP_PRODUCTION --api-key=$HEROKU_API_KEY
environment:
name: Production
only:
- master
推送项目
在一切无问题之后,我们可以向 GitLab 远端仓库推送我们的项目啦:
git add .
git commit -m "Init"
git push
等待一小会之后,可以看到绿色的勾勾,代表我们成功的将代码推送到 Heroku 上了。
完整的 CI / CD 则可以做到这个样子,这里放出文件给大家参考:
从 Heroku 后台也可以看到,我们的代码已经成功在 Heroku 上构建了。
最后,访问你的 Bot 来看结果吧~
参考文档
- https://medium.com/swlh/how-do-i-deploy-my-code-to-heroku-using-gitlab-ci-cd-6a232b6be2e4
- https://dev.to/talentlessguy/create-and-deploy-golang-telegram-bot-2dl0
- https://gitlab.com/sj14/go-heroku
如果喜欢本文,欢迎点击下方的「鼓掌」按钮!
如果上面没有加载出任何东西,可以点击这里。
如果喜欢本文,欢迎点击下方的「鼓掌」按钮!
如果上面没有加载出任何东西,可以点击这里。