Надо отправлять сообщения в канал MS Teams из CI/CD через MS Graph API. Тo есть из bash-скрипта.
Немного пояснений:
Это происходит в интерактивном режиме в браузере.
Получаем нужные данные:
https://login.microsoftonline.com/{team_id}/oauth2/v2.0/authorize?client_id={client_id}&response_type=code&response_mode=query&scope=offline_access%20ChannelMessage.Send
https://localhost/myapp?code=1......&session_state=0021c0b9-68fb-6cd3-c0ce-49a54fd54a9a
так вот параметр code в этом URL и есть одноразовый authorization code, пригодный для получения токена.
Дальше все просто - получаем токены:
MS_GRAPH_API_TOKENS_JSON=`curl -s --location --request POST "https://login.microsoftonline.com/${MS_TENANT}/oauth2/v2.0/token" \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode "client_id=${MS_APPLICATION_ID}" \ --data-urlencode "code=${AUTHORIZATION_CODE}" \ --data-urlencode "scope=offline_access ChannelMessage.Send" \ --data-urlencode "http://localhost/myapp" \ --data-urlencode "grant_type=authorization_code" 2>/dev/null` MS_GRAPH_API_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk '{gsub(/\,/,"\n")}1' 2>/dev/null | grep access_token | cut -d':' -f2 | tr -cd '[:alnum:]._-'` MS_GRAPH_API_REFRESH_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk '{gsub(/\,/,"\n")}1' 2>/dev/null | grep refresh_token | cut -d':' -f2 | tr -cd '[:alnum:]._-'`
Тут MS_TENANT - это все тот же team_id или group_id - Это синонимичные значения в терминологии MS Teams.
Refresh Token - валиден 90 дней, но лучше его периодически обновлять, получая тот же JSON о свежими с токенами уже с помощью имеющегося refresh token:
MS_GRAPH_API_TOKENS_JSON=`curl -s --location --request POST "https://login.microsoftonline.com/${MS_TENANT}/oauth2/v2.0/token" \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode "client_id=${MS_APPLICATION_ID}" \ --data-urlencode 'scope=offline_access ChannelMessage.Send' \ --data-urlencode 'grant_type=refresh_token' \ --data-urlencode "refresh_token=${MS_GRAPH_API_REFRESH_TOKEN}" 2>/dev/null` MS_GRAPH_API_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk '{gsub(/\,/,"\n")}1' 2>/dev/null | grep access_token | cut -d':' -f2 | tr -cd '[:alnum:]._-'` MS_GRAPH_API_REFRESH_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk '{gsub(/\,/,"\n")}1' 2>/dev/null | grep refresh_token | cut -d':' -f2 | tr -cd '[:alnum:]._-'`
MESSAGE="{ \"body\": { \"contentType\": \"html\", \"content\": \"Hello World!\" } }" curl -s -X POST "https://graph.microsoft.com/v1.0/teams/${MS_TEAMS_GROUP_ID}/channels/${MS_TEAMS_CHANNEL_ID}/messages" \ -H "Authorization: Bearer ${MS_GRAPH_API_TOKEN}" \ -H "Content-Type: application/json" \ -d "${MESSAGE}"