# 服务集成

本平台本身是一个涵盖面非常广的大型分布式平台,但是整个企业研发场景可能还会涉及其他的第三方的服务和平台,服务集成功能就是为解决此类问题提供的功能。
点击左侧“服务集成”菜单即可进入到服务集成功能界面。
服务集成

# 服务使用权限

服务的使用权限分为企业内公用和保密。服务的连接信息配置好以后,会保存在本系统中,当其他用户需要使用该服务的时候通过本系统鉴权。
企业内公用的服务对于企业内的所有成员开放,保密服务只有服务配置中添加的成员可用。

# Docker镜像源

本系统本身已经提供了内置的Docker制品库和Docker镜像库功能,所以除非有特殊情况,一般情况下无需配置第三方的Docker镜像源。
第三方Docker镜像源在配置后可以在需要Docker镜像的场景下使用:例如流水线的docker镜像执行器插件配置、容器部署系统的部署模板配置。
详情请参考流水线 Docker插件及容器部署系统相关章节。

# SonarQube

Sonarqube服务器配置后,目前可以在流水线的SonarQube扫描服务插件中使用。
下图的Sonarqube服务添加界面中的Token是Sonarqube服务的用户token,不是本系统的用户Token,请勿混淆。

# Webhook

# 作用

webhook的作用是当系统发生某种事件后,调用一个预先设置好的web API,用以进行后续其他系统的自动化操作。
用户可以在Webhook功能菜单下添加和管理webhook.
webhook

# 权限

用户只能管理自己创建的webhook, 企业管理员可以编辑所有webhook。
创建、删除和编辑webhook时还必须拥有对目标实体的管理权限才能对该目标实体的webhook进行操作。
例如:用户zhang必须拥有对代码库a/b的管理权限,才能给代码库a/b新建、删除和修改webhook。

# 创建

点击添加按钮即可添加webhook,并可以对webhook的配置进行设置。
添加webhook

# 认证类型

  • 无认证: 事件触发后,直接调用服务URL的API

  • 接口令牌:有些web API为了安全,不允许随便调用,调用时必须使用令牌。
    令牌由web API方提供。接口令牌在调用web API时,会放在header的“X-DevOps-Token”字段中。
    接口令牌如果不重新申请,则一直是固定不变的。如果数据传输过程中被拦截,则令牌会被窃取盗用。

  • 签名密钥: 有些web API的安全级别较高,使用静态的接口令牌无法满足其安全要求。
    此时这些web API提供了更安全的签名密钥功能。签名密钥本身也是固定的,也由web API方提供。
    签名密钥的工作原理分为两种模式:
    ①web API方提供加密算法:本系统按照web API方提供的加密算法,在发送消息时,将固定的签名密钥加盐后(通常是把时间戳作为盐)按照加密算法生成一个动态的密钥,
    本系统在发送http请求时,将动态密钥和盐放在http的header或者URL中(按web API方的要求定)。这种方式一般web API方是大厂,本系统必须提前支持。
    ②普通web API, 由本系统提供加密算法:本系统在发送消息时,将固定的签名密钥加盐(本系统用的时间戳)后按照加密算法生成一个动态的密钥,
    将动态密钥和盐都放在http的header中。动态密钥放在“X-DevOps-Token”字段,时间戳放在“X-DevOps-Timestamp”字段。

# 密钥加密算法

  • 签名参数:
    Timestamp: 当前时间戳,单位是毫秒,与请求调用时间误差不能超过1小时,请求时需和密钥一并发送
    Secret: 密钥

  • 加密方法:
    Step1:把timestamp+"\n"+密钥当做签名字符串,使用HmacSHA256算法计算签名
    Step2: 把Step1中得到的签名和Timestamp放在本系统 http请求header的“X-One-Token”字段和“X-One-Timestamp”字段。
    Setp3:对上述得到的结果进行 urlEncode,得到最终的签名(需要使用UTF-8字符集)

  • 签名算法示例(Java):

Long timestamp = System.currentTimeMillis();
String stringToSign = timestamp + "\n" + secret;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
return URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
  • 签名计算代码示例(Python):
#python 2.7
import time
import hmac
import hashlib
import base64
import urllib
timestamp = long(round(time.time() * 1000))
secret = 'this is secret'
secret_enc = bytes(secret).encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = bytes(string_to_sign).encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)

# 查看webhook配置

企业成员均可查看webhook基本信息,但是无法查看到详细配置,服务URL也只能看到打码后的信息。

# 查看历史

企业成员均可查看调用历史, 但是只有对该webhook下的事件实体有管理权限的用户才可以查看调用详情。

# 编辑

只有企业管理员或者webhook的创建者可以编辑webhook,进入查看配置界面后,如果用户具有编辑权限,
则会在基本信息区域出现编辑按钮,点击进入编辑模式。事件配置区域如果具有编辑权限,则可以直接进行编辑。

# 删除

只有企业管理员或者webhook的创建者可以删除webhook

# 数据格式

不同的事件,数据格式不同,用户可以通过查看调用详情按钮查看具体数据格式。
webhook数据

# 添加钉钉机器人

