GitLab ChatOps

GitLab ChatOpsを使って、Slackのようなチャットサービスを通してCI/CDジョブとやりとりしましょう。

多くの組織では、コラボレーション、トラブルシューティング、作業計画のためにチャットサービスを使用しています。ChatOps を使えば、チームと作業について議論したり、CI/CD ジョブを実行したり、ジョブの出力を見たりすることが、すべて同じアプリケーションからできます。

ChatOpsワークフローとCI/CD設定

ChatOpsはプロジェクトのデフォルトブランチ上の.gitlab-ci.yml 、指定されたジョブを探します。ジョブが見つかった場合、ChatOpsは指定されたジョブのみを含むパイプラインを作成します。when: manualを設定した場合、ChatOpsはパイプラインを作成しますが、ジョブは自動的に開始しません。

ChatOpsで実行されるジョブは、GitLabから実行されるジョブと同じ機能を持っています。ジョブはGITLAB_USER_ID のような既存のCI/CD変数を使用して追加の権限検証を行うことができますが、これらの変数はオーバーライドすることができます。

ジョブが標準的なCI/CDパイプラインの一部として実行されないように、rules

ChatOpsは以下のCI/CD変数をジョブに渡します:

  • CHAT_INPUT - /project-name run に渡される引数。
  • CHAT_CHANNEL - ジョブが実行されるチャットチャンネルの名前。
  • CHAT_USER_ID - ジョブを実行するユーザーのチャットサービスID。

ジョブ実行時

  • ジョブが30分以内に完了した場合、ChatOpsはジョブの出力をチャットチャンネルに送信します。
  • ジョブが30分以上で完了した場合は、Slack APIのようなメソッドを使用してチャネルにデータを送信する必要があります。

CI/CDジョブの実行

前提条件

  • 少なくともプロジェクトの開発者ロールを持っている必要があります。

CI/CDジョブはチャットからデフォルトブランチで実行できます。CI/CD ジョブを実行するには、次のようにします:

  • チャットクライアントで、/<project-name> run <job name> <arguments> と入力します:

    • <project-name> はプロジェクト名です。
    • <job name> は実行するCI/CDジョブの名前です。
    • <arguments> はCI/CDジョブに渡す引数です。

ChatOpsは指定されたジョブのみを含むパイプラインをスケジュールします。その他のスラッシュコマンドも利用可能です。

ChatOpsからジョブを除外

ジョブがチャットから実行されないようにするには:

  • .gitlab-ci.yml で、ジョブをexcept: [chat] に設定してください。

ChatOpsリプライのカスタマイズ

ChatOpsは単一のコマンドでジョブの出力をリプライとしてチャネルに送信します。例えば、以下のジョブが実行されると、チャットのリプライはHello world となります:

stages:
- chatops

hello-world:
  stage: chatops
  rules:
    - if: $CI_PIPELINE_SOURCE == "chat"
  script:
    - echo "Hello World"

ジョブに複数のコマンドが含まれている場合、またはbefore_script が設定されている場合、ChatOps はコマンドとその出力をチャネルに送信します。コマンドはANSIカラーコードでラップされます。

つのコマンドの出力を選択的に返信するには、出力をchat_reply セクションに配置します。例えば、次のジョブは現在のディレクトリにあるファイルをリストします:

stages:
- chatops

ls:
  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"