コンテンツにスキップ

Slack と連携する

組織の Owner と Admin が、Actagate に Slack を接続するためのページです。 Slack なしで使える範囲を確認し、必要に応じて Bot をインストールしてメンバーを同期します。

申請、承認、実行、台帳は Web とメールで使えます。通知はメールで届き、メールには操作先へのリンクが入りますが、承認ボタンはありません。

Slack なしでは、チャットの :actagate: リアクションによる L0 スタンプ、/actagate declare による L1 宣言、Slack DM 通知、「Slack でログイン」を使えません。

承認の催促、エスカレーション、付与した権限の期限切れは、Slack がなくても Web が処理します。常駐の処理はなく、誰かが「承認」「申請」「台帳」「可観測性」を開いたときにまとめて実行します。「ホーム」を開いたときは、催促とエスカレーションだけを実行します。Slack がない組織では、催促はメールで届きます。

  1. Owner または Admin として「設定」(/ws/settings) を開きます。未連携の組織では「Slack 連携」に「未連携」と表示されます。
  2. 「連携すると使えるもの」を確認します。「承認カード・催促・完了通知の Slack DM」「チャットのスタンプ記録 (L0)」「宣言 (L1)」と、「Bot のインストール手順を見る」があり、「いま同期する」はありません。
Slack 連携
未連携のカードです。Bot の手順へのリンクがあり、同期ボタンはありません。

標準 Compose の db/migrate.sh で作った組織には slack_team_id があるため、Bot が動いていなくてもカードは「連携済み」になります。この表示だけでは Bot の稼働を確認できません。

この節は、マニフェストと配備の設定から書いた参照情報です。Slack ワークスペースでのインストールは、まだ実機で辿っていません。

作業するのは、Slack 側でアプリを作成・インストールできる人と、配備の環境変数を変更できる人です。マニフェストは apps/slack-bot/slack-manifest.json です。

項目 マニフェストと配備の設定
スラッシュコマンド /actagate。名前を SLACK_COMMAND_NAME と一致させる
接続方式 Socket Mode とインタラクティブ機能が有効
イベント reaction_added、app_home_opened
トークン Bot トークン (xoxb-)、App-level トークン (xapp-)、署名シークレットを使う
反映 環境変数を設定してから Bot と Web を再起動する。Bot 起動時の同期が、ワークスペースを組織へ結び付け、ユーザーグループとそのメンバーを取り込む

マニフェストのスコープは次のとおりです。

種類 スコープ
Bot commands, chat:write, reactions:read, channels:history, groups:history, im:history, users:read, users:read.email, usergroups:read, team:read, files:read
ユーザー openid, profile, email
設定先 環境変数と用途
Bot SLACK_BOT_TOKEN、SLACK_APP_TOKEN、SLACK_SIGNING_SECRET、DATABASE_URL が必須
Web SLACK_BOT_TOKEN を手動同期と招待時のメール照合に使う
DB の初期化 db/migrate.sh は SLACK_TEAM_ID と SLACK_WORKSPACE_NAME を必須とする
Web の Slack ログイン SLACK_CLIENT_ID、SLACK_CLIENT_SECRET、SLACK_OIDC_REDIRECT_URI を設定する。リダイレクト URL は Slack アプリの設定と一致させ、localhost 以外は HTTPS にする

users:read.email は users.info の profile.email を読むために使います。同期では既存メンバーとの照合に使い、招待ではメールがない Slack 由来の行と招待先アドレスを照合します。一致すれば、新しい行を作らずに既存の行へメールを入れます。

「いま同期する」で取り込む範囲

Section titled “「いま同期する」で取り込む範囲”

「いま同期する」を実行できるのは Owner と Admin です。連携済みのカードには「ワークスペース」「連携日時」「最終同期」と、このボタンがあります。

[画面: Slack 連携 (連携済み)]

対象は Slack のユーザーグループに入っている人だけです。users.list は呼ばず、グループのメンバーを users.info で取得します。どのグループにも入っていない人は、このボタンでは取り込まれません。

照合結果 同期する内容
同じ Slack ID の行がある その行を更新する
同じ Slack ID がなく、同じメールで Slack ID が空の行がある 大文字・小文字を区別せず照合し、既存の行に Slack ID を入れる。行は増えない
どちらもない 新しいメンバーの行を作る

同期のたびに、表示名、メール、Slack の管理者・オーナーのフラグ、言語、部門を Slack の値で更新します。表示名と部門は、Slack 側の値がない場合に既存値を残します。部門には Slack プロフィールの肩書きを使います。

言語は毎回上書きします。日本語でも英語でもない言語設定のときや、Slack 側に値がないときは English になります。そのため、Slack と紐づいたメンバーが「ホーム」で選んだ言語は、次の同期で Slack 側の言語に戻ります。

Slack のユーザーグループは承認グループとして取り込みます。Web で作ったグループは上書きしません。Bot 起動時にも組織の同期を行います。次の操作では、関係する人だけを同期します。

操作 同期する人
スラッシュコマンド 実行した人。/actagate setup @上長 では指定した上長も同期する
:actagate: のリアクション リアクションした人と、メッセージを書いた人。ほかの絵文字では同期しない
App Home を開く 開いた人

同期の成功メッセージは「Slack と同期しました。」だけで、件数は表示しません。失敗時は「Slack との同期に失敗しました。SLACK_BOT_TOKEN の設定と Bot の権限を確認してください。」です。ユーザーグループの取得に失敗しても処理を続け、成功メッセージになる場合があります。

メールと Web で始めた組織にも、後から接続できます。メールで登録した人は、Slack のメールアドレスを同じにしておきます。この節も設定とコードから書いた参照情報で、実際のワークスペースでは辿っていません。

接続には、上の節の Bot の必須環境変数と、Web の SLACK_BOT_TOKEN が必要です。Bot が起動すると、組織の同期 (syncOrganization) が次の規則でワークスペースを結び付けます。

組織の状態 Bot 起動時の同期の結果
DB の組織が 1 件だけで、slack_team_id が空 その組織にワークスペースを結び付ける
上記以外 (組織が複数ある、または slack_team_id が入っている) ワークスペースの team ID で組織を探し、なければ新しい組織を作る

結び付けると、/setup で入力した組織名は Slack ワークスペースの名前に置き換わります。「いま同期する」でも、組織名をワークスペースの名前で更新します。

「いま同期する」の対象は、ユーザーグループに入っている人だけです。メールが一致して Slack ID が空の既存メンバーは紐づき、一致する行がない人は新しいメンバーになります。

手動同期は、組織が別の Slack ワークスペースに結び付いている場合は失敗します。連携後は Slack ID がある人への通知が Slack DM に切り替わり、Slack ID がない人には引き続きメールが届きます。「Slack でログイン」は登録済みの Slack ID が必要で、ログインだけでは新しいメンバーを作りません。