问题陈述:考虑您经营一家软件公司。而且您有一个庞大的客户列表,他们经常使用您的软件。您将软件托管在Github上,以便其用户可以发送有关其中的错误的信息。您是团队中的首席开发人员,当用户在GitHub上提交问题时,您将如何设计一个在Slack上通知开发团队的系统?
GitHub是提供事件驱动的Webhooks的众多服务之一。这意味着,如果有人提出问题,Github将向开发人员指定的URL发送请求。为了确保如果有人在GitHub上提出问题,则会通知开发人员团队,并且问题不会在他们的收件箱中丢失。
我们可以使用Cloud Run托管新的Webhook目标。这意味着开发人员不必担心服务器,他们可以使用自己喜欢的语言和框架。
您首先要担心的是授权。如下所示:
Python3
@app.route("/" , methods = [ "POST" ])
def index():
make_request = request
signature = make_request.headers.get("X-Hub-Signature")
data = make_request.data
assert verify_signature(signature, data)
Python3
def verify_signature(signature, data):
expected = "sha1="
try:
secret = get_secret(PROJECT, SECRET, "1")
hashed = hmac.new(secret, data, sha1)
expected += hashed.hexdigest()
except Exception as error:
print("ERROR")
return hmac.compare_digest (signature)
Python3
def slack_message( isuue_title, issue_url):
message = format_msg(issue_title, issue_url)
Request = urllib.request.Request( SLACK_URL, data = message)
Request.add_header("Content-Type", "application/json")
urllib.request.urlopen(Request)
Webhook目标是公共URL,拥有该URL的任何人都可以向其发送任何内容。为确保您只处理有效的请求,可以使用共享机密。您将需要创建一个密钥并将一个副本放入GitHub配置中,然后使用Cloud Secret Manager安全地存储一个副本。根据您的需要,这些秘密如下所示:
$ SECRET = "$(python3 -c 'import secrets
print(secrets.token_hex(20))')"
$ echo - $SECRET | gloud beta secrets
create github-secret
--replication-policy = automatic
--data-file=-
来自GitHub的每个请求都经过签名,因此您可以使用密钥来验证签名,并且仅处理有效的请求。下面提供了泛型签名验证函数,它可能会根据您的验证要求而变化:
Python3
def verify_signature(signature, data):
expected = "sha1="
try:
secret = get_secret(PROJECT, SECRET, "1")
hashed = hmac.new(secret, data, sha1)
expected += hashed.hexdigest()
except Exception as error:
print("ERROR")
return hmac.compare_digest (signature)
现在,开发团队将能够安全地从GitHub接收事件,并且开发人员可以使用这些事件通过Slack API将消息发送到Slack。每次收到GitHub的有效请求时,开发人员都会编写一个函数,以将消息发送到团队的Slack频道。示例函数如下所示:
Python3
def slack_message( isuue_title, issue_url):
message = format_msg(issue_title, issue_url)
Request = urllib.request.Request( SLACK_URL, data = message)
Request.add_header("Content-Type", "application/json")
urllib.request.urlopen(Request)
您的团队将永远不会错过另一个问题。衡量团队完成一个问题所需的时间。您可以向Webhook添加另一个函数,以将任何问题事件流式传输到BigQuery,以便它可以轻松地围绕团队的问题绩效创建指标。完整的Webhook目标现在可以创建通知,触发操作并将数据流式传输到BigQuery中。