今年の春くらいに CircleCI の UI が新しくなったタイミングで、各プロジェクトで設定した Slack 通知用の設定ページはどこかにいってしまいました。

こんな画面でした。

以前の Chat Integration

各プロジェクトの設定ページによると、現在は Slack orb を使う必要があるそう。
例: https://app.circleci.com/settings/project/github/masutaka/example/slack

それはまあ移行すれば良いのですが、旧 UI で設定した Slack の Webhook URL を確認したくても出来ません。Slack orb に移行した場合に、旧 UI で設定した通知を無効にしてくれるのかも気になります。

CircleCI のサポートに聞いたところ、残念ながらそのような UI は用意されておらず、Slack orb に移行しても自動的な無効化はしてくれないそう。

マジすか・・・!

Undocumented API を使って無効化が必要とのこと。新 UI では確認も変更も削除もできないとのこと。それはさすがに困る人が多いんじゃないかなあ…?全部サポート対応するのかしら。

それはそれとして、この記事ではその Undocumented API を使って、旧 UI で設定した Slack Integration の確認と変更、削除のやり方をまとめます。説明しませんが、IRC も出来ると思います。

※ 9 月にサポートに聞いた時、「Undocumented API を使うのは構わないのだけど、やり方自体も Undocumented なのは変なのでヘルプページに書いて欲しい」と伝えたけど、書かれてないようなのでこの記事を書いています。

確認する

こんな感じです。CIRCLE_TOKEN は https://app.circleci.com/settings/user/tokens で作ります。

CIRCLE_TOKEN=xxxxxx
VCS=gh
ORG=masutaka
PROJECT=example

curl "https://circleci.com/api/v1.1/project/${VCS}/${ORG}/${PROJECT}/settings" \
  -X GET \
  -H 'Content-Type: application/json; charset=utf-8' \
  -H "Circle-Token: $CIRCLE_TOKEN" \
  | jq '{
    vcs_url: .vcs_url,
    slack_channel_override: .slack_channel_override,
    slack_channel: .slack_channel,
    slack_subdomain: .slack_subdomain,
    slack_api_token: .slack_api_token,
    slack_notify_prefs: .slack_notify_prefs,
    slack_webhook_url: .slack_webhook_url
  }'

このような結果を得られます。

{
  "vcs_url": "https://github.com/masutaka/example",
  "slack_channel_override": null,
  "slack_channel": null,
  "slack_subdomain": null,
  "slack_api_token": null,
  "slack_notify_prefs": null,
  "slack_webhook_url": "https://hooks.slack.com/services/*********/*********/************************"
}

変更する

PUT で変更します。

以下の例では slack_notify_prefs と slack_webhook_url を変更しています。ちなみに前述の画像にある “Fixed/Failed Only?” にチェックを入れた状態が “slack_notify_prefs”:“smart” みたいです。

CIRCLE_TOKEN=xxxxxx
VCS=gh
ORG=masutaka
PROJECT=example

curl "https://circleci.com/api/v1.1/project/${VCS}/${ORG}/${PROJECT}/settings" \
  -X PUT \
  -H 'Content-Type: application/json; charset=utf-8' \
  -H "Circle-Token: $CIRCLE_TOKEN" \
  --data-raw '{"slack_notify_prefs":"smart","slack_webhook_url":"https://hooks.slack.com/services/*********/*********/************************"}'

channel の変更は slack_channel の変更で良いと思いますが、おそらく slack_channel_override も指定も必要なはず。ただ、文字列で何を指定するのかは分かりませんでした。

場合によりますが、Slack Webhook URL に紐付いた channel を変えたほうが楽だと思います。

削除する

削除も PUT を使います。Slack 関係の設定をすべて初期化(?)する点が異なります。

CIRCLE_TOKEN=xxxxxx
VCS=gh
ORG=masutaka
PROJECT=example

curl "https://circleci.com/api/v1.1/project/${VCS}/${ORG}/${PROJECT}/settings" \
  -X PUT \
  -H 'Content-Type: application/json; charset=utf-8' \
  -H "Circle-Token: $CIRCLE_TOKEN" \
  --data-raw '{"slack_channel_override":"","slack_channel":null,"slack_subdomain":null,"slack_api_token":null,"slack_notify_prefs":null,"slack_webhook_url":""}'

おまけ

Slack Webhook URL が
https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZZZZ
だったら、Slack の設定ページは
https://slack.com/services/YYYYYYYYYYY
です。

https://example.slack.com/services/YYYYYYYYYYY
のように Slack の workspace 名を指定する必要はあるかもしれません。