GitHub Actionsをビルドおよびリリースパイプラインとして使用し、チームがSlackも使用している場合、Slackを離れる必要すらありませんか?Slackボットを作成して、Slackから直接GitHub Actionsワークフローを呼び出すように設定しましょう!
このチュートリアルでは、Hubotというボット構築ツールを使用して新しいSlackチャットボットを設定し、GitHub Actionsワークフローを自動的に開始してコードをサーバーにデプロイする方法を学びます。
さあ、始めましょう!
前提条件
このチュートリアルは実演形式です。一緒に進める場合は、次のものがあることを確認してください:
- A Slack Workspace
- A GitHub account and a GitHub personal token
- A Linux server to deploy code to – This tutorial will use Ubuntu 19.
- A local Linux machine – This tutorial will use Ubuntu so that all local commands will be Linux. If you’re running another operating system, the commands may be slightly different.
- サーバーに接続するためのSSH資格情報。
- A code editor of your choice that understands YAML like Visual Studio Code.
プロジェクトの作成とGitHub Actionsワークフロー
SlackからGitHub Actionsワークフローを簡単に呼び出す前に、まずワークフローを作成する必要があります。
ワークフローを作成するには、まずプロジェクトフォルダーを作成して、作業に使用するすべてのファイルを格納します。
1. お気に入りのターミナルアプリケーションを開きます。
2. 次に、以下のコマンドシリーズを実行して、プロジェクトフォルダーHubotを作成し、そのフォルダーに移動します。
3. 次に、npm init
を実行して、Node.JS package.jsonファイルを作成します。npm init
を実行すると、プロジェクトに関するさまざまな情報と依存するNPMパッケージに関する情報を含むpackage.jsonファイルが作成されます。
4. そして、workflowsディレクトリとdeploy.yml
ワークフローファイルを作成します。ワークフローファイルは、GitHub Actionsが従う一連のステップを定義したものです。
5. 次に、ワークフローが読み取るGitHubのシークレットをそれぞれ定義します。あなたが作成しようとしているワークフローは、これらのシークレットを参照します。SSHにサーバーアドレス、ユーザー名、パスワード、およびサーバーのポートが必要になるので、GitHubのシークレットを作成しましょう。
このURLhttps://github.com/yourusername/yourrepository/settings/secrets/actionsを訪問して、GitHubのシークレットを追加します。yourusernameをあなたのGitHubのユーザー名、yourrepositoryをあなたのGitHubのリポジトリに置き換えてください。
以下に示すように、新しいリポジトリのシークレットボタンをクリックして、追加するシークレットの情報を入力してください。

6. 次に、シークレットの名前と値のフィールドを入力し、[シークレットを追加] をクリックして保存します。ページはGitHubのシークレットページにリダイレクトされ、すべてのシークレットが表示されます。さらにシークレットを追加するには、前述の手順と同じく、[新しいリポジトリのシークレット] ボタンをクリックしてください。
指定された変数のシークレットを正確に同じ名前で保存してください。これらは、HOST、USERNAME、PASSWORD、およびPORTという同じ変数を参照するためです。


