GitLab ChatOpsでGitLab CI/CDを起動する
今回はGitLab ChatOpsについて簡単に紹介します。
背景
GitLabはChatOpsを実現する手段としてSlack / Mattermostとの連携機能を提供しており、gitlab というslashコマンドを使うことでGitLabへのコマンドを実行します。
チャットツールからコマンドを実行すると、defaultブランチ上の .gitlab-ci.ymlファイルを読み取り、ファイル上のJobからChatOpsの条件に該当するものを検索します。該当するものがあれば、特定のJobだけを含むパイプラインを作成し、実行します。ただし、例えば該当Jobに when: manual の条件が付与されている場合、パイプラインを作るだけでJobの開始はしません。
GitLab ChatOpsは通常のGitLabと同様にCI/CD変数を利用します。ChatOps特有の変数として以下の3つが用意されており、Jobに渡すことができます。
CHAT_INPUT:runコマンド実行時に渡したargumentCHAT_CHANNEL: Jobを起動したチャットチャンネル名CHAT_USER_ID: Jobを起動したユーザーのチャットサービスID
Job実行後、Jobが30分以内に完了すれば、ChatチャンネルにJobの出力を送信します。30分以上かかったJobの出力を送信するには、Slack API等を使わなければなりません。
検証
ここからGitLab ChatOpsを検証します。今回は以前Slack for GitLab Appsで利用したProject を流用して行いました。Slack for GitLab AppsによるSlackとの連携はそちらをご確認ください。
まずは以下のような .gitlab-ci.yml を用意します。 rules:if キーワードで $CI_PIPELINE_SOURCE == "chat" と指定することでChatOpsでの実行をトリガーとします。
stages: - chatops hello-world: stage: chatops rules: - if: $CI_PIPELINE_SOURCE == "chat" script: - echo "Hello World"
上記ファイル作成後、以下のようなコマンドをSlackから実行します。
# コマンド: /gitlab <Project名> run <実行対象のJob名>
/gitlab fy0323/slack-notification-test run hello-world
この時点では上記コマンドからGitLab CI/CDは実行できません。以前はGitLabのイベントをSlackに流すだけでしたが、今回はSlackからGitLabにJob実行の命令を出します。Slack for GitLab Appsとの連携後にSlackから run コマンドを実行するには、GitLabアカウントとの接続が必要なようです。

Slack上のリンクをクリックすると以下のような画面が表示されるので 許可する を選択します。

ユーザー設定から チャット を確認すると、接続されているチャットのドメインなどが表示されます。

再度コマンドを実行します。しばらくすると Hello World という文字列が返されます。

先ほどのメッセージはJobの途中のログも含み、見づらいものでした。Slackに送信されるメッセージを見やすくするには、chat_reply セクションを使うと、指定した箇所だけをアウトプットできるよう修正できます。
stages: - test - chatops hello-world-at-job: stage: test except: - chat script: - echo "Hello World" hello-world: stage: chatops rules: - if: $CI_PIPELINE_SOURCE == "chat" script: - echo "This command will not be shown." - echo -e "section_start:$( date +%s ):chat_reply\r\033[0K\n$( ls -la )\nsection_end:$( date +%s ):chat_reply\r\033[0K"
修正後に再度Slackからメッセージを送ると、今度は ls -la の実行結果が見やすい形で返されます。

補足ですが、先ほどの hello-world JobはGitLabからは実行されません。例えば .gitlab-ci.yml を以下のように修正すると、追加したJobだけが実行される様子を確認できます。
stages: - test - chatops hello-world-at-job: stage: test except: - chat script: - echo "Hello World" hello-world: stage: chatops rules: - if: $CI_PIPELINE_SOURCE == "chat" script: - echo "Hello World"

なおSlack側にも以下のようなメッセージが表示されました。
