如何从Microsoft Teams触发Jenkins任务(类似Slack操作方式)
在Microsoft Teams中通过出站Webhook触发Jenkins任务
核心实现逻辑
通过Teams出站Webhook接收聊天内的命令(如build/abort),借助一个中间服务解析命令并调用Jenkins API完成对应操作——因为Teams的请求格式无法直接适配Jenkins API,中间服务负责两者的转换和权限验证。
具体操作步骤
1. 配置Jenkins API访问权限
- 生成Jenkins API令牌:进入Jenkins个人中心→设置→API令牌,创建并保存令牌(后续调用API需要用)。
- 分配任务权限:在目标Jenkins任务的配置页面,通过权限矩阵给生成令牌的用户分配构建和终止构建的权限。
2. 创建Teams出站Webhook
- 打开目标Teams频道,点击右上角三个点→「连接到频道」,搜索「出站Webhook」并创建。
- 填写Webhook名称、上传图标,输入中间服务的公网接收地址,完成创建后保存系统生成的安全令牌(用于验证Teams请求的合法性)。
3. 开发中间服务(以Python Flask为例)
服务需完成三个核心动作:验证Teams请求、解析命令、调用Jenkins API。示例代码如下:
from flask import Flask, request, jsonify import requests from requests.auth import HTTPBasicAuth app = Flask(__name__) # 配置参数,替换为自己的实际信息 TEAMS_SECRET = "你的Teams出站Webhook安全令牌" JENKINS_URL = "你的Jenkins服务器地址" JENKINS_USER = "Jenkins用户名" JENKINS_TOKEN = "Jenkins API令牌" TARGET_JOB = "要操作的Jenkins任务名称" # 验证Teams请求合法性(生产环境请严格按微软文档实现签名验证) def check_teams_auth(request): incoming_token = request.headers.get("Authorization", "").split(" ")[-1] return incoming_token == TEAMS_SECRET # 触发Jenkins构建 def start_jenkins_build(): build_url = f"{JENKINS_URL}/job/{TARGET_JOB}/build" resp = requests.post(build_url, auth=HTTPBasicAuth(JENKINS_USER, JENKINS_TOKEN)) return resp.status_code == 201 # 终止Jenkins最新构建 def stop_jenkins_build(): # 获取最新构建号 build_info_url = f"{JENKINS_URL}/job/{TARGET_JOB}/lastBuild/api/json" build_data = requests.get(build_info_url, auth=HTTPBasicAuth(JENKINS_USER, JENKINS_TOKEN)).json() latest_build_num = build_data["number"] # 发送终止请求 abort_url = f"{JENKINS_URL}/job/{TARGET_JOB}/{latest_build_num}/stop" resp = requests.post(abort_url, auth=HTTPBasicAuth(JENKINS_USER, JENKINS_TOKEN)) return resp.status_code == 200 @app.route("/teams-jenkins-hook", methods=["POST"]) def handle_teams_command(): if not check_teams_auth(request): return jsonify({"text": "权限验证失败"}), 403 payload = request.json command = payload["text"].strip().lower() if command == "build": success = start_jenkins_build() reply_msg = "构建任务已启动" if success else "启动构建失败,请检查Jenkins配置" elif command == "abort": success = stop_jenkins_build() reply_msg = "最新构建已终止" if success else "终止构建失败,请确认任务状态" else: reply_msg = "未知命令,支持的命令:build(启动构建)、abort(终止最新构建)" # 返回Teams可识别的消息格式 return jsonify({ "type": "message", "text": reply_msg }) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)
4. 部署中间服务
- 将服务部署到公网可访问的服务器(如云服务器、Heroku等),确保端口对外开放。
- 测试服务:用Postman模拟Teams请求发送
build或abort命令,验证是否能正确调用Jenkins API。
5. 在Teams中测试命令
- 在配置了出站Webhook的频道中,输入
@你的Webhook名称 build或@你的Webhook名称 abort,即可触发对应Jenkins操作,服务会返回执行结果。
注意事项
- 生产环境必须严格实现Teams请求的签名验证,避免非法请求调用Jenkins。
- 可扩展命令逻辑,比如支持指定任务名称、传递构建参数,只需修改中间服务的命令解析和API调用部分。
- 若Jenkins在内网,需确保中间服务能通过反向代理或VPN访问Jenkins服务器。
内容的提问来源于stack exchange,提问作者Swara
相关产品推荐
相关产品推荐

