1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

KotlinでDiscord Botを始めてみる4 ~Herokuへのホスト編~

Last updated at Posted at 2021-06-25

はじめに

この記事は「KotlinでDiscord Botを始めてみる」第四弾です。
第一弾 : 環境構築と起動編
第二弾 : シンプルなコマンド実装編
第三弾 : Embed実装編
も併せてどうぞ

今回はBotの実装から少し離れて、運用面の解説をはさもうと思います。

用意するもの

  1. GitHubアカウント
  2. Herokuアカウント(クレジットカード登録していると尚良)
  3. Discord Bot用トークン

HerokuはGithubと相性が良く、GithubのリポジトリにあるソースコードをHerokuにデプロイ(動かすプログラムとして配置)することができます。
他のデプロイ方法もありますが、今回はGithubを使った方法を紹介します。

リポジトリの準備

私のGithubにテンプレートリポジトリを用意しました。
リポジトリページに有る Use this template をクリックして、自分のアカウント下にこのテンプレートベースのリポジトリを作ってください。
image.png

Herokuへのデプロイはプライベートリポジトリでも可能ですので、公開の有無は好みで設定できます。

  1. 作成したリポジトリをクローン
  2. クールなBotのソースコードを書き込み
  3. コミット
  4. プッシュ

リポジトリの編集において気をつけてほしいこと

テンプレートはHerokuにデプロイする上で必要な要件を満たして作られています。
リポジトリを編集するとき、上書きによって要件を破壊しないように気をつける必要があります。具体的には

.gitignore

.gitignoreテンプレートに既存するファイル追加しないでください!
これらのファイルはkotlinソースをHerokuがビルド・起動するのに必要です。.gitignoreに追加してしまうとまず失敗します。

build.gradle.kts

このファイルは極めて重要で、多くの役割を持ちます。Botに追加ライブラリを導入させるときに編集することがあるかもしれません。
しかし、以下に提示したブロックはHerokuに実行させるビルド手順が書かれています。
HerokuとGradle両方に詳しくない場合はこれらのブロックには手を触れないでください

tasks.register("stage"){
    dependsOn("clean","shadowJar")
}

tasks.withType<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>{
    archiveFileName.set("bot.jar")
}

application{
    mainClass.set("MainKt")
}

Procfile

Herokuにデプロイされたとき自動で実行されるコマンドを指定するものです。
テンプレート通りならデプロイされるとbuild.gradle.ktsの前述ブロックの指示通りビルドされた完成ファイルはbuild/libs/bot.jarに出力され、ここに記載されているコマンドがそのファイルを起動する、というカラクリです。
こちらもイジる必要はありません。

main.kt

main.ktのファイル名は変更しないでください。
Kotlinはプログラム実行時一番最初に呼ばれる部分(エントリポイント)を指定する必要があり、テンプレートのbuild.gradle.ktsmain.kt(正確にはmain.kt内のmain()関数)を指定しています。
例えばbot.ktに変更すると

application{
    mainClass.set("BotKt")
}

のようにエントリポイントを指定し直す必要があります。手間をかけて変えるメリットもないので触らないことを推奨します。

また、一番下のmain関数内にある

val token = System.getenv("Discord_Bot_Token")

Herokuの環境変数(後述)からトークンを取得する処理です。
トークンを直接ソースに書き込むのはデメリットが圧倒的に多いため、環境変数に格納されたものを読み込みましょう。
"Discord_Bot_Token"文字列はトークンを読み込むためのキーです。変更しても構いませんが、キーは後で使うので忘れないようにしましょう。

Herokuアプリケーション作成

作成したリポジトリをデプロイするための枠と考えてください。
Herokuダッシュボードにアクセスすると、空っぽのページの真ん中に Create new app というボタンがあります。
image.png
クリックして作成手続きを開始します。

  • App name : 自由に設定できますが、すでに使用されているアプリ名は使用できませんので、望み通りの名前が得られないことも多々あります。
  • Region: いじらなくて大丈夫です。

Create app クリック。

Githubとの連携

Herokuのアカウントを作ったばかりの場合、Githubとの連携が必要になります。
アプリページのDeploy タブにある Deployment methodGitHub を選択。
下に現れる Connect to GitHub をクリックしてください。image.png
GitHub認証画面が出たらログイン情報を入力、認証してください。

認証に成功すると、Githubのアカウント配下にあるリポジトリを検索できます。
image.png
準備したリポジトリがGithub上にあることを確認した上で、リポジトリ名を検索し、目的のリポジトリで Connect クリック。

Discordトークンを安全に設定

Botの起動にはトークンが必要不可欠です。
Githubのソースにトークンを直接書き込むことも可能ではありますが、

  • プライベートリポジトリでない場合非常に危険
  • プライベートに設定していてもうっかりパブリックにしてしまう可能性が0とは言い切れない
  • 万一の場合などトークンを書き換えたい場合ソースを変更→プッシュという手間がある

と、百害あって一利なし。強く非推奨です。
Herokuにはトークンを安全に格納する場所があります。

アプリページの Settingタブから Config Vars > Reveal Config Vars をクリック。

  • KEY : リポジトリをテンプレートから作成した場合はDiscord_Bot_Token
    変更した場合はソースで指定した環境変数キー
  • VALUE** : DiscordBotのトークン

Add をクリック。

デプロイ

接続に成功すると、以下のような画面になります。
まずは矢印で示した2箇所のブランチを確認しましょう。
大体の場合mainです。
image.png

Automatic deploys > Enable Automatic Deploys
Manual Deploys > Deploy Branch
それぞれクリック。

すぐ下にログがつらつら流れていきます。しばらくお待ち下さい。
Daemon will be stopped at the end of the build で止まることがありますが正常な動作です。
気長に待ってください。
具体的には、Deploy to Herokuが緑色になり、Your app was successfully deployed. と出れば成功です。
image.png

Botの起動

HerokuはデプロイしたプログラムをDynoと呼ばれるコンテナで動かします。
デプロイが成功してもDynoが有効になっていないとBotは起動できません。

デプロイが成功したら、一旦ページを更新して、Resourceタブに移動しましょう。
Free Dynos セクションに、デプロイ前はなかった1行項目があるはずです。
右端の鉛筆マークをクリックして
image.png
スライドを右に移動、Confirmをクリックします。
image.png
これでBotが起動します。

Botの更新

特別手続きは必要ありません。
リポジトリを書き換えてプッシュすると、自動で更新されたリポジトリをビルド、起動してくれます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?