钉钉在群聊功能中提供了「智能群助手」功能。通过 WebHook,可以在钉钉中添加自定义的机器人实现自动通知。

  • 添加路径【钉钉要求使用PC版添加】:
    钉钉群设置->职能群助手->添加机器人->自定义
    添加钉钉机器人

  • 设置:
    在上文的添加过程中,可以获得一个形如 https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxx (opens new window) 的 WebHook 请求地址,
    将这个地址添加到平台上,即可完成对 WebHook 的设置。

  • 安全设置:
    钉钉机器人在 WebHook 上支持了「自定义关键字」、「加签(签名)」、「IP 地址(段)」,用于增强机器人接受请求的安全性,防止恶意请求。
    自定义关键字是指只有包含指定的自定义关键字的 WebHook 请求才会触发机器人,最多可以定义 10 个。
    钉钉关键字
    加签通过设置签名,可以支持钉钉机器人的请求签名,以获得更高的安全性。
    打开钉钉的加签后,在添加到本系统的webhook中,要使用“签名密钥”的加密方式,将下图中的密钥添加到webhook的签名密钥中。
    钉钉密钥
    IP地址限制打开后,可限制只有本系统服务器的IP才能向钉钉群发webhook消息

# 添加企业微信机器人

企业微信在内部群聊中提供了「群机器人」功能。通过 WebHook,可以在企业微信中添加自定义的机器人实现自动通知。

  • 添加路径:
    在企业微信群聊中,通过聊天窗口在内部群右键菜单选择 添加群机器人->新创建一个机器人,为机器人设置一个头像和名称,点击「添加」后可以获得一个 WebHook 地址,
    关闭窗口即可完成企业微信内部群微信机器人的添加。目前包含外部联系人的群聊不支持添加机器人。
    微信机器人

  • 设置: 和钉钉机器人设置方法类似,不再赘述。

# 添加飞书机器人

飞书支持在群聊中添加一个自定义机器人,通过服务端调用 webhook 地址,即可将研发平台的通知消息即时推送到群聊中。飞书也提供了自定义关键词、IP白名单和签名
三种维度的安全配置,控制 webhook 的调用范围。

  • 第一步:邀请自定义机器人入群,进入你的目标群组,打开会话设置,找到群机器人,并点击添加机器人,选择自定义机器人加入群聊。

  • 第二步:配置 webhook,你会获取该机器人的 webhook 地址,格式如下:
    https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxx

  • 第三步:添加安全设置,如果未妥善保管webhook地址,可能存在webhook地址泄露后,被恶意开发者调用,发送垃圾信息的风险。
    1.自定义关键词
    最多设置 10 个关键词。设定后,只有包含至少一个关键词的消息才会被发送。如,将自定义关键词设为“应用报警”和“项目更新”后,自定义机器人
    发送的消息至少包含其中一个词,才会被发送到群聊。

    2. IP 白名单
    最多设置 10 个 IP 地址或地址段。设定后,只处理来自所设 IP 地址范围的请求。支持段输入,如 123.12.1.* 或 123.1.1.1/24

    3. 签名校验
    设定后,发送的请求是需要签名验证来保障来源可信。签名的算法:把 timestamp + "\n" + 密钥 当做签名字符串,使用 HmacSHA256 算法计算
    签名,再进行 Base64 编码

  • 第四步:在研发平台的【集成服务】-【WebHook】添加Webhook页面,填写飞书机器人的相关服务器URL和认证类型

# 添加其他机器人

和添加钉钉机器人设置方法类似,不再赘述。

# Jira

Jira的配置方法和其他服务集成类似,配置完相关的URL、用户密码及权限后即可使用。
具体使用场景:代码库设置->关联设置中可实现代码提交自动和Jira卡片关联,并且可在Jira的卡片详情中看到代码提交信息。
添加jira服务到研发平台,注意是服务的地址是http还是https。
Jira
在代码库中关联刚加入的Jira以及Jira中的项目。
Jira
修改代码,提交时填写jira项目中卡片编号。
Jira
在代码库历史中可以点击链接直接跳转至Jira关联的卡片页面。
Jira
在Jira的卡片下有关联的代码库的链接,点击可直接跳转至代码库。
Jira

# Jenkins

首先在服务集成中的jenkins列表页点”HPI包下载”,将HPI文件包下载下来,然后再您搭建的jenkins服务器中将其作为插件上传。兼容版本Jenkins2.138.4--2.350

在上传之前需要在本平台添加一个jenkins的服务,添加后点击右侧的查看页面会有token,将token复制。
服务端token如下图所示
Jenkins

在配置插件页面根据页面提示配置服务地址、用户名和密码,上传one-agent.hpi包并提交。
Jenkins

配置完成后,ManageJenkins页面最下方显示one-agent插件,配置相关信息并保存。服务端地址为访问效能平台的地址,服务端token为上述查看页面的token,jenkins主机地址为jenkins访问url,如有反向代理需要填写为代理地址。
</br>注意:这里要使用对应账户生成的API token,示例用户为jenkins。配置完成后重启jenkins
jenkins

配置完成后即可在流水线中使用jenkins的job构建,在新增任务中选择jenkins插件。
jenkins

jenkins master的列表为您在服务集成中添加的jenkins服务的列表。Jenkins job为您选择的jenkins服务中的job列表。
jenins