将你的代码通过 GitLab CI / CD 提交到 Heroku

本篇以 Go 为例来教学如何利用 Heroku & GitLab 的 CI / CD 功能创建一个 Telegram Bot。

创建机器人

Telegram 的机器人需要在 @BotFather 处申请。申请的过程十分简单,只需要拿到一串 token 就好了,如图所示:

申请 Telegram Bot.png

创建 Heroku App

在 Heroku 上创建 App 也是十分简单的,去控制台的右上角选择 New –> Create new app 即可。

创建 Heroku App.png

输入名称,选择 App 的 location 之后点击 Create app 创建。创建之后,我们进入 Settings,找到 Config Vars,点击 Reveal Config Vars 进行环境变量的添加。我们需要添加以下三条:

设置 Heroku App environment.png

因为值为填写后自动保存,填写后点击 Hide Config Vars 即可。

创建项目

接下来,我们需要去 GitLab 实例里创建一个项目。你可以使用 GitLab 官方的实例,也可以使用第三方的实例。注意,如果使用第三方搭建的实例,确保该实例开启了 GitLab 的 CI/CD 功能,以及有设置好的 GitLab Runner。我在这里,就以由 cola 大老板赞助的 GitLab 实例进行演示。

创建新项目.png

如果希望项目对他人不可见的话,记得选择 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 实例管理员吧。

查看可用 GitLab Runners.png

接下来,找到 Variables 设置栏:

设置 Variables.png

我们需要添加以下两条:

添加 Variables 之后.png

接下来我们来编辑 .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 上了。

CD 推送至 Heroku 成功.png

完整的 CI / CD 则可以做到这个样子,这里放出文件给大家参考

完整的 CI / CD 链.png

从 Heroku 后台也可以看到,我们的代码已经成功在 Heroku 上构建了。

Heroku 后台查看状态.png

最后,访问你的 Bot 来看结果吧~

参考文档


如果喜欢本文,欢迎点击下方的「鼓掌」按钮!

如果上面没有加载出任何东西,可以点击这里