7. 最後に、コードエディターで~/Hubot/.github/workflows/deploy.ymlワークフローファイルを開き、以下のコードをコピー/貼り付けてください。以下のコードは、後でSlackを介してワークフローをトリガーするたびに実行されるワークフローです。
ワークフローを呼び出すと、いくつかのアクションが実行されます:
- GitHub Actionsは、以下のワークフローファイルを解析して、
HOST
シークレットで定義されたターゲットhost
にSSHできます。そして、USERNAME
およびPASSWORD
もシークレットで定義され、それらを使用しています。 - その後、ワークフローは特定のブランチ(
$branchName
)のGitHubリポジトリの内容をダウンロードします。これはgit pull origin$branchName
を実行することによって行われます。ブランチ名には、デプロイしたいコードが含まれていることを確認してください。 - あなたはWorkflow Packageを使用しています。これはGithub Marketplaceからのもので、ssh-remote-commandsと呼ばれています。このパッケージには、本番環境で実行するホスト、ユーザー名、パスワード、ポート、およびコマンドだけを提供する必要があるという便利なラッパーがあります。
サーバーには、GitHubリポジトリからコードをプルするために必要なログイン資格情報が含まれていることを確認してください。
ワークフローを手動で実行する
Slackから呼び出すためにGitHub Actionsのワークフローを作成しましたが、この時点ではコードはローカルマシン上にしかありません。ワークフローをトリガーするには、コードをGitHubにプッシュする必要があります。
以下のコマンドを実行すると、gitにコードをプッシュおよびプルすべき場所を指定します。以下のgit remote add origin
コマンドでは、yourusername
とyourrepository
をGitHubのユーザー名とリポジトリに置き換えてください。
まず、コードが正常に動作するかテストしましょう。人気のあるcurlユーティリティを使用してコードを手動で呼び出します。
以下のコマンドを実行して、GitHubリポジトリhttps://github.com/username/repository/dispatchesのURLにPOSTリクエストを送信し、先に作成したdeploy.ymlというワークフローファイルをトリガーするようGitHubに指示します。usernameを実際のGitHubのユーザー名、repositoryをGitHubのリポジトリに置き換えてください。
以下のコード内の$github_personal_token
を、個人のトークンで置き換えてください。
Hubot で Slack ボットを作成
GitHub アクションワークフローを手動でトリガーできたので、良いスタートです。これから、同じ手動手順を Slack ボットを介して自動化してみましょう。Slack ボットを作成し、コマンドを受け取って引数で GitHub アクションをトリガーします。
Slack ボットを作成する方法は2つあります。Scratch から作成するか、Slack ワークスペース用の事前ビルドされた hubot パッケージを使用するかです。このチュートリアルでは、Hubotと呼ばれる事前ビルドのボットパッケージを使用します。Hubot は、Slack、Discord、Gitter、TeamSpeak などのチャットサービスと統合されたオープンソースの自動化ツールです。
Hubotを使用せずにカスタムボットを作成するには、多くの時間がかかります。なぜなら、すべてのセットアッププロセス(Webフックの受信、ボットのホスティング)を自分で処理する必要があるからです。そのため、このチュートリアルでは、Hubot Slackアプリを使用してこれらのプロセスを簡略化します。
HubotのNpmによるインストール
Hubotを使用してSlackボットを作成するために、まずローカルマシンにHubotをダウンロードしてインストールします。Hubotは、SlackとGitHubのアクションをリンクするコネクタとなります。
1. ターミナルで、プロジェクトディレクトリ(~/Hubot
)に移動(cd
)します。
2. 次のnpm install
コマンドを使用して、yo
とgenerator-hubot
パッケージをローカルマシンにグローバルに(-g
)インストールします。 yoパッケージは新しいプロジェクトをインストールするために使用され、任意の言語(Web、Java、Python、C#など)のプロジェクトを生成します。 generator-hubotパッケージは、yoパッケージを使用してすべての依存関係と初期セットアップをインストールします。
インストールが完了すると、グローバルにインストールされたため、どこからでもyo
コマンドを実行できます。
3. 以下のコマンドで基本的なHubotのボイラープレートを作成します。ボイラープレートは、多くの場所に含まれるコードのセクションです。ボイラープレートがないと、常にゼロからコードを書く必要があります。
以下のコマンドは、プロジェクトディレクトリに基本的なHubotのボイラープレートを作成します。Hubotのボイラープレートは、Slack(--adapter=slack
)とリンクしているため、ボットはSlackチャンネル内のメッセージを受信し、応答することができます。yo hubot --adapter=slack
SlackワークスペースにHubotを追加する
Hubotがローカルマシンにインストールされたので、HubotをSlackとの通信に設定する必要があります。
SlackワークスペースにHubotをインストールしましょう。
1. ウェブブラウザを開き、https://workspacename.slack.com/admin/settingsのようなURLでSlackの管理設定に移動します。workspacenameを実際のSlackワークスペース名に置き換えてください。
左側のパネルでアプリの設定をクリックし、下の画像のようにHubotをマーケットプレイスで検索できるようにします。Slackには事前に作成されたアプリケーションがあるマーケットプレイスがあります。

2. 検索バーをクリックし、hubotと入力してマーケットプレイスでHubotを検索し、Hubotを選択します。
次に、下の画像に示すように、Slackに追加ボタンをクリックしてHubotをSlackワークスペースに追加します。

3. 最後に、Botの名前(deployerhubot)やアイコンなど、Botに関する一般情報を入力します。後でHubot DeployerでBotをアクティブ化する際に、APIトークンを控えておいてください。以前に作成したHubotプロジェクトからBotをアクティブ化するために使用します。

SlackとのGitHub Actionsワークフローの統合をテストする
SlackワークスペースにHubotがインストールされたので、Botをテストしてみましょう。まず、Botをアクティブ化する必要があります。
1. プロジェクトのルートディレクトリ内で以下のコマンドを実行して、Hubotリポジトリ(./bin/hubot
)からSlack(--adapter slack
)のためのBotをアクティブ化します。以前に控えた$token
をAPIトークンで置き換えてください。
2. 以下のコマンドを実行して、Bot(botusername
)をSlackチャンネルに招待(/invite
)します。ステップ3の「SlackワークスペースにHubotを追加する」セクションで登録したBotの名前でbotusername
を置き換えてください。
そして、Slackでテキストと一緒にBotをメンションして、@deployerhubot ping,のようにして、統合が機能しているかテストしてください。BotがPONGと応答した場合は、以下のように表示されます。それで準備完了です。

Botが応答しない場合は、WebブラウザでGitHubリポジトリに移動し、Actionsタブをクリックしてください。ラウンドの赤いチェックバッジが表示されているワークフローが失敗したことがわかります。失敗したワークフローをクリックして、失敗の原因を確認し修正してください。

以下、失敗が発生しているのを見ることができます:パスワードを使用してリモートSSHコマンドを実行する。 ワークフローを修正した後、ステップ3に戻って、BotがPONGと応答するかどうかを確認してください。

SlackからGitHubアクションワークフローを開始する
Slack Botを有効にしたら、SlackからGitHubアクションワークフローを開始する時間です!
指定されたブランチを指定されたサーバーにデプロイする柔軟性が必要です。指定されたブランチからコードをプルするようにします。誰かがSlackチャンネルで***@*bot deploy API feature-x to productionと入力すると、Botが自動的に応答するように教えます。環境名を検証できるようにします。後で、人々は特定の環境とブランチのみをデプロイできます。
Botの応答を自動化するには:
1. 〜/Hubot/scriptsという名前のディレクトリを作成します。 〜/Hubot/scriptsディレクトリは、GitHubワークフローをトリガするスクリプトを保存する場所です。
2. コードエディタで、〜/Hubot/scriptsディレクトリ内にbot.jsという名前のファイルを作成します。 次に、以下のコードをコピーしてbot.jsファイル内に貼り付けます。
以下のコードは、BotがSlackチャンネル上のチャットメッセージをリッスンし、次にワークフローをトリガしてSlackチャンネルに応答を送信することを可能にします。
3. 最後に、Slackで@botusername deploy api staging to devというメッセージを送信すると、以下のような応答が表示されます。
ワークフローファイルは、特定のブランチにコードをプッシュしたり、タグを作成したり、プルリクエストを作成したり、URLをリクエストしたりするなど、さまざまなGitHubイベントでトリガーされることがあります。

結論
このチュートリアルを通じて、GitHubワークフローについて、Slackでの応答のコードを手動でトリガーする方法からチャットボットの構築まで学びました。また、Slackにチャットボットを持つことで、GitHubアクションのワークフローを呼び出してタスクを自動化できることも学びました。
この新しい知識をさらに高め、リマインダーボットを追加するか、インタラクティブメッセージを作成するなど、どうでしょうか?